Perl webscript令人怀疑的安全性

时间:2015-04-15 19:25:40

标签: perl security cgi-bin

最近,在一个项目中,我继承了一个生成页面PDF的简单perl脚本:

#!/usr/bin/perl
use CGI;

my $file="showdata.pdf";
my $filepath= "/tmp/$file";
system("wkhtmltopdf \"sample.com/showdata.php?".$ENV{"QUERY_STRING"}."\" $filepath");
print ("Content-Type:application/x-download\n");
print ("Content-Disposition: attachment; filename=$file\n\n");

open FILE, "< $filepath" or die "can't open : $!";
binmode FILE;
local $/ = \10240;
while (<FILE>){
    print $_;
}

close FILE;
unlink ($filepath);

我担心直接替换变量$ ENV {“QUERY_STRING”}。但是,在粗略的测试中,我没有发现任何问题。我无法在已知的可写目录中创建/删除文件。我试过不好或脚本中的问题不应该?

3 个答案:

答案 0 :(得分:1)

是的,那是不安全的。如果QUERY_STRING是"; rm -fr /;怎么办?

然后您的system电话会是:

wkhtmltopdf "sample.com/showdata.php?"; rm -fr /; /tmp/showdata.pdf

答案 1 :(得分:1)

直接访问$ ENV {“QUERY_STRING”}是不安全的。在我的情况下,我的数字参数'o'必须强制为整数。有安全的脚本版本:

#!/usr/bin/perl
use CGI;
my $query = new CGI;
my $o = int($query->param('o'));
my $file="showdata.pdf";
my $filepath= "/tmp/$file";
system("wkhtmltopdf \"sample.com/showdata.php?o=".$o."\" $filepath");
print ("Content-Type:application/x-download\n");
print ("Content-Disposition: attachment; filename=$file\n\n");

open FILE, "< $filepath" or die "can't open : $!";
binmode FILE;
local $/ = \10240;
while (<FILE>){
    print $_;
}

close FILE;
unlink ($filepath);

答案 2 :(得分:1)

如果您担心安全问题,请使用污点选项-T运行Perl脚本。

例如,以下脚本将停止脚本并发出警告:Insecure $ENV{PATH} while running with -T switch at ./foo.pl line 4.

#!/usr/bin/perl -T

my $foo = $ENV{FOO};
system("ls -l $foo");

注意:如果您只是需要警告,可以使用选项-t代替-T