如何在Symfony2中正确启用twig的沙箱扩展?

时间:2013-04-17 21:30:22

标签: php symfony twig sandbox

在Symfony2中,默认情况下会禁用一些Twig模块。其中一个是调试扩展,它添加了{% debug %}标记(在开发环境中很有用)。

要启用它,没有什么困难,您可以将此服务添加到您的配置中:

  debug.twig.extension:
    class: Twig_Extensions_Extension_Debug
    tags:
      - { name: 'twig.extension' }

但是如何启用{% sandbox %}代码?

我的问题是扩展程序的构造函数采用安全策略:

public function __construct(Twig_Sandbox_SecurityPolicyInterface $policy, $sandboxed = false)
{
    $this->policy            = $policy;
    $this->sandboxedGlobally = $sandboxed;
}

通过阅读twig documentation,我看到了本地化的方法(没有Symfony2):

$tags = array('if');
$filters = array('upper');
$methods = array(
    'Article' => array('getTitle', 'getBody'),
);
$properties = array(
    'Article' => array('title', 'body'),
);
$functions = array('range');
$policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
$sandbox = new Twig_Extension_Sandbox($policy);
$twig->addExtension($sandbox);

我可以在使用沙盒之前在服务中做类似的事情,但这并不像我们习惯的依赖注入那么清晰。

是否有更好/正确的方法在Symfony2中启用twig的沙箱扩展?

1 个答案:

答案 0 :(得分:6)

为什么不创建安全策略的私有服务:

parameters:
    twig.sandbox.tags:
        - if
    twig.sandbox.filters:
        - upper
    twig.sandbox.methods:
        Article: [getTitle, getBody]
    twig.sandbox.properties:
        Article: [title, body]
    twig.sandbox.functions:
        - range

twig.sandbox.policy:
    class: Twig_Sandbox_SecurityPolicy
    arguments:
        - %twig.sandbox.tags%
        - %twig.sandbox.filters%
        - %twig.sandbox.methods%
        - %twig.sandbox.properties%
        - %twig.sandbox.functions%
    public: false

然后,您可以将此服务注入twig.sandbox.extension服务:

twig.sandbox.extension:
    class: Twig_Extension_Sandbox
    arguments:
        - @twig.sandbox.policy
    tags:
        - { name: twig.extension }

完成。标记twig.sandbox.policy私有确保它无法使用容器访问(它仍然可以注入其他服务,但我认为这不是问题)。

免责声明:我还没有对此进行测试,可能需要进行一些调整才能实际运行,所以不要复制粘贴!