我正在尝试评估一种定制的CMS
. devoloper 用于抵御SQL
攻击的保护措施是:
str_replace("'", "\'", $_POST[$variable]);
这是否足够好,或者有办法利用它来注入SQL
代码?
PS:我知道标准方法是 using mysql_real_escape_string()
,但我试图了解代码的一般质量。
我正在尝试评估一种定制的CMS
. devoloper 用于抵御SQL
攻击的保护措施是:
str_replace("'", "\'", $_POST[$variable]);
这是否足够好,或者有办法利用它来注入SQL
代码?
PS:我知道标准方法是 using mysql_real_escape_string()
,但我试图了解代码的一般质量。
不。输入一些 UTF8 字符,这会导致代码乱码或被转义。
使用 mysqli / PDO,或者如果必须,使用 mysql_real_escape_string。
str_replace("'", "\'", $_POST[$variable]);
是的,这很脆弱。
很简单,反斜杠不会被转义,因此您可以使用反斜杠来分隔字符串文字以屏蔽引号:hello\' OR 1 --
-> 'hello\\' OR 1 --'
。
空值也不会被转义,可能会导致问题。
此外,如果使用东亚字符集,则可以使用多字节序列来屏蔽引用。(注意这不是 UTF-8 的情况,因为 UTF-8 不允许'
作为尾随字节。)
此外,这种转义格式仅适用于 MySQL。如果使用任何其他数据库,或者在 MySQL 中使用符合 ANSI 的字符串文字选项,那么它将无效,因为标准转义是双引号,而不是反斜杠。
代码没用。充其量它表明有人知道存在 SQL 注入,但它没有表现出对实际问题的真正理解。
SQL 注入可以有多种形式。
如果有一个查询在数字字段上执行 where 子句(想想 PIN 号),它很容易被注入。
在用户输入的号码上寻找匹配的东西是无害的:
SELECT * FROM table
WHERE ID = 1
可以变成总是匹配的东西
SELECT * FROM table
WHERE ID = 1 OR 1 = 1
使用供应商特定的转义函数或准备好的语句是要走的路。