用sed安全执行公开输入的替换正则表达式吗?

时间:2011-11-25 15:21:52

标签: forms security sed

安全制作一个webform,用户可以在其中输入sed命令,如:

s/\(.*\) *\(.*)/\2:\1/;s/$/end of line/;s/this/that/g

表单提交后我想执行 sed 命令,如:

sed '<<string from the form>>' < FILE1 >FILE2

这样安全吗?从安全角度来看,执行用户提供的sed命令的正确方法是什么?我需要检查什么或如何准备sed命令?

添加调用模式 - 意思是这样 - 所以不会通过shell运行...

use 5.014;
use warnings;
use autodie;

use FileHandle;
use IPC::Open2;
use File::Slurp;

my $sedcommand = 's/a/QQ/g';
my $input = read_file('inputfile.txt');
my $out = sed_edit($sedcommand, $input);
say $out;

sub sed_edit {
    my($command, $text) = @_;
    my($fromsed, $tosed);
    my $pid = open2($fromsed, $tosed, "sed", "$command" );
    print $tosed $text;
    close($tosed);
    my $result = <$fromsed>;
    close($fromsed);
    waitpid($pid, 0);
    return($result);
}

2 个答案:

答案 0 :(得分:2)

这在很大程度上取决于您执行命令的方式。如果是表格的字符串

p'; rm -rf /

将被执行,使得单引号终止sed引用,分号终止命令,其余的字符串作为新命令执行,然后你就被软管。

答案 1 :(得分:1)

如果用户可以在字符串中输入他们想要的任何内容,并且将未修改的字符串传递给shell,那么它可以将其插入到那里的sed命令行中,然后不,它不安全。 (实际上,如果不了解更多的实施细节,很难确定。但可能的答案是:不安全。)

可能有办法使这个安全,但这样做会涉及到很多实现细节。

也就是说,第一步可能是弄清楚用户应该允许输入的适当字符是什么,然后进行检查以确保他们在使用它之前只输入了包含这些字符的字符串。

这是第一步,但可能不是最后一步。