最近,在一个项目中,我继承了一个生成页面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”}。但是,在粗略的测试中,我没有发现任何问题。我无法在已知的可写目录中创建/删除文件。我试过不好或脚本中的问题不应该?
答案 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
。