我有一个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;)但这也没有用。它还在评论中提出了十六进制字符。
答案 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>
。