我正在使用预处理语句和MySQLi查询以防止注入攻击。准备好的语句是否完全不需要mysql_real_escape_string?在保护我的网站时还有什么我应该考虑的吗?
答案 0 :(得分:5)
只要您正确使用准备好的陈述,他们就会。您必须确保绑定所有外部变量,而不是直接将它们放在查询中。
例如
$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=" . $name);
此语句正在准备中,但它不使用其中一种绑定方法,因此它没有任何好处。它仍然容易受到SQL注入的攻击。</ p>
要解决这个问题,请务必绑定所有内容......
$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
$stmt->bind_param("s", $city);
答案 1 :(得分:1)
我正在使用预备语句和MySQLi来查询我的查询,以防止注入攻击。
不要这样做。不要使用预准备语句来防范任何事情。这不是准备好的陈述。它只是让你的查询在语法上正确。而且,作为副作用,语法正确的查询也不会受到任何攻击 因此,只需使用它将数据放入查询中。
预备语句是否完全不需要mysql_real_escape_string?
mysql_real_escape_string方面的错误。此功能不能保护您免受任何伤害。如果您只是将此功能应用于您的数据,则不会使其“安全”。此函数仅适用于引用的字符串 虽然是,但使用预准备语句会使此函数过时,以及其他纯SQL组合规则。它实际上完成了你认为mysql_real_escape_string所做的工作。它确实使任何数据安全(对于SQL)。
在保护我的网站时还有其他什么需要考虑吗?
不确定。
不是谈论整个城市 - 这是另一个太过广泛的问题,而是SQL查询:
准备好的语句只能使数据安全
因此,您必须处理查询的动态非数据部分,例如字段名称,运算符等。准备好的语句对您没有帮助。