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