php - PHP SQL 错误帮助和安全改进
问题描述
我的网站上有一些代码可以检查数据库中是否存在输入字段的输入值,然后尽可能简单地输出结果。
不幸的是,如果发送了错误的值,它不会给我“未找到结果”。1 - 我该如何解决这个问题?没有错误消息或其他任何内容,只是一个白页。
2 - 另一个问题:公众是否可以使用这种类型的输入字段检查来获取我的数据库登录凭据,其中包含单独的 search.php,登录凭据位于文件顶部?
3 - 如何使用我的 php 代码保护此检查免受任何主要攻击?我认为 SQL 注入已经被阻止了。
谢谢
索引.php:
<form action="search.php" method="Post">
<input type="text" name="query" />
<input type="submit" value="Search" />
</form>
搜索.php:
<?php
$mydatabase=mysqli_connect("localhost", "root", "") or die("Error connecting to database: ".mysql_error());
mysqli_select_db($mydatabase, "mydb") or die(mysql_error());
$query = $_POST['query'];
$min_length = 1;
if(strlen($query) >= $min_length){
$query = htmlspecialchars($query);
$query = mysqli_real_escape_string($mydatabase, $query);
$raw_results = mysqli_query($mydatabase, "SELECT * FROM mytable WHERE (`title` LIKE '%".$query."%')") or die("mysql_error()");
while($results = mysqli_fetch_array($raw_results)){
if (empty($results)) {
echo 'No results found';
} else {
echo "<p><h3>".$results['title']."</h3>".$results['name']."</p>";
}
}
} else{
echo "Minimum length is ".$min_length;
}
?>
解决方案
问题 1 的答案mysqli_fetch_array
的手册页提醒您,如果结果集中没有行,它将返回。如果设置为您的循环将永远不会运行,这就是为什么您永远不会看到“未找到结果”消息的原因。您需要在循环外进行空检查或将其切换到do-while循环。NULL
$results
NULL
while
while
对问题 2 的回答
我不确定我是否完全理解您的要求,但只要您的凭据位于.php
文件内的 PHP 标记内,任何人都不应公开看到这些。*
*这个说法肯定有例外。最佳实践是为您的凭据使用环境变量。至少从一个单独的文件加载全局变量,以防万一原始 PHP 文件暴露给用户。在这种情况下,他们看到的只是环境变量或全局变量,而不是您的实际凭据。
对问题 3 的回答
我认为您使用htmlspecialchars
andmysqli_real_escape_string
是保护数据库的良好开端,但您确实应该阅读这些功能可能引入的缺点。我建议调查准备好的陈述。PHP 手册包含大量信息,但这个SO Answer也做得很好;如果您错过了我链接到另一个答案的链接的答案,您也会发现它非常有帮助。
推荐阅读
- json - 我需要帮助在 React Native 中使用 Flatlist 显示来自 Steam API 的数据
- python - 数组中多行的 np.linalg.norm
- gradle - Gradle Exec 现在抛出“错误=2,没有这样的文件或目录”
- php - php上传的mp3文件损坏
- html - Laravel /刀片如何将选定的值插入数据库
- asp.net - 反序列化后显示json数据的问题
- r - R:有条件地将数据从列复制到行
- c# - 如何遍历文件夹并更新 XML 文件
- javascript - 使用嵌套对象的默认对象解构
- php - 如何限制新用户角色只能访问常规帖子,而不是自定义帖子类型?