Можно ли на PHP сделать "Песочницу"? Т.е. подключить с помощью include и выполнить PHP код, не давая ему доступа к внешним переменным, а также к некоторым функциям.
Прочитал.. не помогло. Скрипт: PHP: <? /* ... //здесь идет код основной программы (не ООП) ... */ require ("./возможно, опасный для исполнения код.php"); ?> Как код, который запускается require-ом, ограничить в правах?
Сделать основной код защищенным, т.е. protected или private. Иначе, если он public, к нему будет доступ "отовсюду"...
Так. Идея с подключением стороннего кода была "послана", ибо код располагается на стороннем сервере, а это не есть хорошо. А все-таки. Если бы я подключал сторонний код, к редактированию которого у меня нет доступа, как можно было бы запретить ему выполнять, например, mail() после включения в мой скрипт посредством require ? Причем, отключать mail() глобально нельзя - она используется основным кодом выше
Ну, тут есть только один вариант. Это брать исходник включаемого файла, парсить его и выполнять функцией eval()...
X-Cray, да никак. P.S. require и include -- по сути одно и тоже, разница лишь в том как они себя ведут если самого файла нету...
На этом я и остановился перед тем, как спросить на форуме. Ладно. Спасибо. Тему можно закрывать, я думаю.
не дошло до меня, сорри. А как это решит поставленную задачу? что коду внутри eval переменные и функции недоступны?
Нет. Просто перед тем, как выполнить, текст кода заносится в переменную, например, $a, парсится вручную на наличие "гадости", а после, если все Ок, выполняется eval($a);
В функции eval() может быть все, что допустимо в сценариях: - Ввод/вывод, в том числе закрытие и открытие тэгов <? и ?>; - Управляющие инструкции: циклы, условные операторы и т.д. - объявления и вызовы функций; - вложенные вызовы функции eval(). А так же: -Код в eval() будет использовать те же глобальные переменные, что и вызвавшая программа. - Любая критическая ошибка приведет к завершению работы всего сценария.
X-Cray может все таки не стоит заниматься такой фигней? Это ж просто рай для взломщика... Кто прознает, будет соревноваться с тобой в невнимательности =)) Вспомнил ли ты про это, а про то? Потом у тебя парсер до нескольких мегабайт сможет разрастись =)
X-Cray, так а просто получить вывод от того скрипта посредством virtual не пойдет? это конечно никак не ограничит гада в правах, но хотябы изолирует его от "наших" переменных и т.п.
Тогда курение не поможет =)) На мой взгляд, лучше вообще не стоит подпускать никого кроме себя к выполнению на своей стороне...
Позвольте, развеять Ваше заблуждение - разница есть и достаточно большая. 1. При подключении через require можно получить только 1 или 0 - подключен файл или нет. При подключении через include можно получить результат подключения. пример PHP: <?php //filename = 'test.inc' return "TEST.INC"; ?> <? //filename = 'test.php' print 'Include: '.include('test.inc'); print 'Require: '.require('test.inc'); ?> 2. Что то слышал про то что при подключении через include и require существует разница в том, что при подключении через include скрипт "приостанавливается" для подключения, при подключении через require скрипт сначала подключает, потом выполняется - практического подтверждения данного слуха я не нашел, и в доках не копался, поэтому будем считать это слухом. Теперь, X-Cray Я так понимаю, что раз Вы намерены подключать сторонний сскрипт - вы хотите его подключать не слишком часто. Как вариант могу предложить решение - с подключением его через "иную" сборку пхп, то есть вариант сборки пхп отличный от того по которым работает основная система. То есть тупо запускать сторонний скрипт на другой версии пхп, а то что получится в выводе, брать как результат работы скрипта.
в 5.1.2 cli ваш пример кстати нормально выводит "TEST.INC" и там и там... попытка неудалась а про "2" -- это такоой бред, что даже возражать на него нечего
avm, по первому пункту похоже я сам находился в заблуждении, проверил на 5.2.0 и на 4.3.3 - функции выводят ретурн одинакого. по поводу второго пункта, цитата со страницы на которую вы дали ссылку. Меня терзают подозрения что и первый пункт следует тестить на версиях 4.0.х, но как мы понимаем - я дико отстал в знаниях по этому вопросу, даже не знаю у какого изврахенца может быть установлен тот же 4.0.2
vb, точно. Вспоминаю было такое в php3... поэтому и не использовал это тогда. Надо же как крепко забылось!...