REST API - JSON 内容是否应该进行 HtmlEncoded?
REST API - should JSON content be HtmlEncoded?
我们设置了 angular 前端应用程序和 asp.net 核心网络 api 后端。 API 以 json 响应。
问题是,json 属性是否应该 html 编码?
我可以看到两者的原因:赞成和反对。
一方面,REST API 应该与客户端无关(因此,不应该特别关心 html),另一方面,依赖客户端感觉有点冒险-单侧 XSS 预防。
想法?
嗯,不得不考虑一下,但我会这样做:
在 JSON 之上没有额外的 HTML 编码。确保设置正确的内容类型。如果您有 "unsafe" 个您认为特别危险的数据字段,那么您可以在文档中将这些字段指定为 HTML 编码,而不会破坏 JSON 一般。
所以下面两行都可以:
{'data': '<script>alert(1)</script>'} # Normal, how I would do it
{'data': '<script>alert(1)</script>'} # unsafe data field which is documented as html encoded
几点:
- 不同的上下文需要不同的编码。在 html 中烘焙所有数据的编码可能并不总是好的,特别是如果你以某种方式写入 Javascript 上下文,它对 XSS 毫无用处。所以从这个角度来看,我认为 JSON 是数据,它只需要 json 编码而不是 html。当然,客户端数据绑定或其他东西需要处理编码或安全绑定。
- 如果在 API 调用中返回 JSON,则响应的内容类型至关重要。它必须是
application/json
,否则 json 端点本身如果包含 <script>
等 将容易受到 XSS 攻击
- 如果您将 JSON 数据写入脚本块以初始化变量,这会变得很棘手。考虑以下因素:
<script>
var data = "{'key1': 'val1', 'key2': 'val2'}";
</script>
这看起来不错,但看看这个:
<script>
var data = "{'key1': 'val1', 'key2': '</script><script>alert(1)</script>'}";
</script>
它看起来像一个简单的字符串,但浏览器主要是一个 html 解析器。它会在 之间找到内容,并将其作为 Javascript 执行。字符串中的第一个 </script>
恰好与第一个 <script>
标签配对,字符串中第一个打开的标签将启动一个全新的脚本,从而导致 XSS。
因此,如果您打算将 JSON 写入 html 作为 Javascript 的一部分(非常常见的用法),您需要将 JSON 内容编码为HTML 不幸的是。最好避免这种情况并单独下载数据。
我们设置了 angular 前端应用程序和 asp.net 核心网络 api 后端。 API 以 json 响应。 问题是,json 属性是否应该 html 编码?
我可以看到两者的原因:赞成和反对。
一方面,REST API 应该与客户端无关(因此,不应该特别关心 html),另一方面,依赖客户端感觉有点冒险-单侧 XSS 预防。
想法?
嗯,不得不考虑一下,但我会这样做: 在 JSON 之上没有额外的 HTML 编码。确保设置正确的内容类型。如果您有 "unsafe" 个您认为特别危险的数据字段,那么您可以在文档中将这些字段指定为 HTML 编码,而不会破坏 JSON 一般。
所以下面两行都可以:
{'data': '<script>alert(1)</script>'} # Normal, how I would do it
{'data': '<script>alert(1)</script>'} # unsafe data field which is documented as html encoded
几点:
- 不同的上下文需要不同的编码。在 html 中烘焙所有数据的编码可能并不总是好的,特别是如果你以某种方式写入 Javascript 上下文,它对 XSS 毫无用处。所以从这个角度来看,我认为 JSON 是数据,它只需要 json 编码而不是 html。当然,客户端数据绑定或其他东西需要处理编码或安全绑定。
- 如果在 API 调用中返回 JSON,则响应的内容类型至关重要。它必须是
application/json
,否则 json 端点本身如果包含<script>
等 将容易受到 XSS 攻击
- 如果您将 JSON 数据写入脚本块以初始化变量,这会变得很棘手。考虑以下因素:
<script> var data = "{'key1': 'val1', 'key2': 'val2'}"; </script>
这看起来不错,但看看这个:
<script> var data = "{'key1': 'val1', 'key2': '</script><script>alert(1)</script>'}"; </script>
它看起来像一个简单的字符串,但浏览器主要是一个 html 解析器。它会在 之间找到内容,并将其作为 Javascript 执行。字符串中的第一个 </script>
恰好与第一个 <script>
标签配对,字符串中第一个打开的标签将启动一个全新的脚本,从而导致 XSS。
因此,如果您打算将 JSON 写入 html 作为 Javascript 的一部分(非常常见的用法),您需要将 JSON 内容编码为HTML 不幸的是。最好避免这种情况并单独下载数据。