我的网站上有一些代码,用于检查数据库中是否存在输入字段的输入值,然后尽可能简单地输出结果。
不幸的是,如果发送了错误的值,它不会给我“未找到结果”。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的手册页提醒您,NULL
如果结果集中没有行,它将返回。如果$results
设置为NULL
您的while
循环将永远不会运行,这就是为什么您永远不会看到“未找到结果”消息的原因。您需要在while
循环外进行空检查或将其切换到do-while循环。
问题 2 的答案
我不确定我是否完全理解您的要求,但只要您的凭据位于.php
文件内的 PHP 标记内,任何人都不应公开看到这些内容。*
*这种说法肯定有例外。最佳做法是为您的凭据使用环境变量。至少从一个单独的文件加载全局变量,以防原始 PHP 文件暴露给用户。在这种情况下,他们只会看到环境变量或全局变量,而不是您的实际凭据。
问题 3 的答案
我认为您使用htmlspecialchars
和mysqli_real_escape_string
是保护数据库的良好开端,但您确实应该仔细阅读这些功能可能带来的缺点。我建议查看准备好的声明。在PHP手册是一个丰富的信息,但该SO答案做了伟大的工作,太; 如果您错过了我链接到另一个答案的链接的答案,您也会发现它非常有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句