【发布时间】: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