这个preg_replace做了什么? (/[\xF0-\xF7].../)

时间:2012-11-30 23:02:49

标签: php mysql regex utf-8 sql-injection

显然$ data是字符串,我们正在删除满足reg表达式的字符,但是/ [|| FF0-\xF7] ... /?

指定了哪些字符
 preg_replace('/[\xF0-\xF7].../', '', $data)

这些角色被替换的重要性是什么?

为赏金编辑:具体来说,这是为了防止发生什么漏洞?这些数据后来用于mysql查询(非pdo),所以我认为某些注入攻击可能与这些字符有关?或不?我试图在我正在阅读的脚本中理解这行代码背后的逻辑。

3 个答案:

答案 0 :(得分:20)

它从unicode字符串中删除4字节序列。在这些第一个字节总是[\xF0-\xF7],三个点是3个字节的其余部分。

根据http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html

  

名为utf8的字符集每个字符最多使用三个字节,仅包含BMP字符。

选择了utf8编码的MySQL可能会在序列出现的位置截断文本,如果错误报告未设置为strict_trans_tables,则可以静默执行,而不是抛出SQLSTATE[HY000]: General error: 1366 Incorrect string value:之类的错误。

请参阅以下内容以获取进一步参考:

潜在的截断可能导致漏洞利用。

例如,有一个名为admin的用户的网站。网站允许任何人注册。使用截断的字符串,可能会使用不同的电子邮件插入另一个admin,绕过唯一的检查。然后暂停帐户并尝试使用还原过程。它将发出类似SELECT * FROM users WHERE name = 'admin'的查询,因为原始管理员是第一个记录攻击者将恢复其密码。

答案 1 :(得分:1)

它匹配8个字节值中的一个,加上后面的任意3个字符,并删除4个字符的块。那么多你说你已经知道了。不幸的是,没有更多的上下文,我们无法告诉你为什么这些特殊的8字节是重要的。无论它们代表什么字符字形(字符编码),它们本身都是无害的。我最好的猜测是在应用程序中来自这些8个字符作为某种标记有一些意义。 0xF0是11110xxx,是32位(4字节)UTF-8字符的第一个字节,所以也许是要删除所有32位UTF-8字符?是否对16位和24位字符(110xxxxx和1110xxxx第一字节)进行了类似处理?

答案 2 :(得分:0)

preg_replace('/[\xF0-\xF7].../', '', $data)替换:

(xF0到xF7)+三个带有空字符串的下一个字符(+符号表示连接,不是添加)