我一直想知道这可能已经有几个月了,但是我仍然不知道答案,除了速度性能之外。长话短说,为什么不将所有这些PDO代码都放置在各处,为什么不在每个字符之间加上反斜杠呢?
$String = $_POST["attack"]; // SOME THING' OR 1 = 1 --
$String = fFilter( $String ); // \S\O\M\E\ \T\H\I\N\G\'\ \O\R\ \1\ \=\ \1\ \-\-
现在我已经有一段时间没有研究过SQL了,所以我不能给出一个完美的例子,但是基本上sql字符串应该看起来像这样的
SELECT * FROM account WHERE id = '\S\O\M\E\ \T\H\I\N\G\'\ \O\R\ \1\ \=\ \1\ \-\-'
,并且看起来总是很安全的,但是我没有听说有人使用它,甚至为什么不使用它。我总是看到过滤html等之类的东西不好,但是我不明白为什么不只过滤每个字符。因为任何攻击看起来都像\a\t\t\a\c\k
。 最佳答案
因为在某些字符前加上反斜杠会完全改变其含义。例如,\t
是制表符,而不是t
,因此\a\t\t\a\c\k
将转换为:
a ack
此类序列的完整列表位于:
http://dev.mysql.com/doc/refman/5.5/en/string-literals.html
正如其他几个人所提到的,请使用参数化查询而不是输入转义。