在设计RESTful API时,我一直在努力遵循良好的做法。其中一个非常简单和常见的方法一直很难遵循:
- 使用
GET
http谓词检索资源
为什么?假设你有一个URI来获得这样的帐户信息:
- http://www.example.com/account/AXY_883772
其中,AXY_883772
是银行系统中的帐户id。安全审计将发出警告,说明:
- 帐户ID将显示在HTTP访问日志上
- 帐户ID可能会缓存在浏览器的历史记录中(即使不太可能定期使用浏览器访问RESTful API)
最后,他们"建议"使用POST
动词。
所以,我的问题是:
我们能做些什么?只需遵循安全建议并避免在大多数情况下使用GET
?使用某种特殊的APACHE/IIIS/NGINX访问日志配置来避免记录对某些URL的访问?
如果你的url中有敏感信息,并且你正在记录url,那么你就是在记录敏感信息。
所以有两个明显的解决方案:
- 不记录url
- 使用不包含敏感信息的其他url
最后一个可以通过使用服务器映射回正常id的一些(不同的)id来实现。
如果这两种解决方案都不适合您,那么您就不能使用GET,因此这不是一个好的RESTful设计。
我意识到所有这些事情对你来说可能已经很明显了;但这是我能给出的最准确的答案。
毫无价值的是,这不仅适用于GET,实际上PUT、DELETE和POST也是如此。