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