这个preg_replace有什么作用? (/[\xF0-\xF7].../)

问题描述 投票:0回答:4

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

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

还有这些字符被替换的意义是什么?

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

php mysql regex utf-8 sql-injection
4个回答
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
投票

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


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

替换:


(xF0 到 xF7) + 三个带有空字符串的下一个字符(+ 符号代表串联,而不是加法)


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.