当比较HTTP GET和HTTP POST时,从安全角度看有什么不同?其中一个选择是否天生就比另一个更安全?如果有,为什么?

我意识到POST没有公开URL上的信息,但其中有任何真正的价值吗?或者它只是通过隐匿性来实现安全?当安全性是一个问题时,我是否有理由更喜欢POST ?

编辑: 通过HTTPS, POST数据被编码,但url会被第三方嗅探吗?此外,我正在处理JSP;当使用JSP或类似的框架时,是否可以公平地说,最佳实践是避免将敏感数据完全放在POST或GET中,而是使用服务器端代码来处理敏感信息?


当前回答

最近发布了一种攻击,它允许中间人泄露压缩HTTPS请求的请求体。由于请求头和URL没有被HTTP压缩,GET请求可以更好地防止这种特定的攻击。

在某些模式下,GET请求也容易受到攻击,SPDY压缩请求头,TLS也提供可选的(很少使用)压缩。在这些情况下,攻击更容易预防(浏览器供应商已经提供了修复程序)。HTTP级别的压缩是一个更基本的特性,供应商不太可能禁用它。

这只是一个示例,展示了GET比POST更安全的场景,但从这种攻击原因来看,我不认为选择GET而不是POST是一个好主意。这种攻击相当复杂,需要非常重要的先决条件(攻击者需要能够控制部分请求内容)。在攻击可能有害的情况下,最好禁用HTTP压缩。

其他回答

Neither one of GET and POST is inherently "more secure" than the other, just like neither one of fax and phone is "more secure" than the other. The various HTTP methods are provided so that you can choose the one which is most appropiate for the problem you're trying to solve. GET is more appropiate for idempotent queries while POST is more appropiate for "action" queries, but you can shoot yourself in the foot just as easily with any of them if you don't understand the security architecture for the application you're maintaining.

最好是阅读第9章:HTTP/1.1 RFC的方法定义,以全面了解get和POST最初的含义。

没有额外的安全性。

Post数据不会显示在历史和/或日志文件中,但如果数据应该保持安全,则需要SSL。 否则,任何嗅探线路的人都可以读取数据。

这与安全无关,但是……浏览器不缓存POST请求。

GET和POST之间的区别不应该从安全性的角度来看待,而应该从它们对服务器的意图来看待。GET永远不应该改变服务器上的数据——至少除了日志之外——但是POST可以创建新的资源。

好的代理不会缓存POST数据,但它们可能缓存来自URL的GET数据,因此可以说POST应该更安全。但是POST数据仍然可以用于那些性能不佳的代理。

正如在许多答案中提到的,唯一确定的赌注是通过SSL。

但是一定要确保GET方法不会提交任何更改,比如删除数据库行等等。

安全的概念是没有意义的,除非你定义了你想要防范的是什么。

如果您希望对存储的浏览器历史记录、某些类型的日志记录以及查看您的url的人保持安全,那么POST更安全。

如果您希望安全防范某人嗅探您的网络活动,那么没有什么区别。