Оценка логики выражений PHP - но без eval ()?

php regex eval

158 просмотра

1 ответ

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

Пример:

if (1 > 2 || (1 == 1 && 3 > 2)) [...]

Выше будет возвращено ИСТИНА.

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

Спасибо за вашу помощь!

Автор: Nathanael Источник Размещён: 08.11.2019 11:29

Ответы (1)


1 плюс

Лучше всего, как ваше предложение "дезинфицирующее средство", используя token_get_all

ниже (неполный) фрагмент, чтобы вы могли понять

function evalExpression ($expression)
{
    $code = "return $expression;";
    $token = token_get_all($code,TOKEN_PARSE);

    # return
    unset($token[1]);

    foreach ($token as $key=>$value) {

        if(is_array($value)) {

            # white list token
            $allow = [T_WHITESPACE,T_LNUMBER,/* add more token*/];

            # remove white list token
            if(in_array($value[0],$allow,true)) {
                unset($token[$key]);
            }

        } else {

            # white list string
            $allow = [';','>'/* add more element*/];

            # remove white list string
            if(in_array($value,$allow,true)) {
                unset($token[$key]);
            }

        }

    }

    # if token contain only white listed, $token should empty
    if(!$token) {
        return eval($code);
    } else {
        throw new \InvalidArgumentException('err'); 
    }

};

# return bool
var_dump(evalExpression('2 > 1'));

# should error
var_dump(evalExpression('function(){}'));

Поскольку eval-конструкции опасны, вы должны попытаться внедрить / протестировать вредоносный код перед запуском в производство.

Автор: Andikac Размещён: 20.08.2016 06:10
32x32