REST API 敏感资源的 URI 设计
REST API URI Design for sensitive resources
我有一个由 RESTFul API 支持的应用程序。该应用程序具有用户管理部分,管理员用户可以通过该部分管理其他用户。下面是 API 操作端点之一的示例 URI。
更新用户:POST https://example.com/api/users/user1
此处user1为管理员正在编辑的用户名
安全方面的建议是从 URI 中删除用户名,因为它是敏感信息,并且因为它是 url 的一部分,它将被记录在网络日志中。建议的解决方案是在 POST 请求正文中传递用户名数据。
将数据移动到请求正文就可以了。但是,如果我从 URI 中删除用户名,URI 将类似于 "**POST https://example.com/api/users**" 。这显然不像是有效的 REST URI。而且我的 USER 实体没有任何其他可以在 URI 中使用的唯一 属性。
在这种情况下,是否有推荐的方法来形成正确的 REST URI?
一种方法是使用“id”而不是“username”:
https://example.com/api/users/{id}
其中“id”通常是 UUID https://en.wikipedia.org/wiki/Universally_unique_identifier
POST /api/users
This clearly doesn't look like a valid REST URI.
当然可以。
REST 不关心资源标识符的拼写,只要拼写符合 RFC 3986 中的生产规则即可。
也就是说,文档的标识符需要包含敏感信息并没有什么特别的原因。
有几种可能的解决方案 - 如果客户端和服务器都知道敏感数据,那么您可以使用散列值而不是原始值作为标识符的一部分。
这并不理想:我们有机械方式来传达接受参数的 URI,但据我所知,没有任何标准可以传达应该首先对某些值进行哈希处理。
如果可以选择按需编码,您或许能够指示通用客户端在发送数据之前对数据进行哈希处理。
否则,我认为您只能在带外交流散列值——想象一个 Web 表单,它指示人们输入敏感信息的散列值。
REST 针对其优化的用例进行了优化,这意味着其他一些用例比我们想要的更笨拙。权衡万岁。
我有一个由 RESTFul API 支持的应用程序。该应用程序具有用户管理部分,管理员用户可以通过该部分管理其他用户。下面是 API 操作端点之一的示例 URI。
更新用户:POST https://example.com/api/users/user1
此处user1为管理员正在编辑的用户名
安全方面的建议是从 URI 中删除用户名,因为它是敏感信息,并且因为它是 url 的一部分,它将被记录在网络日志中。建议的解决方案是在 POST 请求正文中传递用户名数据。
将数据移动到请求正文就可以了。但是,如果我从 URI 中删除用户名,URI 将类似于 "**POST https://example.com/api/users**" 。这显然不像是有效的 REST URI。而且我的 USER 实体没有任何其他可以在 URI 中使用的唯一 属性。
在这种情况下,是否有推荐的方法来形成正确的 REST URI?
一种方法是使用“id”而不是“username”:
https://example.com/api/users/{id}
其中“id”通常是 UUID https://en.wikipedia.org/wiki/Universally_unique_identifier
POST /api/users
This clearly doesn't look like a valid REST URI.
当然可以。
REST 不关心资源标识符的拼写,只要拼写符合 RFC 3986 中的生产规则即可。
也就是说,文档的标识符需要包含敏感信息并没有什么特别的原因。
有几种可能的解决方案 - 如果客户端和服务器都知道敏感数据,那么您可以使用散列值而不是原始值作为标识符的一部分。
这并不理想:我们有机械方式来传达接受参数的 URI,但据我所知,没有任何标准可以传达应该首先对某些值进行哈希处理。
如果可以选择按需编码,您或许能够指示通用客户端在发送数据之前对数据进行哈希处理。
否则,我认为您只能在带外交流散列值——想象一个 Web 表单,它指示人们输入敏感信息的散列值。
REST 针对其优化的用例进行了优化,这意味着其他一些用例比我们想要的更笨拙。权衡万岁。