Изменение в политике вызова статичных методов в smarty шаблонах приводит к проблемам с обратной совместимостью плагинов и приложений.

1

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

Проверка данных методов должна игнорироваться в классах плагинов и хэлперов.

Замените на что-то вроде этого:

    public function isTrustedStaticClass($class_name, $compiler, $method = false)
    {
        $allowed = true;
        
        $orig_class_name = $class_name;
        $class_name = strtolower($class_name);
        
        $orig_method = $method;

        // Игноририруем классы плагинов и хэлперов
        if (!in_array(substr($class_name, -6), array('plugin', 'helper'))) {
            if ($method) {
                list($method) = explode('(', $method);
                $method = strtolower($method);
            }
            
            // Prohibited static classes
            if (in_array($class_name, $this->static_classes) || in_array($class_name.'::'.$method, $this->static_classes)) {
                $allowed = false;
            }
            // Smarty internals
            elseif (substr($class_name, 0, 7) == 'smarty_') {
                $allowed = false;
            }
            // Prohibited methods
            elseif (in_array($method, array('getactive', 'getappconfig', 'setdebug', 'systemoption', '__set_state'))) {
                $allowed = false;
            } elseif ($method == 'getinstance' && $class_name != 'shopdimension') {
                $allowed = false;
            }
            // Prohibited method masks
            elseif (false !== strpos($method, 'model') || false !== strpos($method, 'factory')) {
                $allowed = false;
            }
            elseif ($method != 'getplugininfo' && false !== strpos($method, 'getplugin')) {
                $allowed = false;
            }
        }
        
        if (!$allowed) {
            $compiler->trigger_template_error("access to static method '{$orig_class_name}::{$orig_method}' not allowed by security setting");
        }
        
        return $allowed;
    }

10 комментариев

Добавить комментарий

Чтобы добавить комментарий, зарегистрируйтесь или войдите