如何在我的 JSON Web 服务中防止反射 XSS?

信息安全 xss 网络服务 阿贾克斯 json
2021-09-02 04:25:52

我有一个 Web 服务,它接受 POST 数据 (JSON) 并在 JSON 响应中返回请求对象的一部分。

如果响应被浏览器呈现为 HTML,这对 XSS 开放,因为有人可以将任意 HTML 添加到请求对象。

减轻这种情况的标准方法是什么?我能想到的当前选项是:

  • 仅允许带有X-Requested-With: XMLHttpRequest标头的请求来阻止依赖对我的服务的非 ajax 请求的攻击
  • 发送内容类型的响应application/json并希望浏览器拒绝将其呈现为 HTML
  • 在响应中编码不安全的字符(我该怎么做?使用 \uxxxx?)

我一直无法找到具体的参考资料。

3个回答

在响应中编码不安全的字符(我该怎么做?使用 \uxxxx?)

是的。<特别要\u003C

您的 JSON 编码器中可能已经有一个选项可以执行此操作(例如,在 PHP 中JSON_HEX_TAG);否则,在编码后进行字符串替换是一项简单的工作。(这是安全的,因为除了字符串文字之外,在 JSON 中没有任何地方<可以合法使用 a。)此时,您还可以包含前导箔条以防止包含跨域脚本。

为了正确起见,我会发送application/json,但我不相信每个旧浏览器都一定会尊重它。依赖X-Requested-With标头通常是有问题的,因为它不能很好地与缓存一起使用,尽管这对您来说可能不是一个问题。

应牢记以下几点

  • 使用正确的 Content-Type 可以避免潜在的 XSS 漏洞。所有 JSON 响应都应使用该application/json 类型。

  • nosniff头用于禁用旧版本 Internet Explorer 上的内容嗅探。

  • 始终让外部原语成为 JSON 字符串的对象:

可利用:

[{"object": "inside an array"}]

不可利用:

{"object": "not inside an array"}

同样不可利用:

{"result": [{"object": "inside an array"}]}

将 Content-Type 设置为 application/json,并设置 X-Content-Type-Options: nosniff (最后一个标头指示浏览器使用给定的内容类型 - 无需额外猜测)。您甚至可以考虑添加 Content-Disposition: 附件标头。这将被 XHR 请求忽略,但如果攻击者试图诱骗用户直接在浏览器中打开下载对话框,则会弹出下载对话框。

你也可以看看:http ://erlend.oftedal.no/blog/?blogid=127和http://erlend.oftedal.no/blog/?blogid=134