2011-05-07 80 views
2

這是否足以安全地防止未定義的變量進入我的腳本?正則表達式安全

# Find the name of the VMXF file 
$getfilelayout =~ /^ \s+ " (?<vmxf_file> .+\.vmxf) " /xm; 

if ("$+{vmxf_file}" eq '') { 
    $vmxf_file = 'undef'; 
} else { 
    $vmxf_file = "$+{vmxf_file}"; 
    $vmxf_file = $ssh_obj->capture("find -name $vmxf_file"); 
} 

如果不是,我還能做什麼?

+1

@mu太短,這似乎是訪問名爲反向引用[Perlretut#命名的反向引用(http://perldoc.perl.org/perlretut.html#Named-backreferences) – stema 2011-05-07 20:35:10

+0

你不應該的方式假設匹配成功了,所以把它放在'if'中。此外,您不必引用您的命名捕獲:'$ + {vmxf_file}'檢索它就好了。 – tchrist 2011-05-07 23:04:37

+0

@ tchrist,我不必引用捕獲?涼。我原本在if語句裏面有過匹配,但似乎沒有必要,但現在看着你的輸入,我可以看到爲什麼會更好。 – ianc1215 2011-05-08 03:20:35

回答

4

你不應該假定匹配成功,所以把它放在if。此外,你不必引用你的命名捕獲:$+{vmxf_file}檢索它就好了。在這裏,我假定文件名沒有空格或引號的:

use 5.010; 

if ($getfilelayout =~ /^ \h+ " (?<vmxf_file> ["\s]+ \.vmxf) " /xm) { 
    $captcha = $+{vmxf_file}; 
    $found = $ssh_obj->capture("find -name $captcha"); 
} 

「安全」問題是,你不知道什麼樣的metachars都在拍攝。正確的方法是使用更多的東西

system("find", "-name", $captcha); 

但這不會捕獲您的輸出。我不認爲SSH協議允許安全的炮擊,但我不知道。你在用什麼課?

+0

whats'h +'做什麼?還沒有見過那個。 – ianc1215 2011-05-08 03:16:34

+0

我必須使用SSH,因爲正在匹配的數據不會駐留在我的網絡上的VMware服務器上的本地主機上。 – ianc1215 2011-05-08 03:17:37

+0

他可能使用Net :: OpenSSH支持「安全炮擊」 – salva 2011-05-09 08:26:44

1
# An undefined variable might not be your only worry!?! 
my $getfilelayout = q{ " '*' | xargs rm ; echo .vmxf" }; 

# A regex in list context returns the captures. 
# IMHO, this seems cleaner than what you've got. 
my ($vmxf_file) = $getfilelayout =~ /^\s+ "(.+\.vmxf)"/xm; 

# Proceed accordingly. 
if (defined $vmxf_file){ 
    ... 
} 
+0

Oo我喜歡這樣,所以變量只在匹配成功時才被定義。 – ianc1215 2011-05-08 03:15:12