我如何识别邪恶的正则表达式?

前端之家收集整理的这篇文章主要介绍了我如何识别邪恶的正则表达式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近意识到 Regular expression Denial of Service攻击,并决定根除所谓的“邪恶”正则表达式模式,无论我在哪里可以找到他们在我的代码库 – 或至少那些用于用户输入。在 OWASP link上面和 wikipedia给出的例子是有帮助的,但他们没有做一个伟大的工作用简单的术语解释这个问题。

描述邪恶的正则表达式,从wikipedia

>正则表达式将重复(“”,“*”)应用到复杂子表达式;
>对于重复的子表达式,存在也是另一有效匹配的后缀的匹配。

有了例子,再次从wikipedia

>(a)
>([a-zA-Z])*
>(a | aa)
>(a | a?)
>(。* a){x} for x> 10

这是一个问题,只是没有一个更简单的解释?我正在寻找一些东西,这将使它更容易避免这个问题,同时编写正则表达式,或者在现有的代码库中找到它们。

如果你想要它在简单的术语,正则表达式引擎不是没有哇 – 如果起初它不成功,它会跳回来,一遍又一遍,每一个可能的组合,直到找到一个匹配。

我会采取一个模式灵感来自你给你的第一个例子,并拼写出来给你:

^((ab)*)+$

给定输入:

ababab

正则表达式引擎尝试类似(ababab),并在第一次尝试找到匹配。好极了!但是,我们把猴子扳手放在:

abababa

正则表达式引擎尝试(ababab)但是失败,因为额外的a。但不要害怕,我们的强大的正则表达式引擎再次尝试,这次有类似(abab)(ab)。但这也没有工作。 “”好吧,“它自我说,”时间屈服和解决这个问题。

(ababab) – Nope
(abab)(ab) – Nope
(ab)(abab) – Nope
(ab)(ab)(ab) – Nope
()(ababab) – Nope
()(abab)(ab) – Nope
()(ab)(abab) – Nope
()(ab)(ab)(ab) – Nope

在你知道之前,正则表达式引擎正在占用你所有的系统资源,试图解决这个问题,直到用尽了所有可能的条款组合,它终于放弃,并转向你说“这不是一个匹配。回头看看正则表达式引擎,你可以看到你的服务器,一堆燃烧的熔融金属。

对于识别这些正则表达式,它实际上可能是非常棘手的。我自己写了一对夫妻,尽管我知道他们是什么,一般如何避免他们。看到Regex taking surprisingly long time.包裹一切你可以在一个atomic group可以帮助防止回溯问题。它基本上告诉正则表达式引擎不要尝试多个组合 – “如果开始你不成功,立即运行!

不幸的是,一旦写入,实际上很难立即或快速找到正规表达式的问题。最后,识别坏的正则表达式就像识别任何其他错误代码 – 它需要大量的时间和经验和/或单个灾难性事件。

(注意:上面的“匹配”只是说明性的,匹配的实际顺序将取决于正则表达式引擎,但你得到的是主旨。

猜你在找的正则表达式相关文章