Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何有条件地转义Slim和Twig中的值? 代码_Php_Security_Twig_Escaping_Slim - Fatal编程技术网

Php 如何有条件地转义Slim和Twig中的值? 代码

Php 如何有条件地转义Slim和Twig中的值? 代码,php,security,twig,escaping,slim,Php,Security,Twig,Escaping,Slim,我们有以下Twig HTML模板: <div id="error">{{ flash.error | raw }}</div> 这样,所有开发人员都意识到了危险。我可能可以一起解决这个问题,但是否已经有了一种内置的方法或更好的替代方法?您可以根据具体需要使用twig变量 {{ flash.error|escape('js') }} 转义筛选器支持以下转义策略: html、js、css、url、html\u attr 嗯,在将变量传递给模板之前,您可以检查PHP代码中变

我们有以下Twig HTML模板:

<div id="error">{{ flash.error | raw }}</div>
这样,所有开发人员都意识到了危险。我可能可以一起解决这个问题,但是否已经有了一种内置的方法或更好的替代方法?

您可以根据具体需要使用twig变量

{{ flash.error|escape('js') }}
转义筛选器支持以下转义策略:

html、js、css、url、html\u attr


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

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

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

{%set some_var='console.log(123)%}
{{some_var | striptags('')| raw}

您可以在您的twig配置中执行此操作,而不需要对您的项目了解太多。我假设您使用的是twig View。在为Slim项目配置细枝视图时,可以执行以下操作:

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

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

关键是,我不知道
user.username
是否是需要转义的字符串。我想在PHP代码中指定这一点,现在我决定使用白名单作为标记。但是,
strip\u tags()
是不安全的,因为属性没有被剥离。例如,
strip_标签(“测试”、“测试”)不删除onclick处理程序(或onload、onmouseover等)。我添加了一个自定义过滤器,它对所有内容进行编码,然后有选择地对某些部分进行解码。例如
strong->
。这看起来很安全。谢谢你的回答。不幸的是,这没有帮助。我试图解决的问题是,有时我希望字符串转义,有时不转义,这取决于它的值。您可能需要创建自己的细枝过滤器来完成此操作,因为除非您在自己的过滤器中进行检查,否则无法判断值将是什么,但是你不能使用你想要的语法。我并不认为在输出中添加
|raw
有什么问题。
{{ flash.error|escape('js') }}
{% set some_var = '<b><script>console.log(123)</script></b>' %}

<div id="error">{{ some_var|striptags('<b><strong>')|raw }}</div>
$view = new \Slim\Views\Twig('path/to/templates', [
    'cache' => 'path/to/cache',
    'autoescape' => 'js'
]);