Интерпретировать ввод текста как PHP
Я хочу позволить пользователям тестировать мой класс PHP, который среди прочего обрезает и изменяет размеры изображений.
Я хочу, чтобы они написали код PHP в текстовом поле, отправили форму, и тогда их код будет запущен. Как я могу это сделать?
Или это другие безопасные способы позволить пользователям (кому-либо) продемонстрировать класс PHP?
7 ответов
Да. Вы можете использовать оператор eval в php (ранее он был связан с Джоном http://us2.php.net/manual/en/function.eval.php), однако будьте очень осторожны. Вы действительно не хотите, чтобы пользователи могли свободно запускать код на вашем компьютере.
Моя рекомендация состоит в том, чтобы попытаться придумать другой подход для демонстрации - возможно, несколько гибких примеров... но не позволяйте им запускать код напрямую
Я бы порождал процесс PHP, используя учетную запись пользователя с правами "почти нет". Дайте доступ на чтение и запись к одному каталогу, но это все.
Вы по-прежнему открываете себя для DoS-атак с бесконечными циклами и тому подобным, но если вам абсолютно необходимо это сделать, запустите код в этой изолированной программной среде с очень низкими разрешениями, как это делают IE и Chrome.
Использование EVAL, вероятно, худшая идея.
Вы можете использовать функцию eval(), но не делайте этого. Шутки в сторону.
Нет никакого "безопасного" способа позволить любому старому пользователю запускать собственный PHP на вашем сервере. Вы подвергаете себя потенциальному миру боли.
Вместо этого предоставьте отличную документацию, примеры кода и исходные тексты для своих собственных демонстраций и предложите потенциальным пользователям опробовать их на своих собственных серверах тестирования / разработки.
Как уже было сказано, вы можете использовать eval
функция, но это очень опасно. Если вы хотите, чтобы пользователи тестировали код, подготовьте демонстрационные страницы, представляющие возможное использование, и, например, возможность добавления параметров пользователем через формы HTML.
Вы могли бы использовать eval http://us2.php.net/manual/en/function.eval.php
Вы можете использовать eval, но не без некоторых мер предосторожности.
Если ваши проблемы безопасности просто "осторожны", а не "параноидальны", у вас есть несколько вариантов:
- Если у вас есть выделенный экземпляр Apache/PHP только для этого вашего проекта, установите параметр disable_functions в php.ini и отключите все функции, связанные с файлами и сетью. Это повлияет на всю установку PHP и сломает некоторые удивительные вещи, такие как phpmyadmin.
- Если у вас нет выделенного сервера, попробуйте 'runkit': http://php.net/manual/en/book.runkit.php чтобы отключить функции только в уже запущенном скрипте.
- Возможно больше работы? Настройте виртуальную машину (VirtualBox, VMware и т. Д.), Которая активно защищена брандмауэром изнутри хост-ОС, с минимальным выделением памяти и дискового пространства, и запустите там ненадежный код.
Если вы параноик... установите процесс одобрения для всего загруженного кода.
Не думайте с точки зрения PHP или другого языка общего назначения, подумайте о минимальном языке, который достаточен для выражения операций в вашей области обработки изображений. Пользователи отправляют выражения на этом предметно-ориентированном языке (DSL), эти выражения анализируются на стороне сервера и передаются в ваш код.
Сначала важно подумать о диапазоне операций по обработке изображений и о том, как их можно комбинировать. Это скажет вам, насколько выразительным должен быть язык. После того, как вы это выясните, есть множество вариантов того, как язык будет выглядеть синтаксически. Синтаксис языка может зависеть от компромисса между простотой использования и простотой синтаксического анализа.
Если вы можете написать или найти синтаксический анализатор для выражений такого рода, он может быть самым простым для пользователей. На самом деле, может ли кто-нибудь порекомендовать существующий оценщик выражений, который будет работать в подобных случаях (например, может ли Smarty безопасно запускать выражения, отправленные пользователем?), Или действительно генератор парсера для PHP?
resize(rotate("foo.png", 90), 50)
Подобный язык может быть менее простым для пользователей, но его можно обработать с помощью довольно простой стековой машины:
"foo.png" 90 rotate 50 resize
Еще проще, такому языку на основе XML не нужен собственный синтаксический анализатор:
<resize percent="50"><rotate degrees="90"><img src="foo.png"></rotate></resize>
Использование DSL не защищает вас от доменных атак, например, кто-то может использовать приведенный выше язык, чтобы изменить размер изображения до миллиарда пикселей и использовать всю память сервера. Поэтому для DSL должна быть какая-то среда выполнения, которая накладывает ограничения на количество ресурсов, которые может использовать любой пользовательский скрипт.