2011-11-22 27 views
5

系統調用我有以下CGI腳本:如何解除污染在CGI.pm

#!/usr/bin/perl -T 
use strict; 
use warnings; 
use CGI::Carp qw(fatalsToBrowser); 
use CGI qw/:standard/; 
my $query = CGI->new(); 
my $searchterm = param('name'); 

my $file = "justafile.txt"; 
# Begin searching terms and ignoring case 
my @entries = `grep -i \"$searchterm\" $file`; # Line10 
chomp @entries; 
# Do something 

當我執行命令它給了我這個

Insecure dependency in `` while running with -T switch at /foo/cgi-bin/mycode.cgi line 10. 

如何線路10可以是固定的?

回答

5

使用內置grep功能,如:

open my $fh, '<', $file or die $!;  
my @entries = grep /$searchterm/i, <$fh>; 
+4

+1。當有更好的方法來達到理想的結果時,爲什麼要使用系統命令。 – flesk

3

-T交換機僅發出警告,可能受污染的輸入:http://perldoc.perl.org/perlsec.html#Taint-mode

你需要自己解除污染它,例如使用

my $safe_searchterm = ""; 
$safe_searchterm .= $_ for $searchterm =~ /\w+/g; 

雖然這不是一個非常複雜的測試,也可能不太安全,除非你有c完全控制什麼\w匹配。

編輯:更改我最小的解決方案,以反映下面評論中給出的信息。

+1

或者做一些匹配:my($ untaint_data)= $ td =〜m/^ \ s *(\ w +)\ s * $/;. – XoR

+4

替換不會使值變異。只從捕獲的正則表達式組中分配('($ untainted)= $ tainted =〜/(pattern)/;','$ tainted =〜/(pattern)/; $ untainted = $ 1;')將會隱藏表達式。請參閱['perlsec'](http://search.cpan.org/perldoc?perlsec)中的「洗錢並檢測受感染的數據」。 – mob

+0

@mob:感謝您的信息。 +1。 – flesk

3

我認爲這裏的問題是反引號操作符有效地執行perl環境以外的代碼,因此非常不可信,即。污點。

你可以,當然,嘗試出錯的行前做這樣的事情:

$ENV{"PATH"} = ""; 

你仍然可能會從該行得到一個錯誤:

my $file = "justafile.txt"; 

爲了解決這個問題,你可能只是給它一個絕對路徑,例如:

my $file = "/home/blah/justafile.txt"; 

你幾乎肯定必須給出你正在用反引號操作符執行的grep命令的絕對路徑,因爲清除環境變量將會丟失路徑。換句話說做到:

# Begin searching terms and ignoring case 
my @entries = `/bin/grep -i \"$searchterm\" $file`; # Line10 

您可能還需要之前,你清楚它的$ENV值複製,以防萬一你需要它後...

希望一些這有助於!

+2

概念性錯誤:數據受到污染,而不是對它們進行的操作。看到下面的輸出:'perl -T -MDevel :: Peek -e'Dump \ @ARGV'「我莊嚴地發誓我沒有任何好處。」' – daxim

8

污點的要點是確保未經檢查的輸入不能提供給可能不安全的功能。

在這種情況下,您的$searchterm變量可能包含意外輸入,可能允許攻擊者在您的系統上執行任意程序。

因此,您可能需要:

  1. 解除污染通過確保預先確定的正則表達式匹配的變量(見@ flesk的答案),在這一點的Perl假設你知道你或者

  2. 不要使用反引號(per @eugene y的答案)。

如果你使用反引號,這樣你不依賴於$PATH正在你也應該指定完整路徑grep命令。