【问题标题】:What characters are NOT escaped with a mysqli prepared statement?mysqli 准备好的语句不会转义哪些字符?
【发布时间】:2011-03-03 14:17:39
【问题描述】:

我正在尝试强化我的一些 PHP 代码并使用 mysqli 准备好的语句来更好地验证用户输入并防止注入攻击。

我离开了 mysqli_real_escape_string as it does not escape % and _。但是,当我将查询创建为 mysqli 准备语句时,仍然存在相同的缺陷。该查询根据用户名提取用户盐值。我会为密码和其他查找做类似的事情。

代码:

$db = new sitedatalayer();

if ($stmt = $db->_conn->prepare("SELECT `salt` FROM admins WHERE `username` LIKE ? LIMIT 1")) {

  $stmt->bind_param('s', $username);
  $stmt->execute();
  $stmt->bind_result($salt);


  while ($stmt->fetch()) { 
    printf("%s\n", $salt);
  } 

  $stmt->close();    

}

else return false;
  • 我的陈述是否正确?
  • 如果我是什么其他字符需要检查?还有哪些缺陷?
  • 进行这些类型的选择的最佳做法是什么?

谢谢,

【问题讨论】:

  • 为什么是 LIKE 子句而不是精确比较 =
  • 忽略 LIKE-hating,就“注入”而言,使用绑定变量(只要您专门使用它们)是不可能从 var 中转义的,因此使用时可以防止注入其他查询的mysqli。其他人已经讨论了 LIKE 上的语义问题。

标签: php security mysqli prepared-statement


【解决方案1】:

这是一个使用 LIKE 来匹配用户名的人,而不是转义函数。

而且,仅供参考:原生准备好的语句不会转义任何东西

【讨论】:

  • ADODB 和 PDO for PHP 使用 mysql_real_escape_string(),如果你不相信我,看看代码,我有。我应该给你一个-1,但我想我已经给了你足够的时间:p
  • 好吧,我仍然关心不正确的陈述prepared statements do not escape anything.
  • 为了记录,我没有给你-1。
【解决方案2】:

这些是准备好的语句没有转义的字符 % _ \

【讨论】:

    【解决方案3】:

    您在这里混淆了两个不同级别的评估。

    LIKE 运算符接受一个字符串并将任何'%''_' 作为占位符进行计算。

    查询参数的作用只是将值(例如字符串)逐字带到数据库引擎,因此它们不会被误认为是 SQL 代码。他们不关心LIKE 运算符如何特殊使用他们刚刚传输的字符串中的某些字符。一切都按照这里的设计工作。

    如果您想要完全匹配,请使用 = 运算符代替 LIKE

    如果您必须使用LIKE(即使您的LIMIT 1 此处另有说明),请事先自行escape the the special characters accordingly

    【讨论】:

    • 如果它们是逐字放置的,那么为什么要使用准备好的语句而不是直接将 $username 插入字符串?
    • @barfoon:正如我所说,参数在“SQL 字符串文字”级别上起作用。他们确保字符串文字不会中断。 LIKE 工作的抽象级别更高,因为它根据自己的规则解释字符串 contents。参数在这里不再起作用,它们所做的只是确保您的 SQL 语句不会中断。
    【解决方案4】:

    % 不是天生有害的字符。

    问题是:你为什么首先使用LIKE?是否有任何情况您不需要精确用户名匹配?

    查询应该是:

    SELECT `salt` FROM admins WHERE `username` = ? LIMIT 1
    

    在这种情况下,如果我输入 %bsmith,我的用户名必须是(字面意思)“%bsmith”才能找到匹配项。

    【讨论】:

    • 谢谢 - 我之前尝试使用 = 符号,但我的查询无效。一定是在其他地方出错了。现在可以使用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2023-04-09
    • 2014-05-18
    相关资源
    最近更新 更多