Все, что делает capturex
, это избавляет вас от необходимости создавать правильную команду оболочки. Некоторая проверка все еще может потребоваться.
Какие терминологии можно использовать для описания того, как код выполняется с capturex
?
Источник для последней версии IP C :: System :: Simple найден здесь .
В не Windows системах capturex
использует * 1017 Системные вызовы * и execve
через функции open(my $pipe, '-|')
и exec BLOCK LIST
Perl соответственно. Эта форма функции Perl exec
выполняет программу напрямую, а не вызывает оболочку.
exec "ls foo"; # Executes /bin/sh
exec { "/bin/sh" } "/bin/sh", "-c", "ls foo"; # Equivalent to previous.
exec { "ls" } "ls", "foo"; # Executes ls
На самом деле целесообразно использовать эту технику без ввода проверка (я предполагаю, что нет), и если нет, то по какой причине (вектор атаки)?
Что если вы предоставите относительный путь к программе для выполнения и пользователь установит PATH
env var используется?
Что если вы предоставите относительный путь к файлу в качестве аргумента, а пользователь установит текущий рабочий каталог?
Что если вы передадите строку, начинающуюся с -
? Это можно интерпретировать как вариант, а не аргумент. (Вот почему вы бы использовали 'ls', '--', $file
вместо 'ls', $file
.)
Что если вы передадите ../../../../../../etc/passwd
? Это может иметь нежелательный эффект, если программа использует аргумент в пути к файлу.
Что если вы передадите регулярное выражение в программу, и регулярное выражение займет больше времени, чем срок жизни юниверса, чтобы не соответствовать?
Возможно, что некоторая проверка все еще должна произойти. Все, что делает capturex
, - это избавляет вас от необходимости формировать допустимую команду оболочки.
Возможно, программа-получатель выполняет проверку, она может быть вашей или комбинацией.