【问题标题】:How do I add the Sandbox extension for TWIG in the Timber WordPress plugin?如何在 Timber WordPress 插件中为 TWIG 添加沙盒扩展?
【发布时间】:2020-06-22 14:58:45
【问题描述】:

我想添加 Sandbox 扩展,以使用 Timber for WordPress 评估不受信任的代码(包括使用 composer 但我在使用插件时得到相同的结果)。

以下(简化的)代码会导致致命错误。

add_filter('timber/twig', function($twig){

    $filters = array_diff(array_keys($twig->getFilters()), ['function']);

    $policy = new \Twig\Sandbox\SecurityPolicy([], $filters, [], [], []);
    $twig->addExtension(new \Twig\Extension\SandboxExtension($policy, true));
    
    return $twig;
});

错误是:“致命错误:未捕获的异常:无法注册扩展“沙盒”,因为扩展已被初始化。”

如果应用的过滤器是 wood/twig 或 twig_apply_filters,则没有区别。

这是添加此扩展程序的错误位置吗?它似乎只在调用 Timber::compile_string 时执行。

我在 PHP 7.3.x 上使用最新版本的 WordPress 和 Timber

【问题讨论】:

  • 如果你使用add_filter()而不是add_action()呢?
  • @Gchtr 感谢您指出这一点 - 我已相应调整。就我而言,错字,在我的代码中,我将其作为 add_filter()。顺便说一句, add_action() 调用 add_filter() ,所以没有区别。
  • 好的,我试过你的代码,对我来说,没有错误。那么:您在 functions.php 中的何处添加该代码 sn-p?是否正在应用其他 timber/twig 过滤器?
  • @Gchtr,感谢您确认它有效。我设法使代码的简化版本正常工作。导致错误的原因是在制定策略参数时我调用了getFilters()getFunctions(),这些导致扩展被初始化。
  • 很高兴知道,我很高兴你能解决这个问题!

标签: php twig timber


【解决方案1】:

$twig->getFilters() 导致扩展被初始化,因此不能用于此目的。删除此代码时没有错误,并且注册了沙盒扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多