Вопрос

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

Я хочу, чтобы они написали PHP-код в текстовом поле, отправили форму, а затем их код будет запущен.Как я могу это сделать?

Или это другие безопасные способы позволить пользователям (кому угодно) продемонстрировать класс PHP?

Это было полезно?

Решение

ДА.Вы можете использовать оператор 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

Не думайте о 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 должна быть какая-то среда выполнения, которая налагает ограничения на количество ресурсов, которые может использовать любой отправленный пользователем сценарий.

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

Если ваши проблемы безопасности просто «осторожны», а не «параноидальны», у вас есть несколько вариантов:

  • Если у вас есть выделенный экземпляр Apache/PHP только для этого вашего проекта, установите параметр Disable_functions в php.ini и отключите все функции, связанные с файлами и сетью.Это повлияет на всю установку PHP и сломает некоторые удивительные вещи, такие как phpmyadmin.
  • Если у вас нет выделенного сервера, попробуйте runkit: http://php.net/manual/en/book.runkit.php отключать функции только внутри уже запущенного скрипта.
  • Возможно, больше работы?Настройте виртуальную машину (VirtualBox, VMware и т. д.), которая жестко защищена межсетевым экраном изнутри ОС хоста, с минимальным выделением памяти и дискового пространства, и запустите на ней ненадежный код.

Если ты параноик...настроить процесс утверждения для всего загруженного кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top