Twig - политика безопасности Sandbox не будет работать - PullRequest
0 голосов
/ 29 сентября 2018

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

Я использую Twig в качестве отдельного пакета, поэтому не могу использовать псевдокод Symphony.

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

Класс:

class GetThings {

    public function doStuff() {
        return array(
            'id'   => '...',
            'data' => '...'
        );
    }

}

...

Веточка:

$allowedTags = ['if', 'else', 'elseif', 'endif', 'for', 'endfor'];
$allowedFilters = ['upper', 'escape'];
$allowedMethods = [
    'GetThings' => array('doStuff') // Possibly this may be wrong?
];
$allowedProperties = [
    'GetThings' => array('id', 'data') // Or this is wrong? But not sure the correct way.
];
$allowedFunctions = ['range'];

$policy = new Twig_Sandbox_SecurityPolicy($allowedTags, $allowedFilters, $allowedMethods, $allowedProperties, $allowedFunctions);
$sandbox = new Twig_Extension_Sandbox($policy, true);

...

Шаблон:

{% for i in info %}
    {{ i.id }}       <- Code that raises securityPolicy exception.
    {{ i.data }}     <- Code that raises securityPolicy exception.
{% endfor %}

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

EDIT : Поэтому я посмотрел на эту ошибку немного глубже и нашел трассировку стека исключений, по какой-то причине он считает, что мой классStdClass, а не GetThings?Не уверен почему.Любые идеи?

Twig_Sandbox_SecurityNotAllowedPropertyError: Calling "id" property on a "stdClass" object is not allowed.

Чтобы создать экземпляр класса, я просто делаю следующее:

public function index() {
    $data = new GetThings();
    // echo get_class($data); // returns GetThings as expected...

    return $twig->render('index.twig', [
        'info' => $data->doStuff()
    ]);
}

Если я сделаю 'StdClass' => array('id', 'data') для разрешенных свойств, страницаработает отлично.Но я чувствую, что это не работает, как задумано, так как StdClass может быть чем угодно?И GetThings должен работать, не так ли?

РЕДАКТИРОВАТЬ :

Я думаю, я понял это.Так что мои разрешенные свойства позволяют 'GetThings' => [id, data], что хорошо.doStuff() возвращает массив объектов \PDO, используя опцию \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ, которая заставляет PDO преобразовать все возвращаемые значения в StdClass объекты.

Есть ли способ обойти это?Я хочу сохранить эту опцию, но все же хочу ссылаться на политику как 'GetThings' => [...] вместо 'StdClass' => [...]

1 Ответ

0 голосов
/ 30 сентября 2018

Работает как задумано:

{% for i in info %}
    {{ i.id }}       <- Code that raises securityPolicy exception.
    {{ i.data }}     <- Code that raises securityPolicy exception.
{% endfor %}

Здесь i не является GetThings экземпляром.То, что вы создали в качестве значения для ключа id и data: тег

return array(
    'id'   => '...',
    'data' => '...'
);

Twig for будет повторять переменную info, которая является массивом с ключами.Таким образом, цикл будет перебирать значения массива - в вашем случае '...' и '...', которые, я думаю, являются экземплярами stdClass.

...