在哪种语言中使用用户提供的正则表达式是一个安全漏洞?

Rya*_*son 12 regex security language-features

编辑:tchrist告诉我,我对Perl不安全的原始指责是没有根据的.但问题仍然存在.

我知道在Perl中,你可以在正则表达式中嵌入任意代码,因此显然接受用户提供的正则表达式并匹配它允许任意代码执行并且是一个明显的安全漏洞.但对于使用正则表达式的所有语言都是如此吗?所有使用"Perl兼容"正则表达式的语言都适用吗?在哪些语言中,用户提供的正则表达式是否可以安全使用,以及哪些语言允许任意代码执行或其他安全漏洞?

Wol*_*lph 17

在大多数语言中,允许用户提供正则表达式意味着您允许拒绝服务攻击.

某些类型的正则表达式执行起来非常麻烦.因此,一般来说,允许用户输入将在远程系统上执行的正则表达式是个坏主意.

有关详细信息,请阅读此页:http://www.regular-expressions.info/catastrophic.html

  • 我不能同意"一般来说,让用户输入正则表达式是一个坏主意"的一部分.也许对于网络应用程序来说也是如此,但我不认为这是适用于所有软件的一般规则.如果我们的工具不允许我们使用正则表达式进行搜索,那么我们作为程序员会在哪里? (2认同)
  • @Bryan Oakley:当您在本地计算机上使用这些工具时,安全性如何成为一个问题?你已经在执行一个程序,在这种情况下,从正则表达式执行某些东西似乎不是一个问题.我相信这里的问题是指向远程执行,在这种情况下,代码执行和DoS攻击都是相关的. (2认同)

tch*_*ist 6

这是不正确的:在Perl通过在评估正则表达式潜入他们,你不能执行代码回调.这是被禁止的.您必须使用词法范围专门覆盖它

use re "eval";
Run Code Online (Sandbox Code Playgroud)

如果你希望拥有既插和代码逃逸发生在相同的模式.

看:

% perl -le '$x = "(?{ die 'naughty' })"; "aaa" =~ /$x/'
Eval-group not allowed at runtime, use re 'eval' in regex m/(?{ die naughty })/ at -e line 1.
Exit 255

% perl -Mre=eval -le '$x = "(?{ die 'naughty' })"; "aaa" =~ /$x/'
naughty at (re_eval 1) line 1.
Exit 255
Run Code Online (Sandbox Code Playgroud)