Каковы проблемы безопасности при оценке кода пользователя? - PullRequest
5 голосов
/ 25 сентября 2008

Мне интересно, какие проблемы безопасности существуют при реализации PHP evaluator, подобного этому:

<?php eval($_POST['codeInput']); %>

Это в контексте создания PHP sandbox, поэтому дезинфекция против DB input и т. Д. Не является большой проблемой.

Пользователи, уничтожающие сервер, на котором размещен файл, - это *. 1009 *

Я видел Ruby simulators, поэтому мне было любопытно, что касается безопасности (по крайней мере, неопределенные детали).


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

Ответ Оуэна обобщает то, что я подозревал (сам сервер был бы в опасности).

ответ Арина дает отличный пример потенциальных проблем.

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

Ответы [ 9 ]

18 голосов
/ 25 сентября 2008

не делай этого.

они в основном имеют доступ ко всему, что вы можете делать в PHP (просматривать файловую систему, получать / устанавливать любые переменные, открывать соединения с другими машинами, вставлять код для запуска и т. Д ...)

6 голосов
/ 11 апреля 2009

Функцию eval() сложно дезинфицировать, и даже если бы вы это сделали, наверняка найдется способ ее обойти. Даже если вы отфильтровали exec, все, что вам нужно сделать, это как-то склеить строку exec в переменную, а затем сделать $variable(). Вам нужно было бы по-настоящему исказить язык, чтобы достичь хотя бы какой-то воображаемой безопасности.

5 голосов
/ 26 сентября 2008

потенциально может быть очень большой проблемой, если вы eval() что-то вроде

<?php
   eval("shell_exec(\"rm -rf {$_SERVER['DOCUMENT_ROOT']}\");");
?>

это крайний пример, но в этом случае ваш сайт просто будет удален. надеюсь, ваши разрешения этого не позволят, но это помогает проиллюстрировать необходимость санитарии и проверок.

4 голосов
/ 25 сентября 2008

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

4 голосов
/ 25 сентября 2008

Есть много вещей, которые вы могли бы сказать .. Проблемы не относятся к PHP.

Вот простой ответ:

Любые входные данные для вашего компьютера (или базы данных) должны быть обработаны.

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

Здесь есть довольно хорошая вводная статья о внедрении кода:

Википедия по внедрению кода .

3 голосов
/ 26 сентября 2008

Если вы хотите создать онлайновый интерпретатор PHP , вам необходимо создать реальный REPL интерпретатор и не использовать eval.

В противном случае никогда не выполняйте произвольный код пользователя. Когда-либо.

3 голосов
/ 26 сентября 2008

Дорогой Бог НЕТ . Я съеживаюсь даже в названии. Позволить пользователю запускать произвольный код любого типа - все равно что передать ему сервер

Я знаю, что люди выше меня уже говорили это. Но поверь мне. Этого никогда не бывает достаточно, чтобы кто-то мог сказать вам, чтобы очистить ваш вклад.

Если вы действительно, действительно хотите разрешить пользователю запускать какой-то код. Сделайте подмножество команд доступными для пользователя, создав своего рода псевдо-язык, который пользователь может использовать для этого. А-ля как работает bbcode или уценка.

2 голосов
/ 26 сентября 2008

Do NOT разрешить выполнение нефильтрованного кода на вашем сервере, точка.

Если вы хотите создать инструмент, который позволяет интерактивно демонстрировать язык, такой как инструмент, показанный здесь: http://tryruby.hobix.com/ Я бы сам занялся кодированием части языка В идеале вы будете использовать его для демонстрации простых концепций новым программистам, поэтому не имеет значения, правильно ли вы реализуете все функции.

Этим вы можете управлять входом через белый список известных допустимых входных данных. Если ввод не находится в белом списке, он не выполняется.

Удачи!

0 голосов
/ 25 сентября 2008

Как уже ответили, вам нужно санировать ваши входные данные. Я полагаю, вы могли бы использовать некоторую регулярную фильтрацию регулярных выражений для удаления нежелательных команд, таких как «exec» и, в основном, каждую вредоносную команду, которую PHP может предложить (или которую можно использовать), и это очень много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...