gpt4 book ai didi

regex - 当用户输入右侧时,将 ee 修饰符安全地与 s///运算符一起使用

转载 作者:行者123 更新时间:2023-12-04 19:04:10 26 4
gpt4 key购买 nike

我正在编写一个 Perl 脚本,用户可以在其中输入正则表达式和替换字符串。该脚本将搜索一组文件并根据 perl s/// 应用更改。与用户输入一起应用的运算符。

稍微复杂一点的是,替换字符串允许包含反向引用以引用正则表达式中的捕获组。例如,如果正则表达式是 b(.*?)a并且替换字符串是 a$1b $1不应按字面处理,而应将评分者视为捕获第一组的反向引用。

在这个设置中,我想知道是否可以使用 ee修饰符(用于评估用户输入中的反向引用)安全地使用 s///当用户输入此运算符的右侧时,运算符?例如:

use strict;
use warnings;
my $str = 'abaaca';

my $replacement = 'do{ use Env qw(HOME); unlink "$HOME/important.txt" }';

$str =~ s/a(.*?)a/$replacement/gee;

会很不幸..但是后来我有了在转义双引号和美元符号(后面没有数字)之后引用用户输入(将其放在一对双引号内)的想法,然后进行替换:
use feature qw(say);
use strict;
use warnings;

my $str = 'abaaca';

my $replacement = shift;
$replacement =~ s/\"/\\\"/g;
$replacement =~ s/\$(?!\d)/\\\$/g;
$replacement = '"' . $replacement . '"';
$str =~ s/a(.*?)a/$replacement/gee;
say $str;

对我来说,这乍一看似乎有效,还是我错过了什么?
例如,如果脚本名为 test.pl用户将其运行为:
$ test.pl 'do{ "a$b" }'

输出是一个简单的字符串(并且没有计算代码):

do{ "a$b" }do{ "a$b" }



所以问题是:这真的是一种安全/正确的方法吗?

最佳答案

问题1:

没有办法用 $1 替换其次是 1因为以下替换为 ${1}1 .

$ script '${1}1'
${1}1${1}1

问题2:
$ script '\${ system "echo rm -rf /" }'
rm -rf /
Use of uninitialized value in substitution iterator at a.pl line 12.
rm -rf /
Use of uninitialized value in substitution iterator at a.pl line 12.

问题 3:
$ script '$1{ system "echo rm -rf /" }'
rm -rf /
Use of uninitialized value within %1 in string at (eval 1) line 1.
rm -rf /
Use of uninitialized value within %1 in string at (eval 2) line 1.

当然,还有其他人。解决方案:

使用 String::Substitution .

关于regex - 当用户输入右侧时,将 ee 修饰符安全地与 s///运算符一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29107353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com