我正在设计一个 (as-RESTful-as-possible) API,想知道您如何最好地解决以下问题:
GET /objects/{id}
{id}s
存储在我们的 Web 服务器日志中,因此我们希望避免使用查询字符串或 URI 参数;这给我们留下了请求正文中的参数。 (假设数据是敏感的,我们无法访问另一个非敏感的 id)我们如何(应该)设计 API
GET
端点以避免使用可以记录的查询或 URI 参数?在这种情况下使用POST是否可以接受还是有其他创造性的方式?
(注意:此 API 不会暴露给第三方)
最佳答案
我认为有很多服务都面临着想要保护敏感标识符的问题。然而,即使这个问题已经有些年头了,我也没有找到合适的解决方案。
所提供的简单更改网络服务器日志记录的解决方案并不完美,如前所述,但也忽略了这样一个事实,即每个客户端在使用您的 API 时都应该这样做(其中可能是 JavaScript 客户端,通过代理,在浏览器中。 ..祝你好运)
我知道的解决方案是:
解决方案 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/