如何设计 API URL 以符合 GDPR 和 OWASP 并避免 URL 中的个人身份信息

How design API URLs to comply with GDPR and OWASP and avoid Personal Identifiable Information in URL

个人身份信息 (PII) 应被视为敏感信息,OWASP 声明敏感数据不应成为 URL 的一部分。 https://owasp-aasvs.readthedocs.io/en/latest/requirement-9.1.html

GDPR 规定直接或间接识别个人的“在线标识符”是 PII。 https://gdpr.eu/article-4-definitions/

一个 API 提供用户偏好的资源项可能如下所示:

{
  "id": "abc123"           //generated id
  "language": "en_EN",
  "favoriteColor": "BLUE",
  "userId": "peter@example.com"
}

那么 API 拥有此资源的 link 可以吗?

https://example.com/user-preferences/abc123 

根据我的理解,这将是一个间接在线标识符的示例。这是否意味着需要对 id 进行加密?如果是这种情况 - 这是否意味着每次对 id 的加密(即每次从 API 提供 URL 时)都必须使用不同的盐加密以避免引入新的间接标识符?

同一资源的不同 URL:

https://example.com/user-preferences/87wytu09ufwc2ercler4ri // abc123 encrypted with salt A
https://example.com/user-preferences/diu4w98iuywfgommbvwdxe // abc123 encrypted with salt B

我们这里的安全性和合规性要求对我们的 API 设计有直接影响。事实上,将敏感数据放入 URLs 被认为是不好的做法(原因 - 每个代理、负载平衡器、API 网关、Web 服务器……允许记录 URLs 用于调试目的的传入请求,我们不希望敏感数据以这种方式传播)。另一方面 - 执行 GET 请求最终变得棘手,因为我们无法将我们想要的所有内容简单地放入请求 body。 GET 请求的参数以 URL 结尾,因为 HTTP 和 REST 就是这样设计的。

那么,我们可以做些什么来满足安全和合规性需求?我至少想到了两件事。

  1. 将敏感数据放入请求 headers。他们最终不会成为 URL 的一部分,所以问题解决了。
  2. 按照您提出的方式解决问题。这对这个行业来说并不是什么新鲜事。按照解决insecure direct object references.
  3. 的路径即可

我自己会去 1。怎么回事,测试数据如何处理,没有2那么神秘