HTTP/HTTPS 请求中避免使用 URL Query String 传递敏感数据

本文从安全的角度说明 URL Query String 传递敏感数据的危害。

哪些地方可以用来传递参数

URL Query String

参见文档:https://tools.ietf.org/html/rfc3986#section-3.4

举个例子:

GET /test/getUserInfo?id=1234 HTTP/1.1 
Cookie: xxxxxx
Origin: https://test.test.com
Content-Type: application/x-www-form-urlencoded
Accept: application/json, text/javascript, */*; q=0.01
Referer: https://test.test.com/test
Host: test.test.com

在此例子中 “id=1234” 就是通过 URL Query String 的方式传递

HTTP Headers

参见文档:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
https://tools.ietf.org/html/rfc7235#section-4.2
https://tools.ietf.org/html/rfc6265

常见的 HTTP Headers (Authorization、Cookie) 传递参数(常用于传输鉴权参数)

‘X-’ 前缀开头的自定义 Header 已经在2012年6月发布的 rfc6648标准 中弃用,不推荐使用,因为会出现在某些环境中出现自定义 Header 传递过程被抛弃的情况。

POST Entity Body

参见文档:
https://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html#sec7.2
https://tools.ietf.org/html/rfc7231#section-4.3.3

举个例子:

POST /web/login HTTP/1.1
Cookie: xxxxxx
Origin: https://test.test.com
Content-Type: application/x-www-form-urlencoded
Accept: application/json, text/javascript, */*; q=0.01
Referer: https://test.test.com/test
Host: test.test.com

user=xx&pwd=xxxxx

其中 user 字段和 pwd 字段都是放在 POST Entity Body 中传输

避免使用 URL Query String 传递敏感数据

  • CDN 日志、SLB 日志中会记录 URL Query String 信息,这部分日志将成为不受控的危险数据
  • URL 请求存储在浏览器历史记录中,这会导致公共设备上泄漏这部分 URL Query String 传递的参数
  • URL 在 Referrer 请求头中被传递,这会导致地方网站有机会获取这部分 URL Query String 传递的参数

最后的建议

  • 使用 Cookie 传输用户鉴权参数
  • 使用 POST Entity Body 传输敏感数据避免被浏览器、CDN 日志系统、SLB 日志系统记录敏感数据(例如密码、身份证、SESSION 等)