首先,RFC 2616已经过时了.因此,它不应再被用作参考.
您可以在下面找到HTTP/1.1协议的当前参考:
看看RFC 7231关于安全方法的内容:
如果请求方法的定义语义基本上是只读的,则被认为是"安全的" ; 即,由于对目标资源应用安全方法,客户端不请求并且不期望源服务器上的任何状态改变.[...]
安全方法的这种定义并不妨碍实现包含可能有害的行为,不完全是只读的行为,或者在调用安全方法时导致副作用.然而,重要的是客户没有要求其他行为,也不能对其负责.例如,大多数服务器在每个响应完成时附加请求信息以访问日志文件,无论方法如何,即使日志存储可能已满并使服务器崩溃,也会认为这是安全的.[...]
由本说明书所限定的请求方法,所述的
GET,HEAD,OPTIONS,和TRACE的方法被定义为是安全的.[...]
在HTTP方法的上下文中,安全性与安全性无关,并且以类似的方式,安全性与您如何处理敏感数据无关.安全意味着只读.
如上所述,使用安全方法不会阻止您执行非只读操作,例如将请求记录到文件中.但是,此操作对于客户端应该是透明的.
这取决于您正在执行的操作.在REST API中,该POST方法经常用于创建资源,而该GET方法经常用于请求资源的表示.
如果要在通过网络发送敏感数据时确保安全性,请使用HTTPS并且不要在URL中公开敏感数据(如密码).
除了Cássio Mazzochi Molin 的出色回答之外,您还应该使用 HTTPS,但您(通常)应该使用:
检索时使用 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无论何时输出敏感数据,都最好在响应中设置标题。
| 归档时间: |
|
| 查看次数: |
7016 次 |
| 最近记录: |