REST API GET 敏感数据
REST API GET with sensitive data
我正在设计 api,其方法应该是 幂等,并且不应修改服务器上的任何数据。它应该是处理给定参数的请求和 return 响应的方法。
其中一个参数是敏感数据。它不是使用额外加密的选项。数据已经加密,但安全要求很高,即使是加密数据也要小心对待。
根据 REST 规范,幂等查询方法应作为 GET HTTP 方法实现。这种情况下的问题是不应在 URL 中作为 GET 参数传递的敏感数据。 HTTP 标准中的唯一选项是在 HTTP 请求的主体部分传递敏感数据。
我的问题是什么更好?打破 rest api 设计,将查询请求作为 POST 发送,还是在 URL 中传递加密数据?也许有更好的解决方案我没有看到?
According to REST spec, idempotent query method should be implemented
as a GET HTTP method.
2016
据我有限的英语所知,应该!=必须。在这种情况下,您不会通过发送 POST 来破坏 REST API 设计。如果可能,您可以在 HTTP header 中发送您的敏感数据。还有。如果您想将敏感数据发送到任何地方,您应该使用 HTTPS。
2019
同时查看了HTTP 1.1标准。他们没有明确使用 MUST 或 SHOULD 词in the specs for idempotency, but I got the impression they mean SHOULD. Another HTTP related thing here, that we use GET mostly because we can cache response with it. You don't necessarily want to cache sensitive data, so it might not make sense to insist on using GET on retrieval when security is more important by the parameters. You can find some tips about how to set cache-control headers here,但您也可以阅读 HTTP 标准。
从安全角度来看,我的 non-expert 意见如下:
通常查询参数不是那么敏感,通常它们只是随机的id或关键字。因此,问题可能出在您的设计上,您应该将这些敏感参数(例如社会安全号码)隐藏在随机 ID 后面,而不是显式查询它们。这里的另一个想法是,用户凭据必须在 Authorization header 中,例如,而不是在查询字符串中,所以如果敏感数据是那种,那么你做错了。
据我了解,在 URLs 中发送敏感数据的问题在于,它可能会以未加密的形式出现在浏览器历史记录、缓存、地址栏和服务器日志中。尽管许多人通过 AJAX(或获取 API)直接从浏览器调用 REST web 服务,但这不是它们应该使用的预期方式。 Web 服务主要供服务器端使用,以将您的应用程序扩展到多个线程、核心或服务器。因此,如果您使用没有历史记录或缓存的服务器端 HTTP 客户端以编程方式调用 REST 网络服务,那么您需要做的就是加密您的日志。如果客户端有缓存,那么如果您觉得有必要,您也可以对其进行加密。我认为可以从日志中过滤这些参数并根据 URL 的加盐哈希存储缓存的内容,但我对此没有太多经验。
如果您有第 3 方客户端或浏览器,但您没有那种控件,那么您仍然可以假设它遵循 HTTP 标准。因此,您可以使用 cache-control header 来禁用敏感内容的缓存。地址栏和历史记录对于单页应用程序来说不是问题,除非它们将敏感数据与历史记录 API 一起移动到那里,但无论您做什么,这都可能发生。可以 disable the Referrer header too. Only if you serve HTML with your webservice will you have a problem with browsers, because that assumes that javascript is disabled (so you cannot use location.replace to override browser history 以及敏感的查询字符串)并且浏览器是您的 REST 客户端。我认为这是一种不太可能发生的情况,尽管可以通过 XML+XSL 重用大部分代码或者现在可能使用 nodejs 或某种不同语言的转译器来相对较好地完成它。
所以我认为即使没有 POST 如果你做对了这一切也可以解决。但这只是个人意见,等待安全专家指正...
我正在设计 api,其方法应该是 幂等,并且不应修改服务器上的任何数据。它应该是处理给定参数的请求和 return 响应的方法。
其中一个参数是敏感数据。它不是使用额外加密的选项。数据已经加密,但安全要求很高,即使是加密数据也要小心对待。
根据 REST 规范,幂等查询方法应作为 GET HTTP 方法实现。这种情况下的问题是不应在 URL 中作为 GET 参数传递的敏感数据。 HTTP 标准中的唯一选项是在 HTTP 请求的主体部分传递敏感数据。
我的问题是什么更好?打破 rest api 设计,将查询请求作为 POST 发送,还是在 URL 中传递加密数据?也许有更好的解决方案我没有看到?
According to REST spec, idempotent query method should be implemented as a GET HTTP method.
2016
据我有限的英语所知,应该!=必须。在这种情况下,您不会通过发送 POST 来破坏 REST API 设计。如果可能,您可以在 HTTP header 中发送您的敏感数据。还有。如果您想将敏感数据发送到任何地方,您应该使用 HTTPS。
2019
同时查看了HTTP 1.1标准。他们没有明确使用 MUST 或 SHOULD 词in the specs for idempotency, but I got the impression they mean SHOULD. Another HTTP related thing here, that we use GET mostly because we can cache response with it. You don't necessarily want to cache sensitive data, so it might not make sense to insist on using GET on retrieval when security is more important by the parameters. You can find some tips about how to set cache-control headers here,但您也可以阅读 HTTP 标准。
从安全角度来看,我的 non-expert 意见如下:
通常查询参数不是那么敏感,通常它们只是随机的id或关键字。因此,问题可能出在您的设计上,您应该将这些敏感参数(例如社会安全号码)隐藏在随机 ID 后面,而不是显式查询它们。这里的另一个想法是,用户凭据必须在 Authorization header 中,例如,而不是在查询字符串中,所以如果敏感数据是那种,那么你做错了。
据我了解,在 URLs 中发送敏感数据的问题在于,它可能会以未加密的形式出现在浏览器历史记录、缓存、地址栏和服务器日志中。尽管许多人通过 AJAX(或获取 API)直接从浏览器调用 REST web 服务,但这不是它们应该使用的预期方式。 Web 服务主要供服务器端使用,以将您的应用程序扩展到多个线程、核心或服务器。因此,如果您使用没有历史记录或缓存的服务器端 HTTP 客户端以编程方式调用 REST 网络服务,那么您需要做的就是加密您的日志。如果客户端有缓存,那么如果您觉得有必要,您也可以对其进行加密。我认为可以从日志中过滤这些参数并根据 URL 的加盐哈希存储缓存的内容,但我对此没有太多经验。
如果您有第 3 方客户端或浏览器,但您没有那种控件,那么您仍然可以假设它遵循 HTTP 标准。因此,您可以使用 cache-control header 来禁用敏感内容的缓存。地址栏和历史记录对于单页应用程序来说不是问题,除非它们将敏感数据与历史记录 API 一起移动到那里,但无论您做什么,这都可能发生。可以 disable the Referrer header too. Only if you serve HTML with your webservice will you have a problem with browsers, because that assumes that javascript is disabled (so you cannot use location.replace to override browser history 以及敏感的查询字符串)并且浏览器是您的 REST 客户端。我认为这是一种不太可能发生的情况,尽管可以通过 XML+XSL 重用大部分代码或者现在可能使用 nodejs 或某种不同语言的转译器来相对较好地完成它。
所以我认为即使没有 POST 如果你做对了这一切也可以解决。但这只是个人意见,等待安全专家指正...