我正在努力加強我的一些PHP代碼,並使用mysqli準備好的語句來更好地驗證用戶輸入並防止注入攻擊。哪些字符不能用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'子句,而不是一個確切的比較'='? – BoltClock 2010-06-14 16:05:01
忽略LIKE-hating,就「注入」而言,使用綁定變量(只要你專門使用它們)就不可能退出var,所以使用mysqli阻止注入其他查詢。其他人已經涵蓋了LIKE的語義問題。 – 2010-06-14 16:09:10