我正在努力强化我的一些PHP代码并使用MysqLi预处理语句来更好地验证用户输入并防止注入攻击.
我转而离开MysqLi_real_escape_string as it does not escape % and _.但是,当我创建我的查询作为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;
>我是否正确地撰写了声明?
>如果我需要检查其他角色?还有哪些其他缺陷?
>做这些选择的最佳做法是什么?
谢谢,
解决方法:
%不是一种固有的有害特征.
问题是:你为什么首先使用LIKE?在任何情况下您都不需要完全匹配用户名吗?
查询应该简单:
SELECT `salt` FROM admins WHERE `username` = ? LIMIT 1