准备好的语句是否完全保护我的网站免受MySQL注入?

时间:2010-09-19 16:22:13

标签: php sql mysqli code-injection prepared-statement

我正在使用预处理语句和MySQLi查询以防止注入攻击。准备好的语句是否完全不需要mysql_real_escape_string?在保护我的网站时还有什么我应该考虑的吗?

2 个答案:

答案 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查询: 准备好的语句只能使数据安全 因此,您必须处理查询的动态非数据部分,例如字段名称,运算符等。准备好的语句对您没有帮助。