Regex perl'有什么问题吗;s/。/../e?
我在搜索与python的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
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
字符串,但我不相信该方法的安全性,尽管我无法找到任何可能的漏洞
当然,/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”
(不安全)。