Symfony-在渲染时出现Twig XSS漏洞

Symfony-在渲染时出现Twig XSS漏洞,symfony,twig,xss,Symfony,Twig,Xss,我有一个Symfony网站,用户在评论帖子时可以提到其他人。呈现注释时,如果有“”标记,它们也将作为javascript执行 Example comment in the database: I think <a href="https://www.examplesite.com/burak">@joanna</a> was right 数据库中的示例注释:我认为是对的 当我在没有“原始”过滤器的情况下呈现此注释时,HTML标记被转义,问题消失了。然而,整个链接显示在

我有一个Symfony网站,用户在评论帖子时可以提到其他人。呈现注释时,如果有“”标记,它们也将作为javascript执行

Example comment in the database: I think <a href="https://www.examplesite.com/burak">@joanna</a> was right
数据库中的示例注释:我认为是对的
当我在没有“原始”过滤器的情况下呈现此注释时,HTML标记被转义,问题消失了。然而,整个链接显示在评论中,提及的内容不再可点击

我尝试了下面的自定义过滤器,但也不起作用

class FilterBlackListedExtension extends \Twig_Extension
{

private $blacklistedTags = ['script', 'p'];

public function getFilters()
{
    return array(
        new \Twig_SimpleFilter('filter_black_listed', array($this, 'htmlFilter')),
    );
}

public function htmlFilter($html)
{
    foreach ($this->blacklistedTags as $tag) {
        preg_replace('/(<' . $tag . '>)(.*)(<\/' . $tag . '>)/', '', $html);
    }

    return $html; // maybe even apply the raw filter also afterwards.
}

public function getName()
{
    return 'filter_black_listed_extension';
}

}
class FilterBlackListedExtensions\Twig\u扩展
{
private$blacklistedTags=['script','p'];
公共函数getFilters()
{
返回数组(
新建\Twig\u SimpleFilter('filter\u black\u listed',数组($this,'htmlFilter')),
);
}
公共函数htmlFilter($html)
{
foreach($this->blacklistedTags as$tag){
preg_替换('/()(.*)()/','$html);
}
return$html;//以后可能还会应用原始过滤器。
}
公共函数getName()
{
返回“过滤器\黑色\列表\扩展名”;
}
}
我真正需要的是一个可以转义javascript而不是HTML的过滤器。
注意:我已经尝试了escape(“js”),但也不起作用。在评论中还出现了类似十六进制的字符

您可以使用细枝
striptags
过滤器来转义除要保留的标记以外的所有标记。要删除html标记但保留注释中的链接,请执行以下操作:

{{ comment_content|striptags('<a>') }}
{{comment|u content}条带标签('')}
筛选器的参数是标记的白名单。如果要保留其他标记,只需将它们添加到字符串中:

{{ comment_content|striptags('<a><p><strong>') }}
{{comment|u content}条带标签('')}
请注意,使用
escape(“js”)
不起作用,因为它是在javascript上下文中转义的,也就是在脚本中转义


警告:正如@fgb所指出的,在 通过事件属性(如
123
将使用此解决方案执行


您可以使用细枝
striptags
过滤器来转义除要保留的标记外的所有标记。要删除html标记但保留注释中的链接,请执行以下操作:

{{ comment_content|striptags('<a>') }}
{{comment|u content}条带标签('')}
筛选器的参数是标记的白名单。如果要保留其他标记,只需将它们添加到字符串中:

{{ comment_content|striptags('<a><p><strong>') }}
{{comment|u content}条带标签('')}
请注意,使用
escape(“js”)
不起作用,因为它是在javascript上下文中转义的,也就是在脚本中转义


警告:正如@fgb所指出的,在 通过事件属性(如
123
将使用此解决方案执行


如果您希望允许一些HTML,但避免使用脚本,那么您可以使用类似的工具。这将解析HTML并对其应用自定义白名单。

如果您希望允许某些HTML但避免使用脚本,则可以使用类似的工具。这将解析HTML并对其应用自定义白名单。

如果您只想实现“提及”功能,我认为您不应该允许用户保存HTML,而是应该将提及数据转换为一种结构,以帮助您在渲染时生成输出。e、 g input->“我认为@joanna是对的”->在将该字符串保存到数据库之前,您可以将其转换为“我认为[Tide user id=42]@joanna[/Tide]是对的”。然后您将创建一个细枝过滤器来解析这些标记并生成锚。或者您可以将消息保存为纯文本,并将数据保存在另一个字段中以生成链接。如果您只想实现“提及”功能,我认为您不应该允许用户保存HTML,而是应该将提及数据转换为一种结构,以帮助您在渲染时生成输出。e、 g input->“我认为@joanna是对的”->在将该字符串保存到数据库之前,您可以将其转换为“我认为[Tide user id=42]@joanna[/Tide]是对的”。然后您将创建一个细枝过滤器来解析这些标记并生成锚。或者您可以将消息另存为纯文本,并将数据保存在另一个字段中以生成链接。这与诸如:
123
之类的属性有什么关系?这与诸如:
123
之类的属性有什么关系?可以证明HTMLPurifier的能力。虽然它有点重,但在我自己的网站上,我最终缓存了净化后的结果。但是类似HMTLPurizer的东西也解决了另一个答案中的问题,使用恶意脚本运行属性,如onmouseover,您可以调整HTMLPurifier,以允许或删除您喜欢的任何特定元素上的任何特定属性。我还发现了一个symfony捆绑包,我将尝试在这里更新我的问题。这是该捆绑包的链接。可以证明HTMLPurifier的能力。虽然它有点重,但在我自己的网站上,我最终缓存了净化后的结果。但是类似HMTLPurizer的东西也解决了另一个答案中的问题,使用恶意脚本运行属性,如onmouseover,您可以调整HTMLPurifier,以允许或删除您喜欢的任何特定元素上的任何特定属性。我还发现了一个symfony捆绑包,我将尝试在这里更新我的问题。这是该捆绑包的链接。