Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | |
Круто, век живи, век учись (это я про tokenizer). 06.03.06 18:09 Число просмотров: 3087
Автор: paganoid Статус: Member Отредактировано 06.03.06 18:23 Количество правок: 1
|
|
<web building>
|
Предварительная фильтрация PHP кода - как разрешить только алгоритмические команды? 03.03.06 18:08
Автор: xintrea Статус: Незарегистрированный пользователь
|
Здравствуйте.
Вот у меня тут есть такой вопрос, не совсем обычный...
Можно ли (и если можно, то каким образом) сделать так, чтобы на сайте с языком PHP
существовал раздел, который бы позволял любому пользователю добавлять PHP-код
и сразувыполнятьего. Причем от языка PHP нужно разрешить только "алгоритмическую"
часть, то есть разрешить в коде использовать только
- работу с переменными
- работу с массивами
- функции, определенные в текущем коде
- вывод print или echo
- (опционально) математические функции
Возможные проблеммы зацикливания чужого кода, проблеммы потенциально возможных
больших массивов можно пока не рассматривать.
Так вот сам вопрос - можно ли такую вещь как-нибудь сделать?
Конечно, понятно, что такой раздел на сайте - огромнейшая дыра и потенциальная угроза,
причем ещо какая. Но вот может быть всеже есть возможность сделать такую вещь
без сильного нарушения безопасности?
Из возможных путей я пока вижу несколько -
- Предварительно фильтровать PHP код на наличие недопустимых функций
и не позволять его запускать. Список недопустимых функций будет весьма большой,
и будет зависеть от подключенных модулей... Так что все учесть сложно...
- Проанализировать код на наличие описания функций (Это более-менее просто).
Просканировать код и определить все места вызова функций (кстати, как правильно
это сделать?). Если вызывается неописанная функция, не разрешать код к запуску...
- Комплексный подход средствами UNIX и PHP. Выделить директорию, выход из которой
для php скриптов невозможен (это вообще реально сделать?). Назначить права для
предотвращения записи внутри директории с такими скриптами. Это ограничит файловые
функции скриптов пользователей. Обрезать опции по самые яйца в php.ini (а что там можно
реально обрезать?).
(Дополнительные условия - все должно работать на обычном UNIX хостинге без
экзотических конфигураций.. То есть, иметь два транслятора php или два файла
php.ini -для обыной части сайта и для "защищенной" - ни один админ не будет с
этим ковыряться.)
У кого есть какие соображения по этому поводу? В каком направлении копать?
|
|
опции memory_limit и max_execution_time спасут. 04.03.06 20:26
Автор: paganoid Статус: Member
|
> Здравствуйте. > > Вот у меня тут есть такой вопрос, не совсем обычный... > > Можно ли (и если можно, то каким образом) сделать так, > чтобы на сайте с языком PHP > существовал раздел, который бы позволял любому пользователю > добавлять PHP-код > и сразувыполнятьего. Причем от языка PHP нужно > разрешить только "алгоритмическую" > часть, то есть разрешить в коде использовать только > > - работу с переменными > - работу с массивами > - функции, определенные в текущем коде > - вывод print или echo > - (опционально) математические функции > > Возможные проблеммы зацикливания чужого кода, проблеммы > потенциально возможных > больших массивов можно пока не рассматривать.
опции memory_limit и max_execution_time спасут.
> > Так вот сам вопрос - можно ли такую вещь как-нибудь > сделать? > Конечно, понятно, что такой раздел на сайте - огромнейшая > дыра и потенциальная угроза, > причем ещо какая. Но вот может быть всеже есть возможность > сделать такую вещь > без сильного нарушения безопасности? > > Из возможных путей я пока вижу несколько - > > - Предварительно фильтровать PHP код на наличие > недопустимых функций > и не позволять его запускать. Список недопустимых функций > будет весьма большой, > и будет зависеть от подключенных модулей... Так что все > учесть сложно...
Есть какая-то "виртуальная машина" для PHP, посмотри на их сайте. Внутри этой машины
можно попробовать установить ограниченный список модулей, требуемый safe mode.
> > - Проанализировать код на наличие описания функций (Это > более-менее просто). > Просканировать код и определить все места вызова функций > (кстати, как правильно > это сделать?). Если вызывается неописанная функция, не > разрешать код к запуску...
В этом варианте навскидку видится только декомпилятор. В качестве другого более менее приемлемого решения - сделать на код highlight с помощью встроенной PHP функции, т.о. найти фрагменты именно кода, а там уже preg-ом. Кстати все равно preg будет хватать лишнее (названия ф-й внутри переменных и комментариев).
> > - Комплексный подход средствами UNIX и PHP. Выделить > директорию, выход из которой > для php скриптов невозможен (это вообще реально сделать?). > Назначить права для > предотвращения записи внутри директории с такими скриптами. > Это ограничит файловые > функции скриптов пользователей. Обрезать опции по самые > яйца в php.ini (а что там можно > реально обрезать?).
См. php safe mode - в нем можно задать опцию open_base_dir - откуда php может читать файлы. Там же можно обрезать список разрешенных функций. Сам список достаточно просто получить через get_defined_function или что-то вроде там такое есть.
> > (Дополнительные условия - все должно работать на обычном > UNIX хостинге без > экзотических конфигураций.. То есть, иметь два транслятора > php или два файла > php.ini -для обыной части сайта и для "защищенной" - ни > один админ не будет с > этим ковыряться.)
Версия - обычный PHP - в виде модуля, а "песочница" - через интерпретатор, урезанный с помощью php.ini. И выполнять чужие скрипты только через этот через интерпретатор. Кстати, приблизительно так иногда делают для crontab скриптов.
> > У кого есть какие соображения по этому поводу? В каком > направлении копать?
|
| |
Ага, это обязательно. 06.03.06 15:33
Автор: xintrea Статус: Незарегистрированный пользователь
|
> опции memory_limit и max_execution_time спасут.
Ага, это обязательно.
> - Проанализировать код на наличие описания функций > (Это более-менее просто). Просканировать код и определить все места вызова > функций (кстати, как правильно это сделать?). Если вызывается неописанная функция, не > разрешать код к запуску... > > В этом варианте навскидку видится только декомпилятор. В > качестве другого более менее приемлемого решения - сделать > на код highlight с помощью встроенной PHP функции, т.о. > найти фрагменты именно кода, а там уже preg-ом. Кстати все > равно preg будет хватать лишнее (названия ф-й внутри > переменных и комментариев).
Для этого мне посоветовали использовать токенайзер http://www.php.net/tokenizer,
это оказывается встроенный лексический анализатор PHP-кода, доступный
по умолчанию в PHP, начиная с версии 4.3.0
> См. php safe mode - в нем можно задать опцию open_base_dir > - откуда php может читать файлы. Там же можно обрезать > список разрешенных функций. Сам список достаточно просто > получить через get_defined_function или что-то вроде там > такое есть.
Спасибо, работа пошла.
|
| | |
Круто, век живи, век учись (это я про tokenizer). 06.03.06 18:09
Автор: paganoid Статус: Member Отредактировано 06.03.06 18:23 Количество правок: 1
|
|
|
|