8

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

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

另外这些字符被替换的意义是什么?

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

4

3 回答 3

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

于 2014-01-13T23:25:28.643 回答
1

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

于 2014-01-13T23:25:41.693 回答
0

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

(xF0 到 xF7) + 后面三个字符和一个空字符串(+ 符号表示连接,而不是加法)

于 2014-01-20T17:09:17.967 回答