我正在尝试评估一种自定义的CMS
。 devoloper用于对SQL
攻击的保护是:
str_replace("'", "\'", $_POST[$variable]);
这是否足够好,或者有办法利用它来注入SQL
代码?
PS:我知道标准方式是使用mysql_real_escape_string()
,但我试图了解代码的一般质量。
答案 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
使用特定于供应商的转义函数或预处理语句是可行的方法。