Perl: безопасный eval? - PullRequest
       4

Perl: безопасный eval?

4 голосов
/ 05 февраля 2012

Мне любопытно, есть ли какая-либо хорошая информация о выполнении ограниченных уловок.

Глядя на документы, есть use Safe, у которого есть метод reval, но я не уверен, насколько это безопасно.

Что я хочу сделать, так это бытьвозможность передавать различные условные операторы в виде строки в функцию без источника, злоупотребляющего eval.

Например:

sub foo {
   my $stmt = shift;
   my $a    = 3;
   say eval($stmt)?"correct":"wrong") , "($stmt)";
}

foo( q{1  == $a} );
foo( q{$a =~ /3/ );
foo( q{(sub {return 3})->() eq 3}  );

Подойдет ли use Safe для этого?Все, что мне нужно, - это сравнение, отсутствие доступа к диску или манипуляции с переменными.

1 Ответ

4 голосов
/ 05 февраля 2012

Как указано в документах , eval($stmt) оценивает $stmt "в лексическом контексте текущей программы Perl, так что любые настройки переменных или определения подпрограмм и форматов остаются впоследствии".Это полезно для задержки выполнения $stmt до времени выполнения.

Если вы reval($stmt) в Safe отделении, по сути, происходит то же самое, оператор eval'd, но этоeval'd в новом лексическом контексте, который может видеть только пространство имен Безопасного отсека и в котором вы можете контролировать, какие виды операторов разрешены.

Так что, да, если вы объявляете Безопасное отделение и reval($stmt)в этом отсеке (а) выполнение $stmt не изменит функционирование вашей программы без вашего согласия (я думаю, это то, что вы подразумеваете под «без источника, злоупотребляющего eval»).И, (b) да, $stmt не сможет получить доступ к диску без вашего согласия, если вы reval($stmt).В (а) «ваше согласие» требует явной игры с таблицей символов, а в (б) «ваше согласие» потребует указания набора кодов операций , которые позволят получить доступ к диску.

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

...