0

假设我们有一个允许输入一段降价作为消息正文的表单。然后该文本在 HTML 中呈现为另一个页面上的JSON :

<html>
   <body>
       <script type="text/javascript">
       loadMessage({
           name: 'John Doe',
           message: '**Hello** World'
       });
       </script>
   </body>
</html>

假装loadMessage使用降价解析器(例如标记)并在运行时输出 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. '</' + 'script>'为此利用 JSON 格式化程序 -在编写 JSON 时转换为。我们会保持源的完整——但也许这是一件坏事

我们应该如何减轻这种攻击?

4

1 回答 1

1

我个人可能会同意剥离任何类似于脚本标签的东西,因为这种方法会为你的 Markdown 解析器中的验证错误提供额外的安全层。但是您的里程可能会因您的应用程序而异。

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

<html>
  <script>
    alert("1 \x3c/script> 2");
  </script>
</html>
于 2013-04-16T04:59:27.350 回答