我们应该如何防止*仅*破坏页面呈现的XSS攻击?

时间:2013-04-16 00:19:34

标签: javascript html asp.net-mvc json xss

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

  1. 提交初始表单时删除所有<script></script>。这将意味着更新我们的许多框架代码(使用ASP.NET MVC - 所以我们必须扩展默认的ModelBinder)。
  2. 利用JSON格式化程序 - 在编写JSON时转换为'</' + 'script>'。我们将保持源完好 - 但也许这是一件坏事
  3. 我们应该如何减轻这种攻击?

1 个答案:

答案 0 :(得分:1)

我可能会亲自去除类似脚本标记的内容,因为这样的方法可以为Markdown解析器中的验证错误提供额外的安全层。但您的里程可能因申请而异。

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

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