Perl webscript 可疑的安全性
Perl webscript doubtful security
最近在一个项目中,我继承了一个生成页面 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 $/ = 240;
while (<FILE>){
print $_;
}
close FILE;
unlink ($filepath);
我担心直接替换变量 $ENV{"QUERY_STRING"}。但是,在粗略的测试中,我没有发现任何问题。我无法 create/delete 已知可写目录中的文件。我试了不好还是脚本有问题不应该?
是的,这是不安全的。如果 QUERY_STRING 是 "; rm -fr /;
怎么办?
那么您的 system
调用将是:
wkhtmltopdf "sample.com/showdata.php?"; rm -fr /; /tmp/showdata.pdf
直接访问 $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 $/ = 240;
while (<FILE>){
print $_;
}
close FILE;
unlink ($filepath);
如果您担心安全问题,运行 您的带有污点选项的 Perl 脚本 -T
。
例如,以下脚本将停止您的脚本并发出警告: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
。
最近在一个项目中,我继承了一个生成页面 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 $/ = 240;
while (<FILE>){
print $_;
}
close FILE;
unlink ($filepath);
我担心直接替换变量 $ENV{"QUERY_STRING"}。但是,在粗略的测试中,我没有发现任何问题。我无法 create/delete 已知可写目录中的文件。我试了不好还是脚本有问题不应该?
是的,这是不安全的。如果 QUERY_STRING 是 "; rm -fr /;
怎么办?
那么您的 system
调用将是:
wkhtmltopdf "sample.com/showdata.php?"; rm -fr /; /tmp/showdata.pdf
直接访问 $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 $/ = 240;
while (<FILE>){
print $_;
}
close FILE;
unlink ($filepath);
如果您担心安全问题,运行 您的带有污点选项的 Perl 脚本 -T
。
例如,以下脚本将停止您的脚本并发出警告: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
。