Rud*_*die 5 php mysql security mysql-real-escape-string addslashes
如果他们不完全相同,有什么区别?MySQL查询中值的分隔符'不是吗?或许"也可以使用addslashes进行转义.
在我理解的其他数据库引擎中(并且肯定在像PDO这样的db包装器中),但为什么有这么多人如此擅长使用mysql(i)_escape_string而不是addslashes?
Jon*_*Jon 16
首先:不要使用mysql_escape_string,不推荐使用(出于某种原因)!
如果必须支持通过mysql扩展(已弃用)连接到数据库的旧应用程序,请mysql_real_escape_string改用.否则立即切换到mysqli,其中预准备语句和绑定参数提供更强大的机制来转义用户输入.
这就是说,答案可以通过读取的描述中找到mysql_real_escape_string和addslashes:
差异#1
addslashes我对MySql连接编码一无所知.如果传递它包含表示比由MySQL连接所使用的编码的其他的编码字节的串,它将愉快地逸出具有字符的值的所有字节 ',",\和\x00.这可能不是一样的所有字符 ',",\和\x00如果您使用的是8位编码和UTF-8编码.结果将是MySql收到的字符串将被破坏.
要触发此错误,请尝试使用iconv将变量转换为UTF-16,然后使用它将其转义addslashes.查看数据库收到的内容.
这是addslashes不应该用于逃避的一个原因.
差异#2
与此相反addslashes,mysql_real_escape_string也逃脱字符\r,\n和\x1a.在与MySql交谈时,似乎必须转义这些字符,否则可能会导致格式错误的查询
这是为什么addslashes不应该用于逃避的另一个原因.
Chris Shiflett演示了一个现实世界的案例,其中使用SQL转义addslashes()失败,并且mysql_real_escape_string()是唯一的方法.
这有什么用?如果我想针对MySQL数据库尝试SQL注入攻击,使用反斜杠转义单引号是一件好事.但是,如果你正在使用addslashes(),我很幸运.我需要做的就是注入类似0xbf27的东西,并且addslashes()将其修改为0xbf5c27,这是一个有效的多字节字符,后跟单引号.换句话说,尽管你逃脱了,我仍然可以成功地注入一个单一的报价.那是因为0xbf5c被解释为单个字符,而不是两个.糟糕,有反斜杠.
....
尽管使用了addslashes(),但我能够在不知道有效用户名或密码的情况下成功登录.我可以简单地利用SQL注入漏洞.
要避免此类漏洞,请使用mysql_real_escape_string(),预准备语句或任何主要数据库抽象库.
现在这无疑是一个罕见的边缘案例,但证明了为什么人们如此坚持使用数据库特定的转义功能.只有数据库库才能确定需要什么类型的转义.不同的包装器,字符集和SQL风格(如MS SQL服务器)需要不同的转义.忽视这一事实就是脆弱性的产生方式.
| 归档时间: | 
 | 
| 查看次数: | 10463 次 | 
| 最近记录: |