Безопасность регулярных выражений - PullRequest
2 голосов
/ 07 мая 2011

Этого достаточно для предотвращения попадания неопределенной переменной в мой сценарий?

    # 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");
}

Если нет, что еще я мог бы сделать?

Ответы [ 2 ]

4 голосов
/ 08 мая 2011

Вы не должны предполагать, что совпадение прошло успешно, поэтому поместите его в if.Кроме того, вам не нужно цитировать ваши именованные снимки: $+{vmxf_file} получает это просто отлично.Здесь я предполагаю, что в имени файла нет пробелов или кавычек:

use 5.010;

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

Проблема «безопасности» заключается в том, что вы не знаете, какие метасхемы находятся в перехвате.Правильный способ - использовать что-то более похожее на

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

, но это не фиксирует ваш вывод.Я не думаю, что протокол ssh обеспечивает безопасный обстрел, но я не знаю.Какой класс вы используете?

1 голос
/ 08 мая 2011
# 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){
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...