api - REST API 设计 : GET requires sensitive parameters that should not be stored in web server logs

标签 api rest api-design

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

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

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

    最佳答案

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

    所提供的简单更改网络服务器日志记录的解决方案并不完美,如前所述,但也忽略了这样一个事实,即每个客户端在使用您的 API 时都应该这样做(其中可能是 JavaScript 客户端,通过代理,在浏览器中。 ..祝你好运)

    我知道的解决方案是:

  • 加密参数;但这会使您的 API 更加复杂,并且需要加密 key 。
  • 使用伪 ID,如@jj-geewax 所述;然而,这可能比 encyption (1) 更复杂,因为您必须为每个敏感参数实例交换一个伪 ID:
  • 客户端在向服务器发出的请求中使用伪 ID 发起,服务器比向客户端发出请求来解析伪 ID! (所以客户端也应该有一个端点!)
  • 客户端将敏感 ID POST 到服务器,它接收到一个伪 ID,它可以在针对此 ID 的请求中使用该 ID
  • 客户端和服务器事先通过其他方式交换了伪ID
  • POST 正文中的参数,同时请求数据;这不是休息
  • 可以选择使用 X-HTTP-Method-Override 使您实际请求数据的应用程序更加明确。

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

    更新:OWASP 对请求中的敏感参数做了以下说明

    Sensitive information in HTTP requests

    RESTful web services should be careful to prevent leaking credentials. Passwords, security tokens, and API keys should not appear in the URL, as this can be captured in web server logs, which makes them intrinsically valuable.

    • In POST/PUT requests sensitive data should be transferred in the request body or request headers.
    • In GET requests sensitive data should be transferred in an HTTP Header.


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

    这可能比使用 (POST) 正文要困难一些,但在查看如何实现 REST 时也很好。

    关于api - REST API 设计 : GET requires sensitive parameters that should not be stored in web server logs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32213026/

    相关文章:

    list - 删除项目后刷新列表 - Flutter

    java - 未能关闭 Spring Boot 安全配置

    python - DRF 在序列化器 update() 调用中更新 ManyToMany

    rest - 如何指示 REST API 端点已删除

    facebook - Facebook OAuth有时会出现验证码验证错误

    java - 请放心,代码在 java API 中给出 503 响应,但在 POSTMAN 中工作正常

    php - HTTP 400 错误请求 - CURL PHP

    ruby-on-rails - 将字符串集合作为参数传递的最佳 RESTful 方式是什么?

    .net - 为什么 C++/CLI 编译器不会针对过时的属性调用生成警告?

    c - 返回错误的首选方式是什么?