PHP的addslashes和mysql(i)_escape_string有什么区别? [重复]

  可能重复:   mysql_real_escape_string VS addslashes 如果他们不完全相同,有什么区别? MySQL查询中值的分隔符是
'
不是吗?或者也许是
"
但是这也是使用addslashes转义的。 在我理解的其他数据库引擎中(并且肯定在像PDO这样的db包装器中),但为什么有这么多人如此擅长使用mysql(i)_escape_string而不是addslashes?     
已邀请:
首先:不要使用
mysql_escape_string
,它已被弃用(原因)! 如果必须支持通过
mysql
扩展(已弃用)连接到数据库的旧应用程序,请改用
mysql_real_escape_string
。否则立即切换到
mysqli
,其中预准备语句和绑定参数提供了一种更强大的机制来转义用户输入。 也就是说,通过阅读
mysql_real_escape_string
addslashes
的描述可以找到答案: 差异#1
addslashes
对MySql连接编码一无所知。如果你传递一个字符串,其中包含表示除MySql连接所使用的编码之外的编码的字节,它将很乐意转义所有具有字符
'
"
x00
的字符的字节。如果您使用的是8位编码和UTF-8以外的编码,则可能与所有字符
'
"
x00
不同。结果将是MySql收到的字符串将被破坏。 要触发此错误,请尝试使用
iconv
将变量转换为UTF-16,然后使用
addslashes
将其转义。查看数据库收到的内容。 这就是为什么不应该使用ѭ7进行转义的原因之一。 差异#2 与
addslashes
相比,
mysql_real_escape_string
也逃脱了字符
r
n
x1a
。在与MySql交谈时似乎也必须转义这些字符,否则可能是格式错误的查询 这是
addslashes
不应该用于逃避的另一个原因。     
Chris Shiflett演示了一个现实世界的案例,使用
addslashes()
逃避SQL失败,而
mysql_real_escape_string()
是唯一的出路。   这有什么用?如果我想   尝试SQL注入攻击   有一个MySQL数据库   单引号用反斜杠转义   真是个无赖。如果你正在使用   addslashes(),但是,我很幸运。   我需要做的只是注入一些东西   像0xbf27,并且addslashes()修改   这成为0xbf5c27,有效   多字节字符后跟一个   单引号。换句话说,我可以   成功注入单一报价   尽管你逃跑了。那是因为   0xbf5c被解释为单个   性格,而不是两个。糟糕,有   反斜杠。      ....      尽管使用了addslashes(),但我能够在不知道有效用户名或密码的情况下成功登录。我可以简单地利用SQL注入漏洞。      要避免此类漏洞,请使用mysql_real_escape_string(),预准备语句或任何主要数据库抽象库。 现在这无疑是一个罕见的边缘案例,但证明了为什么人们如此坚持使用数据库特定的转义函数。只有数据库库才能确定需要什么类型的转义。不同的包装器,字符集和SQL风格(如MS SQL服务器)需要不同的转义。忽视这一事实就是脆弱性的产生方式。     
它们是完全相同的,因为您应该使用它们,因为您应该使用占位符而不是从不受信任的数据构建S​​QL。 有关如何以正确方式执行此操作,请参见http://bobby-tables.com/php.html。     
这首先是一个charset问题。如果数据纯粹是ASCII,那么
addslashes()
对于转义与SQL命令混合的数据就足够了。但除了UTF-8编码变体之外,某些配置中的MySQL还允许像UCS2(UTF-16)或GB / Big5中文字符集这样的边缘字符集。在那里,将
'
的原始ascii代码转换为
'
是不够的。然后,MySQL的转义字符串的方式从一开始就不符合SQL标准。它可能在MySQL服务器的未来版本中被弃用。     

要回复问题请先登录注册