Regex perl'有什么问题吗;s/。/../e?

Regex perl'有什么问题吗;s/。/../e?,regex,perl,security,Regex,Perl,Security,我在搜索与python的re.sub相当的Perl,根据文档repl可以是字符串,也可以是可调用的 我最终发现了perls/函数的e修饰符,它允许我执行以下操作: my $n = 1; sub repl { return $_[0] x $n ++; } my $hw = "hello world"; $hw =~ s/(l)/repl $1/eg; say $hw; 并获取helllo-worlld 从安全角度看,我觉得有点可疑。我假设Mallory可以控制$hw

我在搜索与python的
re.sub
相当的Perl,根据文档repl可以是字符串,也可以是可调用的

我最终发现了perl
s/
函数的
e
修饰符,它允许我执行以下操作:

my $n = 1;
sub repl {
    return $_[0] x $n ++;
}
my $hw = "hello world";
$hw =~ s/(l)/repl $1/eg;
say $hw;
并获取
helllo-worlld

从安全角度看,我觉得有点可疑。我假设Mallory可以控制
$hw
字符串,但我不相信该方法的安全性,尽管我无法找到任何可能的漏洞

当然,
/ee
修饰符本身就有问题:在中搜索“vendetta”一词以获得线索。double-
e
让我认为求值表达式(在本例中为
repl$1
)对应于隐式
eval('repl$1')

是这样吗

可能问题的例子
  • $hw=“foo-lish”
  • 让搜索的模式为
    /(f.*h)/
    (与整个
    foo-lish
    匹配)

我们显然已经调用了
repl(“foo-lish”)
,但您可能想知道是否将对
repl-foo-lish
进行评估。这有点模棱两可。这不是问题,但我的问题是类似模式可能存在的陷阱。

它不会导致任何数据变成代码。它只是告诉Perl将.pl文件的一部分作为Perl代码处理。因此,它不会带来任何安全问题

如果替换运算符是函数,则

s/pat/repl/     ⇒  substitute($_, qr/pat/, sub { qq/repl/ })
s/pat/repl()/e  ⇒  substitute($_, qr/pat/, sub { repl() })
这显然是完全正确的


进一步的证据是,一个人可以用
/e
做的任何事情都可以很容易地不用它来完成

s/pat/repl()/e
类似于

s/pat/${\( repl() )/
s/pat/eval "repl"/e

另一方面,
/ee
,可能是一个安全问题。数据可以变成代码

s/pat/repl/ee
类似于

s/pat/${\( repl() )/
s/pat/eval "repl"/e
问题在于替换模式插值[1]

$echo'打印“0wn3d\n”;|perl-e'$=;s/(*)/$1/ee'
0wn3d
我从不使用
/ee
,因为它掩盖了您使用
eval EXPR
的事实


  • 如果替换表达式不插值,则没有理由使用
    /ee

  • 你能详细说明一下吗?哪种情况?你的确切问题是什么?如果你问:我能用它射死我的腿吗?那我想你当然可以。通过调整你的更新,
    $hw=~s/(f.*h)/repl$1/e
    计算(执行)
    repl$1
    (安全),而
    $hw=~s/(f.*h)/repl$1/ee
    计算(执行)
    eval“repl$1”
    (不安全)。