【问题标题】:Extracting variable from a twig template saved in database. Twig , PHP/Symfony从保存在数据库中的树枝模板中提取变量。树枝, PHP/Symfony
【发布时间】:2020-07-09 14:58:37
【问题描述】:

我正在开发一个电子邮件模板系统。 设想: 在 textarea 中,用户正在编写电子邮件模板,他可以使用文本和树枝,因此他可以使用循环、条件块、变量等。 然后用户将模板保存到数据库中。在此之前,模板从树枝结构的角度进行验证。 然后我们可以从数据库中加载一个模板(字符串),提取所有必要的变量并作为它的服务。服务返回所有必要的变量后,我将其注入模板并发送电子邮件。

例如,模板可以是这样的

Hello {% if gender == 'm' %}Ms.{% else %}Mrs.{% endif% } {{name}}

Bla bla bla {{variable}} bla bla bal {{variable2}}

所以基本上我想从一个字符串中提取所有变量名。

我可以通过以下方式直接从数据库创建树枝模板:

$template = $this->twig->createTemplate($templateFromDatabase);

我可以通过

$tokens = $twig->tokenize($source);

但它没有告诉我哪些标记是变量

最后,我可以解析它并遍历结构并提取变量。

$parsed = $twig->parse($tokens);

但也许有一种更简单的方法可以从模板中获取所有变量名称。 另外,您知道在保存到数据库之前验证树枝模板的方法吗?

另外,我正在 Symfony 中创建一个服务来处理所有这些并返回 准备好发送的完整电子邮件模板,以便我可以使用 PHP 树枝函数

或者也许已经有捆绑或类似的东西(我没有找到任何东西) 提前致谢

【问题讨论】:

    标签: php database symfony twig twig-extension


    【解决方案1】:

    好的,tl;dr:使用Sandbox extension,尽可能限制用户的能力。不要解析模板以提取使用的变量,您定义可用的变量,然后在渲染模板时提供它们。不要相信自己会编写确定模板是否安全的“测试”。 (黑名单是有缺陷的,如果软件是奶酪的话,填补“漏洞”是一场永无止境的战斗。)

    长版:

    显然,这是一个固执己见的答案,但我会解释一下:Twig 允许存储变量,它允许宏,它允许循环。这意味着,您可能会导致无限循环、内存耗尽和其他您不希望 用户 能够造成的事情。

    现在,我可以完全了解您的来源,为用户提供通过模板自定义电子邮件的能力。但是超越if 是疯狂的。

    相反,您应该使用sandbox extension 来限制用户能力并明确定义用户可用的内容。 绝不可反过来。然后你只需提供这些变量。不是按需或任何东西。只需提供它们并完成它。任何你可能觉得有吸引力的逻辑都可能是有缺陷的。这与安全相关或至少与性能相关,您应该做对。

    几乎每个可供用户使用的模板选项都规定了可以使用哪些关键字/占位符/构造,这是有原因的。原因是安全和理智。不要成为那种必须解释为什么您的公司“需要更多服务器”的人,因为您的服务器经常崩溃或堵塞。

    如果您想验证模板是否正常:在沙盒中使用。使用 try-catch 解析模板并呈现一些默认变量。你提供它们,所以这不应该是一个问题。如果抛出异常,请以合理的方式将其传递给用户。

    不允许无效模板影响生产代码。始终将沙箱用于用户提供的模板代码。没有例外。 不要相信用户。永远。用户充其量是愚蠢的,最坏的情况是彻头彻尾的恶意。两者都会导致问题。

    【讨论】:

    • 感谢您的回答。沙盒听起来很有用,我不知道。至于你们其他人re post. Dont 担心,我不会对公开的应用程序这样做。此功能受到限制的人太少,受过基本树枝的培训,因此对他们有一定的责任。 (所以沙箱将有助于限制为“基本树枝”)
    猜你喜欢
    • 1970-01-01
    • 2015-03-21
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多