Restful API: url 中的敏感数据
Restful API: Sensitive data in url
我想创建一个 API 来获取客户详细信息。
url可以是Get https://../customers/{customerId}.
我的问题是customerId很敏感,可以传进去吗url?
如果没有,最好的方法是什么?
很奇怪 customerId
是信息的敏感部分。你也没有太多的背景。我能想到的使其安全的选项:
- 将敏感
customerId
替换为链接到 UUID 或其他非敏感信息,然后从 UUID 查找以找到真正的客户。
- 使用POST和 https 以保护敏感信息
第一个问题,customerId
真的敏感吗?
在某些时候,您的客户端会将资源的标识符传递给 API。即使您加密该值,或将其作为 POST 请求打包在有效负载中,该值仍然可以被检查,并且仍然可以被真正想要访问或更改它的客户端或数据包嗅探器伪造。
答:是的,你可以在url
中传递customerId
这是一个标准的期望,实际上它可能与 尝试 绕过在路由中传递 Id 的直觉相反,它会更容易编码和管理基于 REST API 如果 Id 是路由的一部分。
但有可能...
具体实现取决于你的运行时和代码框架,但作为一种设计模式
可以将重写模块或中间件写入服务器,以便解密加密的查询字符串,然后将响应管道在内部重定向到 internal 或 安全路线。通过这种方式,您将在标准 API 处理之间注入此 security 层,而不必在每个端点处编写任何特殊 hack 来解析 Id是从客户端传递过来的。
然而...
这意味着客户端必须加密或计算发送到 API 的值,这意味着现在客户端拥有可以创建令牌的代码,因此这是一项微不足道的任务对逻辑进行逆向工程并为其他 客户创建您自己的代币。
而不是加密
在我遇到的上一个项目中,这是一个 虚荣 问题。我们不希望用户尝试通过更改 URL 中的 ID 来破解系统,在某些情况下,他们只是不希望用户 感觉像一个数字 ...
所以在这种情况下,它与真正的安全或机密性无关,而是我所说的 100% 虚荣。
这样,客户端使用参数调用 API 上的端点,它 returns 一个 令牌 。最后我确实使用了加密来避免存储原始参数,但重点是 API returns 它知道如何解密的令牌。
You might be familiar with Tiny URL services, this is pretty much the same concept.
我发现用户加密更简单,在这种情况下,服务器同时持有加密和解密密钥,所以我不担心客户端受感染的人会危及安全,但同样,这不是作为安全功能。
我想创建一个 API 来获取客户详细信息。
url可以是Get https://../customers/{customerId}.
我的问题是customerId很敏感,可以传进去吗url?
如果没有,最好的方法是什么?
很奇怪 customerId
是信息的敏感部分。你也没有太多的背景。我能想到的使其安全的选项:
- 将敏感
customerId
替换为链接到 UUID 或其他非敏感信息,然后从 UUID 查找以找到真正的客户。 - 使用POST和 https 以保护敏感信息
第一个问题,customerId
真的敏感吗?
在某些时候,您的客户端会将资源的标识符传递给 API。即使您加密该值,或将其作为 POST 请求打包在有效负载中,该值仍然可以被检查,并且仍然可以被真正想要访问或更改它的客户端或数据包嗅探器伪造。
答:是的,你可以在url
中传递customerId这是一个标准的期望,实际上它可能与 尝试 绕过在路由中传递 Id 的直觉相反,它会更容易编码和管理基于 REST API 如果 Id 是路由的一部分。
但有可能...
具体实现取决于你的运行时和代码框架,但作为一种设计模式 可以将重写模块或中间件写入服务器,以便解密加密的查询字符串,然后将响应管道在内部重定向到 internal 或 安全路线。通过这种方式,您将在标准 API 处理之间注入此 security 层,而不必在每个端点处编写任何特殊 hack 来解析 Id是从客户端传递过来的。
然而...
这意味着客户端必须加密或计算发送到 API 的值,这意味着现在客户端拥有可以创建令牌的代码,因此这是一项微不足道的任务对逻辑进行逆向工程并为其他 客户创建您自己的代币。
而不是加密
在我遇到的上一个项目中,这是一个 虚荣 问题。我们不希望用户尝试通过更改 URL 中的 ID 来破解系统,在某些情况下,他们只是不希望用户 感觉像一个数字 ...
所以在这种情况下,它与真正的安全或机密性无关,而是我所说的 100% 虚荣。
这样,客户端使用参数调用 API 上的端点,它 returns 一个 令牌 。最后我确实使用了加密来避免存储原始参数,但重点是 API returns 它知道如何解密的令牌。
You might be familiar with Tiny URL services, this is pretty much the same concept.
我发现用户加密更简单,在这种情况下,服务器同时持有加密和解密密钥,所以我不担心客户端受感染的人会危及安全,但同样,这不是作为安全功能。