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

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

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


当前回答

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最初的含义。

其他回答

免责声明:以下几点仅适用于API调用,不适用于网站url。

网络安全:必须使用HTTPS。在这种情况下,GET和POST同样安全。

浏览器历史记录:对于前端应用程序,如Angular JS, React JS等,API调用是前端进行的AJAX调用。这些不会成为浏览器历史的一部分。因此,POST和GET是同样安全的。

服务器端日志:通过使用写入数据屏蔽和访问日志格式,可以隐藏所有或仅从request-URL中隐藏敏感数据。

浏览器控制台中的数据可见性:对于怀有恶意的人来说,查看POST数据和查看GET数据几乎是一样的。

因此,通过正确的日志记录实践,GET API与POST API一样安全。在所有地方都使用POST,会强制执行糟糕的API定义,应该避免。

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

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

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

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

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

许多人采用一种约定(Ross提到过),即GET请求只检索数据,不修改服务器上的任何数据,而POST请求用于所有数据修改。虽然其中一种并不比另一种更安全,但如果你遵循这个约定,你可以应用横切安全逻辑(例如,只有拥有帐户的人才可以修改数据,因此未经身份验证的post将被拒绝)。

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

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

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