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;

}

?>


沧海一幻觉
浏览 73回答 1
1回答

元芳怎么了

问题 1 的答案mysqli_fetch_array的手册页提醒您,如果结果集中没有行,它将返回。If&nbsp;gets set to&nbsp;your&nbsp;loop will never run and that is why you never see your&nbsp;No results found消息。您需要在循环外进行空检查或将其切换到do-while循环。NULL$resultsNULLwhilewhile问题 2 的答案我不确定我是否完全理解您的要求,但只要您的凭据位于.php文件内的 PHP 标记内,就没有人应该能够公开看到这些。**此声明肯定有例外。最佳做法是为您的凭据使用环境变量。至少从一个单独的文件加载全局变量,以防原始 PHP 文件暴露给用户。在这种情况下,他们只会看到环境变量或全局变量,而不是您的实际凭据。问题 3 的答案我认为您使用htmlspecialchars和mysqli_real_escape_string是保护数据库的良好开端,但您确实应该仔细阅读这些函数可能带来的缺点。我伤口建议调查准备好的陈述。PHP 手册提供了丰富的信息,但是这个SO Answer也做得很好;如果您错过了我链接到另一个答案的链接的答案,您也会发现它非常有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP