Rest 请求敏感数据时是否应使用GET或POST?

Rest 请求敏感数据时是否应使用GET或POST?,rest,security,http,Rest,Security,Http,我应该使用GET还是POST来检索敏感数据,因为: 响应将包含敏感数据 请求有一些副作用(例如明确的责任记录) 对我来说,这并没有为我澄清这一点: 当然,无法确保服务器不会因执行GET请求而产生副作用;事实上,一些动态资源认为这是一个特性。这里重要的区别是用户没有要求副作用,因此不能对其负责。[……] 我建议使用POST,而不是任何真正的技术原因,比如副作用,而是因为服务器通常被配置为更多地监视POST调用,并且许多现成的安全模块将POST视为动作发生的地方。 这不是一个很好的技术原因,但

我应该使用
GET
还是
POST
来检索敏感数据,因为:

  • 响应将包含敏感数据
  • 请求有一些副作用(例如明确的责任记录)
对我来说,这并没有为我澄清这一点:

当然,无法确保服务器不会因执行
GET
请求而产生副作用;事实上,一些动态资源认为这是一个特性。这里重要的区别是用户没有要求副作用,因此不能对其负责。[……]


我建议使用POST,而不是任何真正的技术原因,比如副作用,而是因为服务器通常被配置为更多地监视POST调用,并且许多现成的安全模块将POST视为动作发生的地方。


这不是一个很好的技术原因,但我很想看看其他人的想法。

您应该使用GET从服务器检索信息

审计和日志记录不会被视为副作用,因为它们对客户端是透明的


可以使用SSL和“缓存控制:无存储”来保护响应数据。一旦敏感数据到达客户机,就没有办法阻止他们对其做任何他们想做的事情。

使用POST只能作为设计用于防止用户拒绝接收响应的应用程序的一部分。我不知道有这样的计划,我也不想冒险想出一个

用户请求的目的不是创建审核日志条目;目的是得到回应。问责日志是一个副作用,但它对用户是隐藏的,因此不需要发布

换句话说,你不能让用户对获取数据负责,因为你不能证明他们收到了数据。但是知道是谁要求这些数据可能有助于调查,因此将其作为副作用记录下来仍然是有用的。

首先,这是过时的。因此,它不应该再被用作参考

下面是HTTP/1.1协议的当前参考:

  • :消息语法和路由
  • :语义和内容
  • :有条件的请求
  • :范围请求
  • :缓存
  • :身份验证
安全财产 看一看关于安全方法的说明:

如果请求方法的定义语义为 基本上是只读的;i、 例如,客户机没有请求,而是 不期望源服务器上的任何状态因以下原因发生更改: 将安全方法应用于目标资源。[……]

安全方法的定义不会阻止实现 包括潜在有害的行为,而不是 完全只读,或在调用保险柜时产生副作用 方法然而,重要的是客户没有 要求对其他行为负责,并且不能追究其责任 它。例如,大多数服务器都会附加请求信息以进行访问 在每个响应完成时记录文件,无论 方法,这被认为是安全的,即使日志存储可能 变满并使服务器崩溃。[……]

在本规范定义的请求方法中,
GET
HEAD
选项
跟踪
方法被定义为安全的。[……]

在HTTP方法的上下文中,safe与安全性无关,类似地,safe与如何处理敏感数据无关安全表示只读

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

你应该用哪种方法? 这取决于您正在执行的操作。在RESTAPI中,
POST
方法经常用于创建资源,而
GET
方法经常用于请求资源的表示

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

此外,您应该使用HTTPS,但(通常)应该使用:

  • 获取用于检索敏感数据的
  • 发送敏感数据的帖子
检索时使用GET的原因是该操作没有副作用,因此没有理由使用POST。使用POST之前唯一适用的原因是通过AJAX检索JSON时,因为旧浏览器存在bug,这意味着用户在浏览器中打开的另一个域可以使用
标记从JSON中窃取数据(JSON劫持)。不允许GET阻止了此攻击,因为
始终使用GET方法。看见请注意,在此处使用POST意味着您应该为此方法禁用GET服务器端

使用POST发送敏感数据的原因是,它可以防止通过查询字符串泄漏数据(尽管另一种方法是使用GET并设置自定义头,尽管POST更有意义)。原因是URL中的查询字符串数据由代理服务器记录,默认情况下由服务器日志记录,也可以存储在浏览器历史记录中,这使得它不是传输个人或其他敏感细节的好地方。请注意,在通过HTTPS传输的过程中,它们将被加密,只是它们可能会从加密状态泄漏到其他未加密或未控制的位置。当然,回到过去,如果你是基于