REST API - JSON内容应该是HtmlEncoded吗?

时间:2017-06-03 16:37:56

标签: angular asp.net-web-api asp.net-web-api2 xss

我们设置了角度前端应用程序和asp.net核心web api后端。 API用json响应。 问题是,json属性是否应该是html编码?

我可以看到两者的原因:pro和con。

一方面,REST API应该是客户端不可知的(因此,不应该特别关注html),另一方面,单独依赖客户端XSS预防感觉有点冒险。

思想?

2 个答案:

答案 0 :(得分:1)

嗯,不得不考虑一下,但我会这样做: 在JSON之上没有其他HTML编码。确保设置正确的内容类型。如果您有“不安全”的数据字段,您认为这些数据字段特别危险,那么您可以将文档中的数据字段指定为HTML编码,而不会破坏JSON。

所以以下两行都很好:

{'data': '<script>alert(1)</script>'} # Normal, how I would do it
{'data': '&lt;script&gt;alert(1)&lt;/script&gt;'} # unsafe data field which is documented as html encoded

答案 1 :(得分:1)

几点:

  • 不同背景需要不同的编码。对所有数据进行html编码烘焙可能并不总是好的,特别是如果你以某种方式写入Javascript上下文,它对XSS没用。所以从这个角度来看,我认为JSON是数据,只需要json编码而不是html。当然,客户端数据绑定或其他东西需要处理编码或安全绑定。
  • 如果在API调用中返回JSON,则响应的内容类型至关重要。它必须是application/json,否则如果json端点本身包含<script>等,它将容易受到XSS的攻击。<​​/ li>
  • 如果您将JSON数据写入脚本块,例如初始化变量,则会变得棘手。请考虑以下事项:
<script>
  var data = "{'key1': 'val1', 'key2': 'val2'}";
</script>

看起来不错,但请看一下:

<script>
  var data = "{'key1': 'val1', 'key2': '</script><script>alert(1)</script>'}";
</script>

它看起来像一个简单的字符串,但浏览器主要是一个HTML解析器。它在&lt; script&gt;之间找到了东西。和&lt; / script&gt;并执行它作为Javascript。字符串中的第一个</script>恰好与第一个<script>标记配对,字符串中的第一个打开标记将启动一个全新的脚本,从而产生XSS。

因此,如果您打算将JSON作为Javascript(一种非常常见的用途)的一部分写入html,则需要将JSON内容编码为HTML。最好避免这种情况并单独下载数据。