显然 $data 是字符串,我们要删除满足 reg 表达式的字符,但是 /[\xF0-\xF7].../ 指定了哪些字符?
preg_replace('/[\xF0-\xF7].../', '', $data)
还有这些字符被替换的意义是什么?
编辑赏金:具体来说,这是试图防止发生什么漏洞?这些数据稍后用于 mysql 查询(非 pdo),所以我推测这些字符可能涉及某种注入攻击?或不?我试图理解我正在阅读的脚本中这行代码背后的逻辑。
它从 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'
的查询,并且由于原始管理员是第一个记录,攻击者将恢复他的密码。
它匹配 8 个字节值之一,加上后面的任何 3 个字符,并删除 4 个字符的块。你说的这么多你已经知道了。不幸的是,如果没有更多上下文,我们无法告诉您“为什么”这些特定的 8 个字节很重要。就其本身而言,它们是无害的,无论它们代表什么字符字形(字符编码)。我最好的猜测是,在应用程序中,这来自于这 8 个字符作为某种标记具有一定的意义。 0xF0是11110xxx,32位(4字节)UTF-8字符的第一个字节,所以也许是删除所有32位UTF-8字符? 16 和 24 位字符(110xxxxx 和 1110xxxx 第一个字节)是否有类似处理?
preg_replace('/[\xF0-\xF7].../', '', $data)
替换:
(xF0 到 xF7) + 三个带有空字符串的下一个字符(+ 符号代表串联,而不是加法)