我想正则表达式搜索功能添加到我的公开网页。 除了HTML编码输出,我需要做任何事情来防止恶意用户输入?
谷歌搜索是由人来解决使用正则表达式来检测恶意输入反之problem--淹没-这我不感兴趣,我的方案中,用户输入的是一个正则表达式。
我将使用在.net(C#)的正则表达式库。
我想正则表达式搜索功能添加到我的公开网页。 除了HTML编码输出,我需要做任何事情来防止恶意用户输入?
谷歌搜索是由人来解决使用正则表达式来检测恶意输入反之problem--淹没-这我不感兴趣,我的方案中,用户输入的是一个正则表达式。
我将使用在.net(C#)的正则表达式库。
与正则表达式最常见的问题是通过去指数病态模式的阻断服务攻击 - 甚至是超指数! - 这样似乎采取永远解决。 这些可能只出现在特定的输入数据,但一个普遍可以创建一个,其中,这并不重要。
哪些这些都将在一定程度取决于你使用正则表达式编译器如何聪明恰好是的,因为其中的一些可以在编译时被检测到。 实现递归正则表达式编译器通常有一个内置的递归深度的柜台检查无进展。
拉斯考克斯对优秀的2007年纸正则表达式匹配可以是简单和快速(但是是Java,Perl和PHP,Python和Ruby,慢...)关于如何谈判是最现代化的NFA,而这一切似乎从Henry Spencer的代码来推导,遭受严重的性能下降,但其中一个汤普森式NFA有没有这样的问题。
如果你只承认可以通过有限自动机可以解决的模式,你可以编译他们,正因为如此,他们会跑得更快,可能要快得多。 然而,它需要时间来做到这一点。 考克斯文提到这种做法和随之而来的问题。 这一切都归结到一个经典的时空权衡。
有了DFA,你花更多的时间来建立它(和分配更多的状态),而与NFA你花更多的时间执行它,因为它可以在同一时间有多个状态,并且回溯可以吃你的午餐 - 和你的CPU。
也许解决这些图案,与宇宙热死亡赛跑的败诉告终最合理的方式是与有效的地方允许他们执行的最大时间量的计时器来包装它们。 通常这将是多少,比默认的超时时间,大多数HTTP服务器提供少得多。
有多种方法来实现这些,为形成一个简单的alarm(N)
在C级,以某种try {}
阻止捕获的报警类型的例外,一路产卵关闭该透过特别有创建一个新的线程内置到它时序约束。
在承认代码标注的正则表达式语言, 应当提供某种机制,以允许或你要编译字符串不允许这些。 即使代码标注只在您所使用的语言的代码,你应该限制他们。 他们没有能够调用外部代码,但如果他们能做到,你有更大的问题。
例如,在Perl一个不能从字符串创建插值正则表达式的代码标注(因为这些会是这样,因为它们在运行时会编译),除非特殊词法范围的编译use re "eval";
在活性在当前范围。
没有人这样可以在代码调偷偷运行系统程序,如rm -rf *
,例如。 由于代码标注是如此安全敏感的,Perl的默认对所有插值字符串禁用它们,你必须走出自己的方式重新启用它们。
仍然与Unicode的样式属性一个更安全的敏感问题-像\pM
, \p{Pd}
\p{Pattern_Syntax}
或\p{Script=Greek}
- 可能在支持一些正则表达式的编译器存在符号。
问题是,在其中的一些,该组可能的属性是用户扩展。 这意味着你可以有一个是实际的代码标注命名功能在某些特定namepace,如自定义属性\p{GoodChars}
或\p{Class::Good_Characters}
你的语言如何处理那些可能是值得考虑的。
在Perl中,通过沙盒舱Safe
模块将使在命名空间的可视性控制。 其他语言提供类似沙盒技术。 如果这些设备可用,您可能想看看他们,因为他们是专门为不可信代码执行有限的设计。
添加到tchrist的出色答卷:同样的拉斯考克斯是谁写的“正则表达式”页面还发布代码! RE2是这保证O(length_of_regex)运行时和配置存储器使用极限的C ++库。 它在谷歌使用,以便您可以键入一个正则表达式到谷歌代码搜索 - 也就是说,它一直战斗测试。
是。
正则表达式可以用来进行DOS攻击 。
有没有简单的解决方案。
你会想阅读本文:
不安全的上下文切换:接种正则表达式的生存能力本文更多的是关于什么可以去错的正则表达式引擎(例如PCRE),但它可以帮助你了解你在做什么反对。
你不仅不用担心匹配本身,而是你怎么做匹配。 例如,如果你输入经过某种形式的道路上正则表达式引擎的eval相或命令替换的有可能是被该模式中执行的代码。 或者,如果你的正则表达式语法允许嵌入的命令,你必须警惕这一点。 因为你没有指定你的问题的语言很难肯定的说什么所有的安全隐患也是。
测试你的正则表达式的安全问题(至少对于Windows)的一个好方法是SDL正则表达式模糊测试工具,最近微软发布。 这可以帮助避免病理坏的正则表达式建设。