2009-07-23 3 views
2

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

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

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

+1

Предоставление пользователям возможности запуска PHP-кода не имеет безопасных путей. – RaYell

ответ

4

Да. Вы можете использовать оператор eval в php (ранее связанный Джоном http://us2.php.net/manual/en/function.eval.php), однако будьте очень осторожны. Вы действительно не хотите, чтобы пользователи могли свободно запускать код на вашем компьютере.

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

+3

Да, все говорят, что использование eval() страшно. Не позволил бы им это сделать! Думаю, я просто сделаю пару демо! –

1

Вы могли бы использовать Eval http://us2.php.net/manual/en/function.eval.php

+1

Это будет работать, но очень опасно. –

+3

Это не очень опасно, это очень опасно. – 2009-07-23 12:51:14

+0

Это опасно, если вы не принимаете какие-либо меры предосторожности. –

5

Я бы породить процесс PHP с использованием учетной записи пользователя со следующими разрешениями. Дайте доступ на чтение и запись к одному каталогу, но это все.

Вы по-прежнему открываете себя для DoS-атак с бесконечными циклами и т. Д., Но если вам это абсолютно необходимо, запустите код в этой очень низкой разрешающей среде, например IE и Chrome.

Использование EVAL, вероятно, является наихудшей идеей.

+0

Если вы запускаете ненадежный код в виртуальной машине, бесконечные циклы и т. Д. Не являются проблемой. –

3

You способ доставки использование функция eval(), но не делаем. Шутки в сторону.

Нет никакого «безопасного» способа, позволяющего любому старому пользователю запускать собственный PHP на вашем сервере. Вы подвергаете себя потенциальному миру обиды.

Вместо этого обеспечьте отличную документацию, образцы кода и источник для собственных демонстраций, а также попросите потенциальных пользователей попробовать их на своих собственных серверах тестирования/разработки.

2

Как уже говорилось, вы можете использовать функцию eval, но это очень опасно. Если вы хотите, чтобы пользователи тестировали код, подготовьте демонстрационные страницы, представляющие возможное использование, и, например, возможность добавлять параметры пользователем через HTML-формы.

0

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

Важно, чтобы сначала подумать о диапазоне операций обработки изображений и о том, как их можно комбинировать. Это скажет вам, насколько выразительным должен быть язык. После того, как вы это проработали, есть много вариантов того, как язык будет выглядеть синтаксически. Синтаксис языка может зависеть от компромисса между простотой использования и простотой синтаксического анализа.

Если вы можете написать или найти парсер для таких выражений, это может быть проще всего для пользователей. На самом деле, может ли кто-нибудь рекомендовать существующий оценщик выражений, который будет работать в таких случаях (например, может ли Smarty безопасно запускать пользовательские выражения?) Или действительно генератор парсеров для PHP?

resize(rotate("foo.png", 90), 50) 

Язык как this может быть менее легким для пользователей, но он может быть обработан с помощью довольно простой стек машины:

"foo.png" 90 rotate 50 resize 

Еще проще, XML-язык, основанный, как это не делает нужен свой собственный парсер:

<resize percent="50"><rotate degrees="90"><img src="foo.png"></rotate></resize> 

Использование DSL не защищает вас от атак, относящихся к домену, например, кто-то может использовать язык выше, чтобы изменить размер изображения в зиллионы Пиксели и используйте всю память сервера. Таким образом, для DSL должна быть какая-то среда выполнения, которая ограничивает количество ресурсов, которые может использовать любой пользовательский сценарий.

0

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

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

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

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

Смежные вопросы