Безопасно ли выполнять публично введенные подстановочные выражения с помощью sed? - PullRequest
1 голос
/ 25 ноября 2011

Безопасно создать веб-форму, где пользователь может ввести команду sed, например:

s/\(.*\) *\(.*)/\2:\1/;s/$/end of line/;s/this/that/g

после отправки формы я хочу выполнить команду sed , например:

sed '<<string from the form>>' < FILE1 >FILE2

Это безопасно?Как правильно выполнять предоставленные пользователем команды sed с точки зрения безопасности?Что мне нужно проверить или как подготовить команду sed?

добавление режима вызова - значит что-то вроде этого - поэтому не будет работать через оболочку ...

use 5.014;
use warnings;
use autodie;

use FileHandle;
use IPC::Open2;
use File::Slurp;

my $sedcommand = 's/a/QQ/g';
my $input = read_file('inputfile.txt');
my $out = sed_edit($sedcommand, $input);
say $out;

sub sed_edit {
    my($command, $text) = @_;
    my($fromsed, $tosed);
    my $pid = open2($fromsed, $tosed, "sed", "$command" );
    print $tosed $text;
    close($tosed);
    my $result = <$fromsed>;
    close($fromsed);
    waitpid($pid, 0);
    return($result);
}

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Это очень сильно зависит от того, как вы выполняете команду.Если строка вида

p'; rm -rf /

будет выполнена так, что одинарная кавычка завершит кавычку sed, точка с запятой завершит команду, а остальная часть строки будет выполнена как новая команда, тогда вышланги.

1 голос
/ 25 ноября 2011

Если пользователь может ввести в строку все, что он захочет, и вы передадите эту строку без изменений в оболочку, чтобы он мог вставить ее в имеющуюся у вас командную строку sed, то нет, это небезопасно.(На самом деле, трудно сказать наверняка, не зная больше деталей реализации. Но вероятный ответ: небезопасно.)

Возможно, есть способы сделать это безопасным, но это потребовало бы многодетали реализации.

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

Это первый шаг, но, вероятно, это не последний шаг.

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