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

htzpubme  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(143)

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

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

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

wb1gzix0

wb1gzix01#

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

eqoofvh9

eqoofvh92#

它匹配8个字节值中的一个,加上后面的任何3个字符,并删除4个字符的块。你说你已经知道了这么多。不幸的是,没有更多的上下文,我们不能告诉你 * 为什么 * 这8个字节是重要的。它们本身是无害的,不管它们代表什么样的字符串(字符编码)。我最好的猜测是,* 在应用程序中,这来自 * 0xF 0是11110 xxx,32位(4字节)UTF-8字符的第一个字节,所以也许它是为了删除所有32位UTF-8字符?16位和24位字符(110 xxxxx和1110 xxxx第一字节)是否同样处理?

7jmck4yq

7jmck4yq3#

preg_replace('/[\xF0-\xF7].../', '', $data)替换:
(xF0到xF7)+三个接下来的字符和一个空字符串(+符号表示连接,而不是加法)

wqnecbli

wqnecbli4#

从字符串中删除表情符号的老代码。

相关问题