информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеВсе любят медАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / web building
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Круто, век живи, век учись (это я про 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
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach