假设我们有一个表单允许输入一个markdown作为消息正文。然后,该文本将在HTML中呈现为另一个页面上的 JSON :
<html>
<body>
<script type="text/javascript">
loadMessage({
name: 'John Doe',
message: '**Hello** World'
});
</script>
</body>
</html>
假设loadMessage
使用降价解析器(例如marked)并在运行时输出HTML。
我发现了恶意用户可能在页面上出错的情况:
<html>
<body>
<script type="text/javascript">
loadMessage({
name: 'John Doe',
message: '</script>'
});
</script>
</body>
</html>
由于</script>
导致浏览器关闭脚本块,因此会引发Unexpected token ILLEGAL
异常。 Marked能够对这种攻击进行消毒,但这种攻击甚至可以在JavaScript执行之前完成。
<script>
和</script>
。这将意味着更新我们的许多框架代码(使用ASP.NET MVC - 所以我们必须扩展默认的ModelBinder)。'</' + 'script>'
。我们将保持源完好 - 但也许这是一件坏事。我们应该如何减轻这种攻击?
答案 0 :(得分:1)
我可能会亲自去除类似脚本标记的内容,因为这样的方法可以为Markdown解析器中的验证错误提供额外的安全层。但您的里程可能因申请而异。
如果您确实需要编码,请参阅https://stackoverflow.com/a/236106/131903了解合理的编码方法(即使用\ x3c替换小于号)。这将有效:
<html>
<script>
alert("1 \x3c/script> 2");
</script>
</html>