PHP addslashes和mysqli之间的区别是什么?escape_string?

时间:2010-12-20 00:36:22

标签: php mysql security mysql-real-escape-string addslashes

  

可能重复:
  mysql_real_escape_string VS addslashes

如果他们不完全一样,有什么区别? MySQL查询中值的分隔符是'不是吗?或者也许是",但也会使用addslashes进行转义。

在我理解的其他数据库引擎中(并且肯定在像PDO这样的db包装器中),但是为什么有这么多人如此习惯使用mysql(i)_escape_string而不是addslashes?

4 个答案:

答案 0 :(得分:16)

首先:不要使用mysql_escape_string,不推荐使用它(出于某种原因)!

如果您必须支持通过mysql扩展名(has been deprecated)连接到数据库的旧应用程序,请改用mysql_real_escape_string。否则为switch immediatelymysqli,其中预准备语句和绑定参数提供了一种更强大的机制来转义用户输入。

也就是说,通过阅读mysql_real_escape_stringaddslashes的说明可以找到答案:

差异#1

addslashes对MySql连接编码一无所知。如果你传递一个字符串,其中包含代表MySql连接使用的编码以外的编码的字节,它将很高兴地转义具有字符值的所有字节 ',{{1} },"\。如果您使用的是8-以外的编码,则可能与所有字符 \x00'"\不同位编码和UTF-8。结果将是MySql收到的字符串将被破坏。

要触发此错误,请尝试使用iconv将您的变量转换为UTF-16,然后使用\x00将其转义。查看数据库收到的内容。

这是addslashes不应该用于转义的一个原因。

差异<2

addslashes相比,addslashes也会转义字符mysql_real_escape_string\r\n。在与MySql交谈时似乎也必须转义这些字符,否则可能是格式错误的查询结果

这是\x1a不应该用于转义的另一个原因。

答案 1 :(得分:5)

Chris Shiflett演示了一个真实案例,使用addslashes()转义SQL失败,mysql_real_escape_string()是唯一的方法。

  

这有什么用?如果我想   尝试SQL注入攻击   有一个MySQL数据库   单引号用反斜杠转义   真是个无赖。如果你正在使用   addslashes(),但是,我很幸运。   我需要做的只是注入一些东西   像0xbf27,并且addslashes()修改   这成为0xbf5c27,有效   多字节字符后跟一个   单引号。换句话说,我可以   成功注入单一报价   尽管你逃跑了。那是因为   0xbf5c被解释为单个   性格,而不是两个。糟糕,有   反斜杠。

     

...

     

尽管使用了addslashes(),但我能够在不知道有效用户名或密码的情况下成功登录。我可以简单地利用SQL注入漏洞。

     

要避免此类漏洞,请使用mysql_real_escape_string(),预处理语句或任何主要数据库抽象库。

现在这无疑是一个罕见的边缘案例,但是演示了为什么人们如此坚持使用数据库特定的转义函数。 只有数据库才能确定需要什么类型的转义。不同的包装器,字符集和SQL风格(如MS SQL服务器)需要不同的转义。忽视这一事实就是脆弱性的产生。

答案 2 :(得分:1)

它们完全相同,因为您应该使用它们,因为您应该使用占位符而不是从不受信任的数据构建S​​QL。

请参阅http://bobby-tables.com/php.html了解如何以正确的方式执行此操作。

答案 3 :(得分:0)

这首先是一个字符集问题。如果数据纯粹是 ASCII ,那么addslashes()对于转义与SQL命令混合的数据就足够了。但除了UTF-8编码变体之外,某些配置中的MySQL还允许像UCS2(UTF-16)或GB / Big5中文字符集这样的边缘字符集。将'的原始ascii代码转义为\'是不够的。然后,MySQL的转义字符串的方式从一开始就不符合SQL标准。在MySQL服务器的未来版本中可能会弃用它。