【问题标题】:What does this preg_replace do? (/[\xF0-\xF7].../)这个 preg_replace 做什么? (/[\xF0-\xF7].../)
【发布时间】:2012-11-19 05:14:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 匹配从xF0xF7的一系列字符
  • ð ñ ò ó ô õ ö ÷
  • 我的意思是,你为什么要转义这些字符?它们不安全吗?
  • @user1796995 它们很难输入,并且如果输入可能会被错误地解释。使用转义可确保为 PHP 提供预期的准确字符。
  • @user1796995 它根本没有逃跑,如果我问你Would removing some accented letters prevent some exploits ?你会怎么回答?这很可能是可能的。无论如何,有些情况是我们无法想象的,请参阅this answer。最后,我真的不明白你的意思。如果您想提高安全性,那么只需正确使用准备好的语句。仅仅删除几个字符并不能保证任何事情。

标签: php mysql regex utf-8 sql-injection


【解决方案1】:

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

【讨论】:

  • 最后。一个非讽刺的答案,一个对我有帮助的答案。谢谢你,你是个天才!
  • 接受的答案 + 获得的赏金。谢谢。
【解决方案2】:

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

【讨论】:

  • 检查 Sam Dark 的答案。删除所有 32 位 UTF-8 字符的方式相同。我认为他做到了。
  • 是的,我比他晚了 13 秒才发帖。我不知道 MySQL 会截断 32 位字符(显然不是更短的字符)。当然,这种用法取决于 PHP 实际上将 32 位 UTF-8 字符视为 4 个单独的字节(或至少允许此类访问)。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 2014-01-29
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2019-03-31
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多