Php 为什么不将每个空格反斜杠以防止mysql注入

Php 为什么不将每个空格反斜杠以防止mysql注入,php,mysql,sql,sql-injection,Php,Mysql,Sql,Sql Injection,几个月来我一直在想这个问题,但除了可能的速度性能,我仍然不知道答案。长话短说,与其到处都有这些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了,所以我不能给出一个完美的例子,但基本

几个月来我一直在想这个问题,但除了可能的速度性能,我仍然不知道答案。长话短说,与其到处都有这些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
此类序列的完整列表见:


正如其他一些人所提到的,使用参数化查询,而不是输入转义。

为什么不准备每个语句来防止mysql注入?一些序列,如\n,表示与最初预期的n不同的内容。SQL注入的问题已经通过参数化查询很容易地解决了。@DaveChen因为没有人说任何东西都是100%安全的,即使是PDO。没有什么东西是100%安全的,但是准备可以保护您免受注入。现在XSS或溢出仍然是可能的。不,你是对的,很多懒惰的人用addslashes函数来实现这一点。最好的方法是使用准备好的sql语句。查一查。我知道,但我没有考虑sql。我在想PHP,以及\n是一个换行符,但是“\n”实际上是一个反斜杠,然后是n。@Hybrilynx这两个引号的用法非常不同。“bla”是字面意思。这意味着传递到单引号中的任何内容都将被视为输入。而双引号也允许PHP解释特殊字符。他们到底在干什么represent@Hybrilynx:虽然有一些相似之处,但PHP和MySQL对单引号的处理方式不同。反斜杠转义的设置在两者之间甚至不相同;这很相似。