这个字符串替换是否足以抵御SQL注入攻击?

时间:2012-09-26 16:23:13

标签: php mysql security code-injection

我正在尝试评估一种自定义的CMS。 devoloper用于对SQL攻击的保护是:

 str_replace("'", "\'", $_POST[$variable]);

这是否足够好,或者有办法利用它来注入SQL代码?

PS:我知道标准方式是使用mysql_real_escape_string(),但我试图了解代码的一般质量。

3 个答案:

答案 0 :(得分:8)

没有。抛出一些UTF8字符,这会使代码乱码或被转义。

使用mysqli / PDO,如果必须,请使用mysql_real_escape_string。

答案 1 :(得分:6)

str_replace("'", "\'", $_POST[$variable]);

是的,这很脆弱。

通常,反斜杠不会被转义,因此您可以使用反斜杠来掩盖引号:hello\' OR 1 -- - > 'hello\\' OR 1 --'

Null也没有被转义,可能会导致问题。

如果正在使用东亚字符集,则可以使用多字节序列来掩盖引号。 (注意这不是UTF-8的情况,因为UTF-8不允许'作为尾随字节。)

此转义格式也仅适用于MySQL。如果使用任何其他数据库,或者在MySQL中使用符合ANSI标准的字符串文字选项,则它将无效,因为标准的转义是将引号加倍,而不是反斜杠。

代码没用。充其量它表明有人知道SQL注入存在,但它没有真正理解实际问题。

答案 2 :(得分:1)

SQL注入可以有多种形式。

如果有一个查询在数字字段上执行where子句(想想PIN码),可以很容易地注入它。

在用户输入的号码上寻找匹配的无害的东西:

SELECT * FROM table
WHERE ID = 1

可以转入始终匹配的内容

SELECT * FROM table
WHERE ID = 1 OR 1 = 1

使用特定于供应商的转义函数或预处理语句是可行的方法。

相关问题