Perl-эквивалент PHP-кода - PullRequest
14 голосов
/ 09 июля 2010

Чтобы избежать использования строки в качестве аргумента оболочки, мы используем функцию escapeshellarg() в PHP. Perl имеет эквивалентную функцию?

Ответы [ 4 ]

31 голосов
/ 09 июля 2010

String::ShellQuote, но в большинстве случаев это не нужно. Вы можете просто избегать вызова оболочки путем тщательного программирования. Например, system принимает список аргументов вместо строки.

Лучшая практика:

use IPC::System::Simple qw(systemx);
systemx($command, @arguments);

require IPC::System::Simple;
use autodie qw(:all);
system([@allowed_exit_values], $command, @arguments);
3 голосов
/ 09 июля 2010

Perl может соответствовать следующей указанной функции:

добавляет одинарные кавычки вокруг строки и цитирует / экранирует любые существующие одинарные кавычки

http://php.net/manual/en/function.escapeshellarg.php#function.escapeshellarg

как это:

sub php_escapeshellarg { 
    my $str = @_ ? shift : $_;
    $str =~ s/((?:^|[^\\])(?:\\\\)*)'/$1'\\''/g;
    return "'$str'";
}
1 голос
/ 21 июня 2016

Это работает для меня в BASH:

sub escape_shell_param($) {
   my ($par) = @_;
   $par =~ s/'/'"'"'/g;  # "escape" all single quotes
   return "'$par'";      # single-quote entire string
 }

Он основан на следующих утверждениях, взятых из справочной страницы BASH:

  1. Заключение символов в одинарные кавычки сохраняет буквальное значение каждого символа в кавычках.
  2. Одиночная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратный слеш.
  3. Заключение символов в двойные кавычки сохраняет буквальное значение всех символов в кавычках, за исключением $, `, \, и, когда расширение истории включено,!.

Из (2.) мы знаем, что обратный слеш не может использоваться для экранирования одинарных кавычек, но из (3.) подразумевается, что двойные кавычки сохраняют буквальное значение (иначе говоря, экранирование) одинарных кавычек.

Также обратите внимание, что единственной целью кавычек является изменение значения символов в кавычках (не создаются специальные строковые объекты или подобные объекты), и после раскрытия все последовательные буквенные символы объединяются. Тогда 'foo''bar' совпадает с foobar.

То, что делает функция выше, состоит в том, чтобы заключить в кавычки всю строку, чтобы никакой символ в ней не имел специального значения. Однако, чтобы учесть наличие одинарных кавычек, строка разделяется, где бы такие символы не находились, и выполняются следующие операции: предыдущая подстрока завершается ('), затем вводится одинарная кавычка в двойных кавычках ( "'") и начинается следующая подстрока ('). Вот почему ' глобально заменяется на '"'"'.

Например (псевдокод):

foo'bar => 'foo' + "'" + 'bar'
1 голос
/ 26 апреля 2012

Я должен согласиться с @daxim.Но есть некоторые обстоятельства, когда вы не можете использовать это, как передача команды через сокет программе, которая не является perl или не имеет доступного модуля IPC.Я также посмотрел на регулярное выражение, данное @axeman, и это мне кажется немного сложным.Я могу ошибаться, но я думаю, что вам не нужно избегать обратной косой черты в одиночных кавычках для команды.Итак, вы можете просто сделать это:

sub escapeshellarg {
    my $arg = shift;

    $arg =~ s/'/'\\''/g;
    return "'" . $arg . "'";
}

Если у кого-то есть какая-либо причина, почему это может быть небезопасно, я хотел бы знать.Я протестировал его, используя любые хитрости, которые я мог придумать, чтобы заставить оболочку выполнять произвольный код, но безуспешно, что заставляет меня думать, что это регулярное выражение совпадает с реализацией PHP.

В реализации PHP говорится, что все, что он делает: добавляет одинарные кавычки вокруг строки и кавычки / экранирует любые существующие одинарные кавычки.

Это единственное, что делает это регулярное выражение.Мысли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...