2015-05-26 3 views
1

Я пишу веб-приложение, которое я хочу быть «scriptable» - это означает, что я хочу, чтобы пользователи могли писать небольшие фрагменты кода для добавления дополнительных функций.PHP eval и зависимость инъекции

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

Надевание вопросов безопасности в сторону на мгновение, это то, что я хочу сделать.

/* script pseudo code */ 
if object1.date() - today() < SOME_CONSTANT 
    return true; 
else 
    if object2.field1 == 123 && oject1.date() > object2.field2 
     return true; 
    else 
     return false; 

/* Main block of code */ 
$obj1 = New path\to\Object1(); 
$obj2 = New Path\To\Object2(); 

$result = eval($script); 

if $result 
    doSomething(); 

Мои вопросы тогда:

Как вводить среду в строку, которая должна быть Эвальд, чтобы я мог получить доступ к объекту в выражении оценивается?

+1

Вы можете использовать оператор 'global', чтобы добавить все объекты, которые они могут допросить, в локальную область. – Barmar

+0

@ Бармар: Не могли бы вы рассказать небольшим фрагментом ?. Я больше из C/C++/Python. –

+0

Я не уверен, что понимаю проблему, к чему у вас проблемы с доступом? Кажется, что все доступно/создана среда: http://codepad.viper-7.com/p5kmZF – jeroen

ответ

0

Оператор global делает глобальные переменные доступными внутри функции. Так говоря:

global $var1, $var2, $var3, ...; 

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

+0

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

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