首页 > 解决方案 > 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;
}
?>

标签: phpmysqlsqlsecurity

解决方案


问题 1 的答案mysqli_fetch_array
的手册页提醒您,如果结果集中没有行,它将返回。如果设置为您的循环将永远不会运行,这就是为什么您永远不会看到“未找到结果”消息的原因。您需要在循环外进行空检查或将其切换到do-while循环。NULL$resultsNULLwhilewhile

对问题 2 的回答
我不确定我是否完全理解您的要求,但只要您的凭据位于.php文件内的 PHP 标记内,任何人都不应公开看到这些。*

*这个说法肯定有例外。最佳实践是为您的凭据使用环境变量。至少从一个单独的文件加载全局变量,以防万一原始 PHP 文件暴露给用户。在这种情况下,他们看到的只是环境变量或全局变量,而不是您的实际凭据。

对问题 3 的回答
我认为您使用htmlspecialcharsandmysqli_real_escape_string是保护数据库的良好开端,但您确实应该阅读这些功能可能引入的缺点。我建议调查准备好的陈述。PHP 手册包含大量信息,但这个SO Answer也做得很好;如果您错过了我链接到另一个答案的链接的答案,您也会发现它非常有帮助。


推荐阅读