javascript - 来自 ReDos 攻击的安全正则表达式模式

标签 javascript regex security pattern-matching ddos

我最近遇到了一些重做攻击问题。
简单步骤讲解 :Regex denial of services :这意味着攻击者可以放置一些恶意/精心设计的输入来使您的服务器无法停止找到正确的模式,从而占用您的整个 CPU,并最终导致内部服务器错误。
例如如果您有类似 ^((ab)*)+$ 的模式,攻击者输入了一个恶意输入,如 abababababababababababababababababa它会导致灾难性的错误:
enter image description here
enter image description here
使用 Nested quantifiers 时问题浮出水面, 量化一个子表达式,它本身可以在同一位置以多种方式匹配。如下图所示( https://jex.im/regulex ):
enter image description here
许多模式匹配问题有很多解决方案,例如,如果您想要 URL 的模式有很多答案(也在 StackOverflow 中),这些都是很好的答案,但几乎容易受到这种攻击。
我找到了一些有用的工具,例如 safe-regex :https://www.npmjs.com/package/safe-regex ,效果很好,但有误报和漏报。如您所知,很难找到来自 Redos Attack 的安全正则表达式模式。
需要
我在问,是否有任何安全正则表达式模式列表可用于密码、URL 等常见用途?
有用资源
仅对js平台有用,
https://github.com/validatorjs/validator.js
更新
我一直在努力解决这个问题,发现有一些库,如 re2 , 和 validator.js ,都是不错的工具,发现java从v9和erlang也解决了这个问题,但是在javascript正则表达式引擎中在chrome中仍然存在这个问题,但是在firefox中,它会抛出一个错误,在try cache中很好处理,最后,我已尝试在此 Github 链接中为此目的列出 list :
https://github.com/phoenixdevio/safe-regex-patterns
仍然找不到一个好的解决方案。虽然我知道可能有使用 atomic group 的解决方案.如果有人能帮助解决这个问题,让列表变得越来越好,那就太好了。

最佳答案

这并不能直接回答您的问题,但(根据我的经验)避免此类攻击的最简单方法是使用基于 https://github.com/google/re2 的正则表达式库。 ,因为它不会受到 ReDOS 攻击。对于节点,引用库是 https://github.com/uhop/node-re2/

RE2 consciously avoids any regular expression features that require worst-case exponential time to evaluate. These features are essentially those that describe a Context-Free Language (CFL) rather than a Regular Expression, and are extensions to the traditional regular expression language because some people don't know when enough is enough.


The most noteworthy missing features are backreferences and lookahead assertions. If your application uses these features, you should continue to use RegExp. But since these features are fundamentally vulnerable to ReDoS, you should strongly consider replacing them.


如果您的正则表达式与它不兼容,那么它肯定很容易受到 ReDOS 的攻击,并且(作为奖励)许多通常容易​​受到 ReDOS 攻击的(如您的示例)仍然有效,但在 re2 中不易受到攻击。

关于javascript - 来自 ReDos 攻击的安全正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63127145/

相关文章:

c# - 如何在 WPF C# 中禁用 Web 浏览器安全警告

PHP stream_socket_client() : unable to connect to https

带有 KeyStore 和 ServerSockets 的 Java SSL/TLS

javascript - 如何在 Django 应用程序上使用静态 Javascript 播放静态 mp3 文件?

javascript - 追加时无法访问 jQuery

javascript - 为什么不能像 {}.toString() 这样的对象文字调用 toString() 方法导致错误?

php - 通过 PHP 源代码中的引用检测调用时间传递的正则表达式

java - Java中根据条件组合正则表达式

javascript - 无法读取 null 的属性 'style'

python - 在 Python 中用正则表达式替换 '(' 时出错