在请求敏感数据时我应该使用GET还是POST?

JJ *_*kar 4 security rest http

我应该使用GETPOST检索敏感数据,因为:

  • 响应将包含敏感数据.
  • 请求有副作用(例如显式问责日志记录).

RFC 2616,对我来说,不为我澄清这一点:

9.1.1安全方法

当然,不可能确保服务器不会因执行GET请求而产生副作用; 实际上,一些动态资源会考虑这个功能.这里的重要区别是用户没有请求副作用,因此不能对他们负责.[...]

cas*_*lin 8

退一步

首先,RFC 2616已经过时了.因此,它不应再被用作参考.

您可以在下面找到HTTP/1.1协议的当前参考:

安全的财产

看看RFC 7231关于安全方法的内容:

4.2.1.安全方法

如果请求方法的定义语义基本上是只读的,则被认为是"安全的" ; 即,由于对目标资源应用安全方法,客户端不请求并且不期望源服务器上的任何状态改变.[...]

安全方法的这种定义并不妨碍实现包含可能有害的行为,不完全是只读的行为,或者在调用安全方法时导致副作用.然而,重要的是客户没有要求其他行为,也不能对其负责.例如,大多数服务器在每个响应完成时附加请求信息以访问日志文件,无论方法如何,即使日志存储可能已满并使服务器崩溃,也会认为这是安全的.[...]

由本说明书所限定的请求方法,所述的GET,HEAD, OPTIONS,和TRACE的方法被定义为是安全的.[...]

在HTTP方法的上下文中,安全性与安全性无关,并且以类似的方式,安全性与您如何处理敏感数据无关.安全意味着只读.

如上所述,使用安全方法不会阻止您执行非只读操作,例如将请求记录到文件中.但是,此操作对于客户端应该是透明的.

你应该使用哪种方法?

这取决于您正在执行的操作.在REST API中,该POST方法经常用于创建资源,而该GET方法经常用于请求资源的表示.

安全性和敏感数据如何?

如果要在通过网络发送敏感数据时确保安全性,请使用HTTPS并且不要在URL中公开敏感数据(如密码).

  • 要点是“使用 HTTPS 并且不要在 URL 中公开敏感数据(例如密码)”。 (5认同)
  • 这究竟如何回答这个问题?创建资源和请求资源表示都可以返回敏感数据,不是吗? (2认同)

Sil*_*Fox 8

除了Cássio Mazzochi Molin 的出色回答之外,您还应该使用 HTTPS,但您(通常)应该使用:

  • GET 用于检索敏感数据。
  • POST 用于发送敏感数据。

检索时使用 GET 的原因是该操作没有副作用,因此没有理由使用 POST。以前使用 POST 的唯一适用原因是通过 AJAX 检索 JSON 时,因为旧浏览器存在错误,这意味着用户在浏览器中打开的另一个域可以使用<script>标签从 JSON 中窃取数据(JSON 劫持)。禁止 GET 阻止了这种攻击,因为它<script src="...">总是使用 GET 方法。看到这个答案。请注意,此处使用 POST 意味着您应该为此方法禁用 GET 服务器端。

使用 POST 发送敏感数据的原因是它可以防止通过查询字符串泄漏数据(尽管另一种方法是使用带有自定义标头集的 GET,尽管 POST 更有意义)。原因是 URL 中的查询字符串数据由代理服务器记录,默认情况下由服务器日志记录,也可以存储在浏览器历史记录中,因此它不是传输个人或其他敏感细节的好地方。请注意,在通过 HTTPS 传输期间,它们将被加密,只是它们可以从加密状态泄漏到其他未加密或不受控制的位置。当然,回到RFC 7231,如果您要根据此发送的敏感数据进行更改,POST 是更好的主意,因为在大多数情况下它会防止浏览器意外再次发送它。

使用 POST 的另一个原因是现代浏览器在默认情况下似乎不会缓存 POST 请求的结果。然而,这不应该被依赖Cache-control: no-store无论何时输出敏感数据,都最好在响应中设置标题。