【问题标题】:Entering single quotes in search field results in mysqli_num_rows error在搜索字段中输入单引号会导致 mysqli_num_rows 错误
【发布时间】:2015-04-18 07:35:55
【问题描述】:

我一直在搞乱我的搜索页面。我添加了mysqli_real_escape_stringstrip_tags,据我所知,一切正常,应该是安全的。

我只是想在搜索表单中输入随机符号,看看在采取这些安全措施的情况下是否仍然可以找到我的所有数据库条目。一切都好,除非我搜索单引号 (')。

这给了我“mysqli_num_rows() 期望参数 1 是 mysqli_result, boolean given”错误。有很多关于该错误的信息,我知道如何解决它(至少我是这么认为的)。但是,在这种特殊情况下,我不知道:/

代码:

ini_set('display_errors', 1);
$search = $_GET ['q'];
$conn = mysqli_connect("localhost", "root", "","release");
$search = mysqli_real_escape_string($conn, "$search");
$search = stripslashes(strip_tags(trim("$search")));

$query = mysqli_query($conn,"SELECT * FROM game WHERE game_name LIKE '%". $search ."%' ORDER BY game_release");
$count = mysqli_num_rows($query);

【问题讨论】:

标签: php single-quotes


【解决方案1】:

您应该在最后使用mysqli_real_escape_string,就在您将变量注入数据库查询之前,尽管首选语句是准备好的。就我而言,更容易。

您当前的问题不是您不能仅使用mysqli_real_escape_string,而是您使用的功能的组合和顺序:

$search = mysqli_real_escape_string($conn, "$search");
$search = stripslashes(strip_tags(trim("$search")));

您正在转义第一行中 mysql 值的特殊字符。这是通过添加斜线来完成的。

在第二行中,您删除斜线,使用 mysqli_real_escape_string 撤消转义,并使您的查询容易受到 sql 注入。

就 sql 语句的安全性而言,mysqli_real_escape_string 就足够了,因此您只需要一个准备好的语句或:

$search = mysqli_real_escape_string($conn, $search);

其余部分是不必要的,但如果你想以任何方式这样做(例如,如果不允许使用标签),你应该将该行移到最后转义行的上方:

$search = stripslashes(strip_tags(trim($search)));
$search = mysqli_real_escape_string($conn, $search);

// and now run your query without further manipulation:
$query = mysqli_query(...);

【讨论】:

  • 感谢Jeroen的清晰解释。收到这样一个构建的答案真的对我有很大帮助!
猜你喜欢
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2017-06-16
  • 1970-01-01
  • 2019-04-18
相关资源
最近更新 更多