Symfony - 渲染时提到的Twig XSS漏洞

时间:2018-04-14 16:37:29

标签: symfony twig xss

我有一个Symfony网站,用户在评论帖子时可以提及其他人。提交评论时,如果有"<"脚本">"标签也以javascript的形式执行。

Example comment in the database: I think <a href="https://www.examplesite.com/burak">@joanna</a> was right

当我在没有&#34; raw&#34;过滤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';
}

}

我真正需要的是一个可以转义javascript而不是HTML的过滤器。 注意:我已经尝试过逃生(&#34; js&#34;)但这也没有用。它还在评论中提出了十六进制字符。

2 个答案:

答案 0 :(得分:3)

如果您想允许某些HTML但避免使用脚本,那么您可以使用HTMLPurifier之类的工具。这将解析HTML并将自定义白名单应用于它。

答案 1 :(得分:1)

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

{{ comment_content|striptags('<a>') }}

过滤器的参数是标签的白名单。如果您想保留其他标签,只需将它们添加到字符串中:

{{ comment_content|striptags('<a><p><strong>') }}

有关信息,使用escape("js")无效,因为它意味着在javascript 上下文中转义,这意味着在脚本中。

  

警告:正如@fgb所指出的,插入了javascript   标签通过事件属性,如
  使用此解决方案将执行<a onmouseover='alert(1)'>123</a>