保护用户输入的正则表达式免受攻击


9

我知道正则表达式拒绝服务(ReDoS)。有什么合理的方法可以允许用户创建自定义正则表达式,同时保证他们不提交指数级缓慢的模式?


您缺少细节。平台,用法等
whatsisname 2017年

8
与其尝试避免用户提交错误的正则表达式,不如通过一种解决方案在一段时间后取消执行?
塞缪尔

Answers:


8

正则表达式的问题不在于正则表达式本身,而是具有各种“便捷”功能(例如回溯)的正则表达式引擎。因此,避免使用不具有这些功能的正则表达式引擎。

在将正则表达式编译为有限状态机之后,可以始终在线性时间内匹配计算机科学概念。因此,基于状态机的正则表达式引擎不能用于ReDoS。但是,在病理示例中,必要的状态机可能变得相当大。但是限制可用内存比限制可用计算时间要容易得多。

RE2引擎是专门开发出对付不信任的正则表达式,并设计为线性时间执行。

另一种选择是使用简化的符号自己组装正则表达式。例如,您可能允许用户使用glob模式(如*.txt)。然后,您可以通过防止回溯的方式来解析它,例如,禁止嵌套并且仅使用贪婪的量词。对于许多用例,简化的模式表示法就足够了。


11

不使分析本身变慢的情况下,分析正则表达式以查看其是否变慢,就等于解决了停顿问题。换句话说,不可能找到正确而完整的解决方案。

当然,你可以的,找到一个解决方案是正确的,完成了。例如,您可以使用安全使用的限制性白名单(例如,字符类为,重复编号为...)。这将允许您传递许多非关键的正则表达式,拒绝所有关键的正则表达式,并且(错误地)拒绝一些可以的,但过于复杂而无法自动证明安全的正则表达式。


3
您的第一个陈述是否被引用?我希望看到这样的证明。正则表达式不是图灵完整的,因此暂停问题可能不适用。
塞巴斯蒂安·雷德尔

3
@SebastianRedl确实,严格来说,正则表达式不是图灵完备的,但是所有流行使用的正则表达式库都具有使它们不再为正则的扩展名。实际上,将您的用户限制为字面正则表达式实际上是解决这种情况的一个好方法。
基利安·佛斯

2
@KilianFoth:IIRC,即使是真正的正则表达式(在CompSci的意义上)也可能需要指数级的回溯。但是由于它们不是图灵完备的,因此对于任何给定的正则表达式,理论上都可以建立此上限。但是,这留下了两个问题:自动确定上限并非易事,并且结果可能会给出不合理的高结果(例如,上限远高于预期时间)。
MSalters

@msalters任何真正的正则表达式都可以机械地转换为确定性有限状态自动机,即始终可以匹配该表达式而根本不回溯。当然,您的FSA可能会变得过大,但是这表明对所生成的FSA中的状态数进行限制是足以防止相关攻击的解决方案。
Jules

1

作为lazarus项目的解析器的作者,我会说没有办法了解任何给定的正则表达式在给定的文本上将消耗哪些资源。

我不花费相同的资源(至少在big-O的意义上)。

因此,最好的方法-在单独的线程中运行解析器,并在超时后将其终止。


0

除了其他答案,解决方案还可能是滚动您自己的正则表达式库,该库允许在执行过程中进行性能检测,从而提供一种在满足某些条件时中途终止执行的方法。

同样,您可以在另一个线程上运行正则表达式,如果它们花费太长时间,则将其杀死。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.