使用mysqli预处理语句不会转义哪些字符?

bar*_*oon 4 php security mysqli prepared-statement

我正在努力强化我的一些PHP代码并使用mysqli预处理语句来更好地验证用户输入并防止注入攻击.

我切断了mysqli_real_escape_string,因为它没有转义%和_.但是,当我将查询创建为mysqli预处理语句时,仍然存在相同的缺陷.该查询根据用户名提取用户salt值.我会为密码和其他查找做类似的事情.

码:

$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;
Run Code Online (Sandbox Code Playgroud)
  • 我正确地撰写了这个陈述吗?
  • 如果我需要检查其他角色?还有哪些其他缺陷?
  • 做这些选择的最佳做法是什么?

谢谢,

Vot*_*ple 8

% 不是一个固有的有害品质.

问题是:你为什么一开始使用a LIKE?在任何情况下您都不需要完全匹配用户名吗?

查询应该简单:

SELECT `salt` FROM admins WHERE `username` = ? LIMIT 1
Run Code Online (Sandbox Code Playgroud)

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