显然$data是字符串,我们正在删除满足reg表达式的字符,但是/[\xF0-\xF7]./指定了哪些字符?
preg_replace('/[\xF0-\xF7].../', '', $data)
字符串还有,这些字符被替换的意义是什么?编辑赏金:具体地说,这是试图防止发生什么漏洞?数据稍后在mysql查询(非pdo)中使用,所以我假设这些字符可能涉及某种注入攻击?或者不是?我试图理解我正在阅读的脚本中这行代码背后的逻辑。
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:这样的错误。请参阅以下内容以获取更多参考:
[\xF0-\xF7]
strict_trans_tables
SQLSTATE[HY000]: General error: 1366 Incorrect string value:
截断可能导致漏洞利用。例如,有一个网站的用户名为admin。网站允许任何人注册。使用截断字符串可能会插入另一个admin与不同的电子邮件绕过唯一检查。然后暂停帐户,并尝试使用恢复过程。它会发出一个查询,如SELECT * FROM users WHERE name = 'admin',因为原始管理员是第一个记录攻击者将恢复他的密码。
admin
SELECT * FROM users WHERE name = 'admin'
eqoofvh92#
它匹配8个字节值中的一个,加上后面的任何3个字符,并删除4个字符的块。你说你已经知道了这么多。不幸的是,没有更多的上下文,我们不能告诉你 * 为什么 * 这8个字节是重要的。它们本身是无害的,不管它们代表什么样的字符串(字符编码)。我最好的猜测是,* 在应用程序中,这来自 * 0xF 0是11110 xxx,32位(4字节)UTF-8字符的第一个字节,所以也许它是为了删除所有32位UTF-8字符?16位和24位字符(110 xxxxx和1110 xxxx第一字节)是否同样处理?
7jmck4yq3#
preg_replace('/[\xF0-\xF7].../', '', $data)替换:(xF0到xF7)+三个接下来的字符和一个空字符串(+符号表示连接,而不是加法)
wqnecbli4#
从字符串中删除表情符号的老代码。
4条答案
按热度按时间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'
,因为原始管理员是第一个记录攻击者将恢复他的密码。eqoofvh92#
它匹配8个字节值中的一个,加上后面的任何3个字符,并删除4个字符的块。你说你已经知道了这么多。不幸的是,没有更多的上下文,我们不能告诉你 * 为什么 * 这8个字节是重要的。它们本身是无害的,不管它们代表什么样的字符串(字符编码)。我最好的猜测是,* 在应用程序中,这来自 * 0xF 0是11110 xxx,32位(4字节)UTF-8字符的第一个字节,所以也许它是为了删除所有32位UTF-8字符?16位和24位字符(110 xxxxx和1110 xxxx第一字节)是否同样处理?
7jmck4yq3#
preg_replace('/[\xF0-\xF7].../', '', $data)
替换:(xF0到xF7)+三个接下来的字符和一个空字符串(+符号表示连接,而不是加法)
wqnecbli4#
从字符串中删除表情符号的老代码。