2013-04-16 19 views
0

假设我们有一个表单允许输入一个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执行之前。

  1. 当提交初始表格时,全部剥去<script></script>。这意味着需要更新很多框架代码(使用ASP.NET MVC--所以我们必须扩展默认的ModelBinder)。
  2. 充分利用JSON格式化程序 - 在编写JSON时转换为'</' + 'script>'。我们会保持源代码完整 - 但也许这是坏事

我们应该如何缓解这种攻击?

+0

为什么你不逃避HTML实体? – Blender

+0

这是降价和降价[允许HTML](http://daringfireball.net/projects/markdown/syntax#html)。真的值得它逃脱,然后在客户端上冒险吗? – TheCloudlessSky

+0

是否有任何特别的原因让你将Markdown输出到JavaScript中,而不是直接输入到HTML中? – Blender

回答

1

我个人可能会剥夺类似脚本标记的任何东西,因为这样的方法将为您的Markdown解析器中的验证错误提供额外的安全性。但是,您的里程可能会因应用程序而异。

如果确实需要编码,请参阅https://stackoverflow.com/a/236106/131903以获得合理的编码方法(即使用\ x3c替换小于号)。这将工作:

<html> 
    <script> 
    alert("1 \x3c/script> 2"); 
    </script> 
</html> 
+0

当表单发布或JSON呈现时,您会剥离该值吗? – TheCloudlessSky

+1

一个公平的问题。剥离输入更安全,但永久丢失数据。但这样你就不必去掉每一个输出,并且由于脚本标记不太可能成为你的重要数据,所以我会选择更安全的路线(在添加足够的单元测试以确保我的分离器实际工作正常)。 –

+0

是的 - 我要去剥离输入。干杯! – TheCloudlessSky