2015-04-15 39 views
1

最近有一個項目,我繼承了生成頁面的PDF一個簡單的Perl腳本:的Perl webscript懷疑安全

#!/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」}。但是,在粗略測試中,我沒有發現任何問題。我無法在已知的可寫目錄中創建/刪除文件。我試過的不好或腳本中的問題不應該是?

回答

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); 
1

是的,這是不安全的。如果QUERY_STRING是"; rm -fr /;,該怎麼辦?

然後你system電話是:

wkhtmltopdf "sample.com/showdata.php?"; rm -fr /; /tmp/showdata.pdf 
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