【问题标题】:Is it safe to use user's RegEx?使用用户的 RegEx 是否安全?
【发布时间】:2014-09-10 13:07:01
【问题描述】:

我想在我的网站上添加一个功能,让用户使用RegEx 搜索文本。但是,让用户做这样的事情安全吗?

preg_match('/' . $user_input_regex . '/', $subject);

【问题讨论】:

  • 您可能需要使用preg_quote() 对其进行转义,如果用户输入是格式错误的正则表达式,则很难优雅地捕获错误
  • @MarkBaker 但是如果我用 preg_quote() 转义正则表达式字符,正则表达式将不起作用
  • @AnnonomusPenguin 用户提供的“regex2 可能包含 php 代码。
  • 在这种情况下使用 preg_quote 转义用户正则表达式会适得其反,因为所有正则表达式符号都会被转义。这使得用户正则表达式无用,因为它将作为普通字符串处理 -> 不会发生正则表达式匹配。
  • @MarkBaker 有一个filter_var(和filter_input)过滤器可以验证正则表达式:nz2.php.net/manual/en/filter.filters.validate.php

标签: php regex preg-match user-input code-injection


【解决方案1】:

此代码可能受到攻击,称为ReDoS attack(正则表达式拒绝服务)。

正则表达式拒绝服务 (ReDoS) 是一种拒绝服务攻击,它利用了这样一个事实,即大多数正则表达式实现可能会遇到极端情况,导致它们工作非常缓慢(与输入大小呈指数关系)。然后,攻击者可以使使用正则表达式的程序进入这些极端情况,然后挂起很长时间。

特别是 preg_match 有一个 known issue 可能导致 PHP 分段错误。

所以答案是否定的,因为这些问题,它是不安全的。

【讨论】:

  • 1.使用 ReDoS,攻击者只能减慢服务器速度,但除此之外不能造成任何损害,对吧?
  • @SdgsdgAsgasgf: 1) 除了让你的服​​务器对所有请求都没有响应之外,没有。 2) 还有may be a workaround for the segfault.
  • 是否可以限制输入的长度以及“荒谬”,从而减轻这种攻击的影响? ReDDos 仍然存在风险,但不会超过任何其他 DDoS。
  • 您始终可以使用基于 DFA 的正则表达式实现,但 没有 存在此类问题,因为它们具有线性最坏情况而不是指数(尽管它们具有 一些限制)。
  • 为什么不给搜索时间限制?如果搜索花费 >x 秒,则中止。
【解决方案2】:

出于安全考虑,您永远不应信任用户输入,因此这取决于您对输入的操作。在您给定的情况下,您至少应该在用户输入中转义使用的分隔符(反斜杠)以确保正则表达式有效。

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多