假设我们有一个表单允许输入一个markdown作为消息体。该文本然后在HTML呈现为JSON另一页上:我们应该如何防止*只*破坏页面渲染的XSS攻击?
<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
抛出异常。标记能够消除这种攻击,但是这种攻击甚至在JavaScript执行之前。
- 当提交初始表格时,全部剥去
<script>
和</script>
。这意味着需要更新很多框架代码(使用ASP.NET MVC--所以我们必须扩展默认的ModelBinder)。 - 充分利用JSON格式化程序 - 在编写JSON时转换为
'</' + 'script>'
。我们会保持源代码完整 - 但也许这是坏事。
我们应该如何缓解这种攻击?
为什么你不逃避HTML实体? – Blender
这是降价和降价[允许HTML](http://daringfireball.net/projects/markdown/syntax#html)。真的值得它逃脱,然后在客户端上冒险吗? – TheCloudlessSky
是否有任何特别的原因让你将Markdown输出到JavaScript中,而不是直接输入到HTML中? – Blender