如何在Slim和Twig中有条件地转义值?

时间:2018-01-25 12:19:58

标签: php security twig escaping slim

代码

我们有以下Twig HTML模板:

<div id="error">{{ flash.error | raw }}</div>

我们在多个地方刷新消息,例如:

$app->flash('error', "Some error with this $user_supplied string.");
$app->flash('error', "Hello, <b>World</b>!");

问题

这显然是一个安全问题,$user_supplied可能包含javascript。我想将{{ flash.error | raw }}替换为{{ flash.error }},同时在某些情况下仍然允许使用HTML。

我想拥有什么:

<div id="error">{{ flash.error }}</div>
----
$app->flash('error', "Some error with this $user_supplied string.");
$app->flash('error', HTML("Hello, <b>World</b>!"));

这样所有开发者都意识到了危险。我可能会一起破解这个问题,但是可能已经有了内置方式或更好的选择吗?

3 个答案:

答案 0 :(得分:1)

嗯,也许你可以在将代码传递给模板之前检查PHP代码中的变量内容。然后使用PHP的一些内置字符串解析函数来检查变量是否存在某些标记。

如果找到(例如)脚本标记,您可以将变量设置为null或false,然后在模板中处理该值。

我能想到的另一种方法是使用striptags过滤器。您定义了允许的标签,并且将删除未定义的标签。这样您就可以输出您想要的内容,并且只保留您允许的标签。

https://twig.symfony.com/doc/2.x/filters/striptags.html

{% set some_var = '<b><script>console.log(123)</script></b>' %}

<div id="error">{{ some_var|striptags('<b><strong>')|raw }}</div>

答案 1 :(得分:0)

您可以使用escape twig变量来满足特定需求。

x
  

转义过滤器支持以下转义策略:

     

html,js,css,url,html_attr

答案 2 :(得分:0)

您可以在twig配置中执行此操作,但不了解您的项目我将假设您正在使用Twig View。在为Slim项目配置Twig View时,您可以执行以下操作:

$view = new \Slim\Views\Twig('path/to/templates', [
    'cache' => 'path/to/cache',
    'autoescape' => 'js'
]);

这应该全局配置为JS只能转义。我没有测试过这个,所以我不确定它是否有效。