正则表达式 – 当用户输入右侧时,使用e //修饰符安全地使用s ///
发布时间:2020-12-14 05:59:54 所属栏目:百科 来源:网络整理
导读:我正在编写一个Perl脚本,用户可以在其中输入正则表达式和替换字符串.该脚本将搜索一组文件,并根据应用用户输入的perl s ///运算符应用更改. 为了使问题稍微复杂化,允许替换字符串包含反向引用以引用正则表达式中的捕获组.例如,如果正则表达式是b(.*?)a且替
我正在编写一个Perl脚本,用户可以在其中输入正则表达式和替换字符串.该脚本将搜索一组文件,并根据应用用户输入的perl s ///运算符应用更改.
为了使问题稍微复杂化,允许替换字符串包含反向引用以引用正则表达式中的捕获组.例如,如果正则表达式是b(.*?)a且替换字符串是$1b,那么$1不应该按字面意思处理,而是作为对第一组捕获的反向引用. 在这个设置中,我想知道当用户输入此操作符的右侧时,是否可以使用s ///运算符安全地使用ee修饰符(以评估用户输入中的反向引用)?例如: 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 '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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |