我正在为我的应用程序调查可能的XSS
攻击媒介。
我有什么:
- 具有单个
textarea
字段的窗体类型。通常,此字段可以包含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
风味输出:x3Cbx3ESomex20validx20HTMLx20textx3Cx2Fbx3Ex0Dx0Ax3Cscriptx20typex3Dx22textx2Fjavascriptx22x3Ealertx28x22XSSx22x29x3Cx2Fscriptx3E
3){{ var|striptags('<br>')|raw }}
,输出:一些有效的HTML文本警报("XSS")
这个有效,但不知何故我不喜欢它。我正在寻找黑名单解决方案,而不是白名单。
现在的问题:
是否有任何其他转义策略允许html
标签,但像过滤器一样转义<script>
标签e("js")
?
我应该在表单提交期间还是在Twig
渲染期间"杀死"脚本?
我建议添加一个适合您需求的新 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';
}
}
如果您无法使这项工作:),请告诉我