Название суммирует это довольно хорошо. Что является надежным способом предотвращения выполнения функций, которые взаимодействуют с файлами? Мы говорим о злой eval()
,
У меня есть полный доступ к строке, которая собирается быть оценена. Я думал о простом удалении оператора обратной пометки и замене имен файловых функций (вместе с exec) на те, которые фактически ничего не делают, но я не уверен, насколько надежен этот подход.
Пример:
Код PHP
eval("file_get_contents('passwords.ini')");
В настоящее время это заменяется перед выполнением:
Код PHP
eval("fn_zero('passwords.ini')");
РЕДАКТИРОВАТЬ
Что касается злой Eval (). То, что я делаю здесь, это выполнение созданного администратором, хранимого в базе данных кода PHP в модульной системе управления контентом. Редактирование кода требует дополнительного уровня аутентификации, который отделен от имени главного администратора, это не совсем ненадежный ввод пользователя.
Администратор может убить его / ее сайт, если это его / ее намерение, это не мое дело. Моя задача — предотвратить просмотр основного кода PHP CMS.
Приложение: каждый сайт имеет свой собственный корень и базу данных. Они не могут навредить друг другу таким образом.
Чтобы ответить на вопрос в том виде, в котором он был задан, «очистка» eval-ввода невозможна. Простой пример:
eval("\$f=strrev('stnetnoc_teg_elif');\$f('passwords.ini');");
Возможные варианты выполнения предоставленного пользователем кода: песочница или пользовательский VM, как https://github.com/ircmaxell/PHPPHP.
Других решений пока нет …