我们有以下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>!"));
这样所有开发者都意识到了危险。我可能会一起破解这个问题,但是可能已经有了内置方式或更好的选择吗?
答案 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)
答案 2 :(得分:0)
您可以在twig配置中执行此操作,但不了解您的项目我将假设您正在使用Twig View。在为Slim项目配置Twig View时,您可以执行以下操作:
$view = new \Slim\Views\Twig('path/to/templates', [
'cache' => 'path/to/cache',
'autoescape' => 'js'
]);
这应该全局配置为JS只能转义。我没有测试过这个,所以我不确定它是否有效。