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

use*_*995 8 php regex mysql sql-injection utf-8

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

 preg_replace('/[\xF0-\xF7].../', '', $data)
Run Code Online (Sandbox Code Playgroud)

这些角色被替换的意义又是什么?

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

Sam*_*ark 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',因为原始管理员是第一个记录攻击者将恢复他的密码.