3

我正在尝试评估一种定制的CMS. devoloper 用于抵御SQL攻击的保护措施是:

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

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

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

4

3 回答 3

8

不。输入一些 UTF8 字符,这会导致代码乱码或被转义。

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

于 2012-09-26T16:25:28.487 回答
6
str_replace("'", "\'", $_POST[$variable]);

是的,这很脆弱。

很简单,反斜杠不会被转义,因此您可以使用反斜杠来分隔字符串文字以屏蔽引号:hello\' OR 1 ---> 'hello\\' OR 1 --'

空值也不会被转义,可能会导致问题。

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

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

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

于 2012-09-26T16:55:00.470 回答
1

SQL 注入可以有多种形式。

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

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

SELECT * FROM table
WHERE ID = 1

可以变成总是匹配的东西

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

使用供应商特定的转义函数或准备好的语句是要走的路。

于 2012-09-26T16:32:09.203 回答