Twig:允许 HTML,但转义脚本
Twig: Allow HTML, but escape script
我正在调查我的应用程序可能的 XSS
攻击媒介。
我有:
- 具有单个
textarea
字段的 FormType。通常这个字段可以包含 html
个标签。
Twig
呈现插入数据的模板。
我使用该表格插入以下内容:
<b>Some valid HTML text</b>
<script type="text/javascript">alert("XSS")</script>
查看该数据需要转义。在转义数据时,我熟悉的策略很少。
1) raw
过滤器:完全禁用转义 -> 引入可能的 XSS
2) e
过滤器:
html
风味输出:<b>Some valid HTML text</b> <script type="text/javascript">alert("XSS")</script>
js
风味输出:\x3Cb\x3ESome\x20valid\x20HTML\x20text\x3C\x2Fb\x3E\x0D\x0A\x3Cscript\x20type\x3D\x22text\x2Fjavascript\x22\x3Ealert\x28\x22XSS\x22\x29\x3C\x2Fscript\x3E
3) {{ var|striptags('<br>')|raw }}
, 输出: Some valid HTML text alert("XSS")
这个很管用,但我不喜欢它。我宁愿寻找黑名单解决方案,而不是白名单。
现在问题:
是否有任何其他转义策略允许 html
标签但像 e("js")
过滤器那样转义 <script>
标签?
我应该在表单提交期间或 Twig
呈现期间 "kill" 脚本吗?
我建议添加一个适合您需要的新 Twig 过滤器。
它应该看起来像
{{var | filter_black_listed() }}
并在过滤器逻辑中添加类似
的内容
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 . '>)/g', '', $html);
}
return $html; // maybe even apply the raw filter also afterwards.
}
public function getName()
{
return 'filter_black_listed_extension';
}
}
如果您无法完成这项工作,请告诉我:)
我正在调查我的应用程序可能的 XSS
攻击媒介。
我有:
- 具有单个
textarea
字段的 FormType。通常这个字段可以包含html
个标签。 Twig
呈现插入数据的模板。
我使用该表格插入以下内容:
<b>Some valid HTML text</b>
<script type="text/javascript">alert("XSS")</script>
查看该数据需要转义。在转义数据时,我熟悉的策略很少。
1) raw
过滤器:完全禁用转义 -> 引入可能的 XSS
2) e
过滤器:
html
风味输出:<b>Some valid HTML text</b> <script type="text/javascript">alert("XSS")</script>
js
风味输出:\x3Cb\x3ESome\x20valid\x20HTML\x20text\x3C\x2Fb\x3E\x0D\x0A\x3Cscript\x20type\x3D\x22text\x2Fjavascript\x22\x3Ealert\x28\x22XSS\x22\x29\x3C\x2Fscript\x3E
3) {{ var|striptags('<br>')|raw }}
, 输出: Some valid HTML text alert("XSS")
这个很管用,但我不喜欢它。我宁愿寻找黑名单解决方案,而不是白名单。
现在问题:
是否有任何其他转义策略允许 html
标签但像 e("js")
过滤器那样转义 <script>
标签?
我应该在表单提交期间或 Twig
呈现期间 "kill" 脚本吗?
我建议添加一个适合您需要的新 Twig 过滤器。
它应该看起来像
{{var | filter_black_listed() }}
并在过滤器逻辑中添加类似
的内容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 . '>)/g', '', $html);
}
return $html; // maybe even apply the raw filter also afterwards.
}
public function getName()
{
return 'filter_black_listed_extension';
}
}
如果您无法完成这项工作,请告诉我:)