REST API设计:GET需要不应存储在Web服务器日志中的敏感参数

gb.*_*gb. 6 api rest api-design

我正在设计一个(as-RESTful-as-possible)API,并想知道如何最好地解决以下问题:

  • 假设我们正在设计一个TLS端点来检索一些资源: GET /objects/{id}
  • 我们不希望对象{id}s存储在我们的Web服务器日志中,因此我们希望避免使用查询字符串或URI参数; 这让我们在请求体中留下了params.(假设数据是id敏感的,我们无权访问另一个非敏感的id)
  • 我知道建议不要在GET请求体中使用参数.带请求正文的HTTP GET
  • 我知道使用POST来获取数据也是值得推荐的,因为它更倾向于RPC设计风格,并且通常会让人感到困惑.

我们如何(应该)设计API GET端点以避免使用可能被记录的查询或URI参数?
在这种情况下使用POST还是有其他创造性方法可以接受吗?
(注意:此API不会向第三方公开)

Lva*_*Ree 4

我认为有很多服务都面临着想要保护敏感标识符的问题。然而,即使这个问题已经有几年了,我也没有找到合适的解决方案。

正如已经提到的,所提供的简单地改变网络服务器日志记录的解决方案并不完美,但也忽略了这样一个事实:每个客户端在使用 API 时都应该执行相同的操作(其中可能是 JavaScript 客户端,通过代理在浏览器中)。 ..祝你好运)

我所知道的解决方案是:

  1. 对参数进行加密;但这会使您的 API 更加复杂,并且需要加密密钥。

  2. 使用伪 ID,如 @jj-geawax 所提到的;然而,这可能比加密 (1) 更复杂,因为您必须为每个敏感参数实例交换伪 ID:

    • 客户端在向服务器发出请求时使用伪 ID,服务器随后向客户端发出请求来解析伪 ID!(所以客户端也应该有一个端点!)
    • 客户端将敏感 ID 发布到服务器,并为其接收一个伪 ID,可以在对此 ID 的请求中使用该伪 ID
    • 客户端和服务器已经通过其他方式提前交换了伪ID
  3. POST body中的参数,同时请求数据;这不是休息

    • 可以选择使用 X-HTTP-Method-Override 来使您实际请求数据的应用程序更加明确。

解决方案 3 似乎是迄今为止最简单/最容易实现的方法,尽管它违反了 REST 设计规则。但我有兴趣听到替代方法或其他见解。

更新:OWASP 对于请求中的敏感参数说了以下内容

HTTP请求中的敏感信息

RESTful Web 服务应小心防止凭据泄露。密码、安全令牌和 API 密钥不应出现在 URL 中,因为这可以在 Web 服务器日志中捕获,这使得它们具有内在价值。

  • 在 POST/PUT 请求中,敏感数据应在请求正文或请求标头中传输。
  • 在 GET 请求中,敏感数据应在 HTTP 标头中传输。

https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html#sensitive-information-in-http-requests

这可能比使用 (POST) 主体有点困难,但在了解如何实现 REST 时也很好。