Jov*_*vic 2 html-sanitizing symfony twig
我正在调查XSS
我的应用程序可能的攻击向量.
是)我有的:
textarea
字段.通常,此字段可以包含html
标记.Twig
呈现数据的模板.我使用该表单插入以下内容:
<b>Some valid HTML text</b>
<script type="text/javascript">alert("XSS")</script>
Run Code Online (Sandbox Code Playgroud)
查看该数据将需要转义.在转义数据时,我很熟悉一些策略.
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 }}
,输出:一些有效的HTML文本警报("XSS")
这个有用,但我不喜欢它.我宁愿寻找黑名单解决方案,而不是白名单.
现在的问题是:
有没有任何其他转义策略允许html
标签,但<script>
像e("js")
过滤器一样转义标签?
我应该在表单提交期间还是在Twig
呈现期间"杀死"脚本?
我建议添加一个符合您需求的新Twig过滤器.
它应该看起来像
{{var | filter_black_listed() }}
Run Code Online (Sandbox Code Playgroud)
并在过滤器逻辑中添加类似的东西
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';
}
}
Run Code Online (Sandbox Code Playgroud)
如果你没有成功完成这项工作,请告诉我:)
归档时间: |
|
查看次数: |
2246 次 |
最近记录: |