我想添加正则表达式搜索功能到我的公共网页。除了对输出进行 超文本标示语言编码之外,我是否需要做一些事情来防止恶意用户输入?
谷歌搜索被解决相反问题的人们淹没了——使用正则表达式来检测恶意输入——我对此不感兴趣。在我的场景中,用户输入 是正则表达式。
我将在.NET (C #)中使用 正方糖库。
是的。
正则表达式可以用来执行 DOS 攻击 。 没有简单的解决办法。
正则表达式最常见的问题是通过指数级甚至超指数级的病理模式进行的拒绝服务攻击!所以似乎要花很长时间才能解决。这些可能只显示在特定的输入数据上,但是通常可以创建一个这并不重要的输入数据。
哪些是正则表达式,在某种程度上取决于您正在使用的正则表达式编译器的智能程度,因为其中一些可以在编译期间检测到。实现递归的正则表达式编译器通常有一个内置的递归深度计数器来检查非递归。
Russ Cox 2007年关于正则表达式匹配可以是简单而快速的 (但在 Java、 Perl、 PHP、 Python、 Ruby 等语言中速度较慢,... ...) 谈到了大多数现代 NFA (似乎都源自 Henry Spencer 的代码)遭受严重性能下降的方式,但 Thompson 风格的 NFA 没有这样的问题。译注:
如果您只承认 DFA 可以解决的模式,那么您可以这样编译它们,它们将运行得更快,甚至可能更快。然而,这需要 时间来完成。Cox 论文提到了这种方法及其相关问题。这一切都归结为典型的时空交换。
使用 DFA 时,您需要花费更多的时间来构建它(并分配更多的状态) ,而使用 NFA 时,您需要花费更多的时间来执行它,因为它可以同时处于多个状态,而回溯可能会吃掉您的午餐ーー和您的 CPU。
也许最合理的解决这些模式的方法是用一个计时器将它们包裹起来,有效地为它们的执行留出最长的时间。通常这比大多数 HTTP 服务器提供的默认超时要少得多。
有各种各样的方法来实现这些,从 C 级的简单 alarm(N),到某种类型的 try {}阻止捕获警报类型的异常,一直到产生一个新的线程,这个线程是专门创建的,内置了一个时间限制。
alarm(N)
try {}
在允许代码调用的正则表达式语言中,提供了一些允许或不允许编译 应该的字符串调用这些代码的机制。即使代码调出只针对您所使用的语言中的代码,您也应该限制它们; 它们不必能够调用外部代码,尽管如果它们可以,那么您就会遇到更大的问题。
例如,在 Perl 中,不能在由字符串插值创建的正则表达式中使用代码调出(就像这样,因为它们是在运行时编译的) ,除非当前作用域中的特殊词法作用域的杂注 use re "eval";处于活动状态。
use re "eval";
这样就不会有人偷偷地插入代码调用来运行像 rm -rf *这样的系统程序。因为代码调出对安全性非常敏感,所以 Perl 默认情况下会在所有插入的字符串上禁用它们,您必须特意重新启用它们。
rm -rf *
还有一个与 Unicode 风格的属性(如 \pM、 \p{Pd}、 \p{Pattern_Syntax}或 \p{Script=Greek})相关的安全敏感问题,梅存在于某些支持这种表示法的正则表达式编译器中。
\pM
\p{Pd}
\p{Pattern_Syntax}
\p{Script=Greek}
问题在于,在其中一些情况下,可能的属性集是用户可扩展的。这意味着您可以拥有自定义属性,这些属性是某些特定名称空间(如 \p{GoodChars}或 \p{Class::Good_Characters})中命名函数的实际代码调用。您的语言如何处理这些问题可能值得一看。
\p{GoodChars}
\p{Class::Good_Characters}
在 Perl 中,通过 Safe模块使用沙箱隔间可以控制名称空间的可见性。其他语言也提供了类似的沙箱技术。如果这些设备可用,您可能需要查看它们,因为它们是专门为不受信任代码的有限执行而设计的。
Safe
您不仅需要关心匹配本身,还需要关心如何进行匹配。例如,如果你的输入在进入正则表达式引擎的过程中经历了一些 eval 阶段或者指令替代,那么模式中可能会执行一些代码。或者,如果您的正则表达式语法允许嵌入命令,那么您也必须对此保持警惕。由于您没有在问题中指定语言,因此很难确切地说明所有的安全隐患是什么。
你会想读这篇文章的:
不安全上下文切换: 为可生存性接种正则表达式 这篇文章更多的是关于正则表达式引擎(例如 PCRE)可能出错的地方,但是它可以帮助你理解你面对的是什么。
为基督的完美答案增添一笔: 编写“正则表达式”页面的同一个 Russ Cox 也发布了代码!Re2是一个 C + + 库,它保证 O (length _ of _ regex)运行时和可配置的内存使用限制。它在 Google 中使用,因此您可以在 Google 代码搜索中输入正则表达式——这意味着它已经经过了战斗测试。
微软最近发布的 模糊工具是测试正则表达式安全性问题的一个好方法(至少对 Windows 而言)。这可以帮助避免病态糟糕的正则表达式构造。