我如何识别邪恶的正则表达式?
我最近意识到
Regular expression Denial of Service攻击,并决定根除所谓的“邪恶”正则表达式模式,无论我在哪里可以找到他们在我的代码库 – 或至少那些用于用户输入。在
OWASP link上面和
wikipedia给出的例子是有帮助的,但他们没有做一个伟大的工作用简单的术语解释这个问题。
描述邪恶的正则表达式,从wikipedia: >正则表达式将重复(“”,“*”)应用到复杂子表达式; 有了例子,再次从wikipedia: >(a) 这是一个问题,只是没有一个更简单的解释?我正在寻找一些东西,这将使它更容易避免这个问题,同时编写正则表达式,或者在现有的代码库中找到它们。
如果你想要它在简单的术语,正则表达式引擎不是没有哇 – 如果起初它不成功,它会跳回来,一遍又一遍,每一个可能的组合,直到找到一个匹配。
我会采取一个模式灵感来自你给你的第一个例子,并拼写出来给你: ^((ab)*)+$ 给定输入:
正则表达式引擎尝试类似(ababab),并在第一次尝试找到匹配。好极了!但是,我们把猴子扳手放在:
正则表达式引擎尝试(ababab)但是失败,因为额外的a。但不要害怕,我们的强大的正则表达式引擎再次尝试,这次有类似(abab)(ab)。但这也没有工作。 “”好吧,“它自我说,”时间屈服和解决这个问题。
在你知道之前,正则表达式引擎正在占用你所有的系统资源,试图解决这个问题,直到用尽了所有可能的条款组合,它终于放弃,并转向你说“这不是一个匹配。回头看看正则表达式引擎,你可以看到你的服务器,一堆燃烧的熔融金属。 对于识别这些正则表达式,它实际上可能是非常棘手的。我自己写了一对夫妻,尽管我知道他们是什么,一般如何避免他们。看到Regex taking surprisingly long time.包裹一切你可以在一个atomic group可以帮助防止回溯问题。它基本上告诉正则表达式引擎不要尝试多个组合 – “如果开始你不成功,立即运行! 不幸的是,一旦写入,实际上很难立即或快速找到正规表达式的问题。最后,识别坏的正则表达式就像识别任何其他错误的代码 – 它需要大量的时间和经验和/或单个灾难性事件。 (注意:上面的“匹配”只是说明性的,匹配的实际顺序将取决于正则表达式引擎,但你得到的是主旨。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |