ozonar
@ozonar
PHP, JS, webRTC

Как безопасно выполнить исходный код PHP из строки?

Суть в чём: пишу парсер псеводокода в PHP код (который должен вызывать некоторые определенные мной методы и стандартные if, for, else, etc), и после этот код будет запускаться достаточно большое число раз подряд (что при тяжёлом коде может создать серьезную нагрузку на сервер).

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

Но такой вариант опасен тем, что при работе парсера могут возникнуть ситуации, когда пользователь сможет запустить вредоносный код. Поэтому есть несколько вариантов:
1. Копать в сторону callable
2. Использовать один из вариантов из статьи https://habrahabr.ru/post/215139/. Не очень хорошо, ибо замедляет выполнение кода, да и более безопастным не становится.
3. Использовать eval, но на этапе преобразования усиливать проверку.
4. Искать другие варианты.

Какой вариант предложите?
  • Вопрос задан
  • 1466 просмотров
Решения вопроса 1
miraage
@miraage
Старый прогер
Генерируете код, парсите этой библиотекой.
Фильтруете определенные функции.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
riky
@riky
Laravel
сам недавно делал подобную вещь, компилятор из псевдокода в php.
у меня на входе были тысячи функций которые могли редактировать редакторы, все формулы компилировались в один php класс в виде методов. этот файл потом инклюдился.
фильтровать вредоносные функции лучше еще на этапе анализа псевдокода и компиляции php, а не nikic parser. хотя конечно если у вас преобразование делается регулярками то без этого конечно никак.
Ответ написан
Ключевые слова: eval, runkit
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1) изолировать код в песочнице, передавать в качестве аргументов только то что можно юзать (php.net/manual/en/function.create-function.php)
2) воспользоваться, например, nick/php-parser и удостовериться что не используются штуки типа global
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы