Использование eval () для повышения безопасности - PullRequest
1 голос
/ 06 апреля 2011

Я признаю, что название - это, в основном, уловка 22, но оно совершенно актуально, поэтому, пожалуйста, потерпите меня немного ...

Фон

Как некоторые могут знать, яработая над PHP-фреймворком, основной целью которого является соединение функциональности между различными CMS / системами.С точки зрения разработчика, существует обширный механизм обработки ошибок и ведения журнала.Прямо сейчас есть две настройки, DEBUG_MODE и DEBUG_VERBOSE, которые управляют выводом отладки.

Режим описывает среду, а подробный управляет количеством деталей.Короче говоря, есть режим, называемый «консоль», который в основном выводит отладочную информацию в консоль javascript (которая теперь доступна в главном веб-браузере рядом с вами).

Проблема

Это[система отладки] прекрасно работает для серверов разработки, но вы абсолютно не можете использовать ее на производственном сервере, поскольку подробности отладки (включая учетные данные БД и т. д.) публикуются публично .И, честно говоря, кто когда-либо безупречно мигрировал с сервера dev. на prod. каждый раз?

Решения

Поэтому яЯ пытался найти способ исправить это.Среди предложенных мной решений:

  • Наличие параметра, который сообщает каркасу, что протоколирование должно включаться, только если запрос поступает с определенного IP-адреса.Проблемы безопасности для этого довольно очевидны (IP-спуфинг среди прочих).
  • Наличие параметра, содержащего выражение PHP (код), которое получает eval'd, и его возвращение используется как да / нет.Самое приятное то, что установленный фреймворк может предлагать специфичные для CMS выражения, например:
    • Wordpress: current_user_can('manage_options')
    • Joomla: $user=&JFactory::getUser() && ($user->usertype=='Super Administrator') || ($user->usertype=='Administrator')
    • Пользовательский: $_SERVER['REMOTE_ADDR']=='123.124.125.126'
  • Это из двух, я хочу выслушать еще больше предложений.

Итак, как вы думаете, eval() должно быть до этого?Я гарантирую, что он все еще работает хорошо, делая это только один раз для загрузки / запроса страницы.

Уточнение

if(DEBUG_MODE!='none')echo 'Debug'; // this is how it is now
if(DEBUG_MODE!='none' && $USER_CONDITION)echo 'Debug'; // this is how it should be

$USER_CONDITON позволяет такие вещи, как запускis_admin(), чтобы все администраторы могли видеть отладочную информацию, или getUser()->id==45, чтобы включить ее для определенного пользователя.Или по IP, или как угодно.

enter image description here

Ответы [ 4 ]

3 голосов
/ 06 апреля 2011

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

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

Единственное, что вы видите, - это производительность.Это вздор.Не ошибка.Наличие eval - это то, что отличает языки сценариев от скомпилированных языков.Если он доступен, вы можете не только использовать его, но и быть уверенным, что он не будет медленным, потому что за кулисами требуется запуск компилятора + компоновщика.PHP занимает некоторое время при инициализации своего токенайзера и анализатора, но сам синтаксический анализ удивительно быстр.

И, наконец, избегайте таких заголовков вопросов в SO.;} Или, по крайней мере, поговорите о create_function, пожалуйста.

2 голосов
/ 06 апреля 2011

Разрешение произвольного ввода PHP-кода, который выполняется - будь то через eval() или create_function() - просто плохой дизайн и открывает большую потенциальную уязвимость без всякой уважительной причины.Это также открывает возможность сбоя страницы из-за синтаксических ошибок.

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

Так что нет, я бы этого не делал;Вместо этого я реализовал бы каждый мост CMS в качестве адаптера и позволил бы пользователю выбрать адаптер (и при необходимости ввести некоторые настраиваемые, очищаемые параметры) из предварительно определенного списка.(Нечто подобное было также предложено @Wrikken в комментариях)

Это ваш звонок.Скорее всего, у вас никогда не будет проблем с этим способом eval().И можно утверждать, что большинство CMS, с которыми вы будете соединяться (Wordpress, Joomla), разрешают произвольное выполнение кода PHP в конце в любом случае .Но это не хороший дизайн.

2 голосов
/ 06 апреля 2011

IP-спуфинг, достаточно длинный, чтобы фактически получить ответ, вряд ли произойдет. Если пользователю удается установить соединение с вашим сервером, подделывая внутренний или привилегированный IP-адрес разработчика, он контролирует ваш маршрутизатор, так что вам есть о чем беспокоиться.

Вместо запуска eval вы не можете просто написать анонимную функцию / замыкание: http://php.net/manual/en/functions.anonymous.php (размещение в файле конфигурации, а не на веб-экране, написание сложной PHP-кода в веб-форме в любом случае кажется неоптимальным)

0 голосов
/ 06 апреля 2011

Наличие параметра, который содержит выражение PHP (код), которое получает eval'd, и его возвращение используется как да / нет. Самое приятное, что установленный фреймворк может предлагать специфичные для CMS выражения, например:

eval() может привести к сбою вашей страницы, если какая-либо функция не существует или при любом количестве ошибок разбора. И если существуют ошибки, которые позволяют введенному пользователем вводу (например, запрошенному uri) даже коснуться этих утерянных значений, это потенциально откроет ваш сайт для злонамеренного или случайного уничтожения. Вместо этого, чтобы определить работающую в настоящее время структуру, ищите маркеры в структуре, к которой вы пытаетесь подключиться, такие как определенные константы, функции, классы и т. Д. Вы можете заменить все свои eval() функции безопасными проверками, используя function_exists(), defined() и т. Д.

...