2013-04-21 52 views
2

我試圖使用污染模式。我想打開一個基於用戶輸入的文件並打開一個文件來讀取數據。下面是我的代碼讀取受污染模式下的文件時出錯

#!/usr/bin/perl -w 
use strict; 
use warnings; 

my $name = $ARGV[0]; 
my $file = "/Desktop/data/$name"; 

open MYFILE, "$file" or die $!; 


while (<MYFILE>) { 
    chomp; 
    print "$_\n"; 
} 
close(MYFILE); 

情況1)當我用perl的 -w filename.pl input.txt中 我能夠從文件中讀取數據運行文件。

情況2)當我改變

#!/usr/bin/perl -w 
to 
#!/usr/bin/perl -T 

和運行使用 的perl -T filename.pl input.txt中 我仍然可以讀取數據文件。

情況3)當我更改文件中寫入模式打開,並在被感染的模式下運行,我得到正確的輸出,

Insecure dependency in open while running with -t switch at test1.pl line 8. 

與案件兩種情況可能是什麼問題?或者這是一個正確的行爲?

它允許打開一個文件在污染模式閱讀?

回答

4

這是污染模式的正確行爲。 The documentation指定:

您不能使用從程序外部派生的數據來影響程序之外的其他內容 - 至少不是偶然的。

[...]

$arg = shift; # $arg is tainted

[...]

如果你嘗試做一些不安全的,你會得到一個致命錯誤,他說像 「不安全的依賴」 或「不安全的$ ENV {PATH}「。

(編輯:錯過了一些東西):

污染的數據可以不直接或間接用於在調用子殼任何命令,也不在修飾任何命令文件,目錄,或進程,但以下情況除外:

  • 對打印和syswrite的參數不檢查是否有污點。

(這就是爲什麼在讀出專用模式例子沒有抱怨文件數據。)

命令行參數是可能不安全的,因此被污染直至另有規定。

爲了確定數據是否被污染:

要測試變量是否含有污染的數據,並且其使用因此將觸發一個「不安全的依賴」的消息,則可以使用標量的污點()函數:: Util模塊,可在您附近的CPAN鏡像中找到,並從5.8.0版本開始包含在Perl中。

要解除污染數據:

[...]繞過污染機制的唯一方法是通過從正則表達式匹配參考的子模式。 Perl假定,如果你使用$1,$2等來引用子字符串,那麼當你編寫模式時,你知道自己在做什麼。這意味着使用一些想法 - 不要盲目地將任何東西解開,或者打敗整個機制。最好驗證變量是否只有好字符(對於某些「好」的值),而不是檢查它是否有任何不良字符。這是因爲錯過錯過你從未想過的壞字符太容易了。

(與use locale警告):

如果你正在寫一個區域識別程序,並要與含有\w正則表達式洗錢數據,在把no locale提前表達同一塊。有關進一步的討論和示例,請參閱SECURITY in perllocale

+0

我的意思是如果我使用受污染的數據在讀取模式下打開文件,那不會給我任何警告? – user1247412 2013-04-21 23:16:22

+0

等一下......除了模式之外,寫入模式代碼是否與讀取模式代碼完全相同? – michaelb958 2013-04-21 23:31:53

+0

是的,它是....而不是最後的打印數據。 – user1247412 2013-04-21 23:32:50

1

這可以防止以下從消滅你的硬盤驅動器:

perl script.pl '| rm -rf /' 

解決方案:使用的open的形式只接受一個文件名。

open(my $fh, '<', $ARGV[0]) 
+0

(我假設了一下,因爲當前版本的Perl不會爲你的代碼拋出一個錯誤的錯誤,直到你真的傳遞了類似'| ...'或'... |'的東西。 – ikegami 2013-04-22 00:10:19