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

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

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


当前回答

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

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

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

但是一定要确保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最初的含义。

甚至POST也接受GET请求。假设您有一个表单,其中有user.name和user这样的输入。Passwd,这些应该支持用户名和密码。如果我们简单地添加?user.name="my user&user. name="Passwd =“我的密码”,则请求将通过“绕过登录页面”被接受。

对此的解决方案是在服务器端实现过滤器(java过滤器作为e),并检测到没有字符串查询作为GET参数传递。

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

正如之前一些人所说,HTTPS带来了安全性。

但是,POST比GET更安全,因为GET可以存储在历史记录中。

但更令人遗憾的是,有时POST或GET的选择并不取决于开发人员。例如,一个超链接总是通过GET发送(除非它使用javascript转换成post表单)。

这两种方法都不能神奇地为请求提供安全性,但是GET暗示了一些副作用,这些副作用通常会阻止请求的安全性。

GET url显示在浏览器历史记录和web服务器日志中。因此,永远不要将它们用于登录表单和信用卡号之类的内容。

然而,仅仅发布这些数据也不能保证它的安全。为此,您需要SSL。当通过HTTP使用时,GET和POST都以明文形式通过网络发送数据。

POST数据还有其他很好的理由——比如可以提交无限量的数据,或者对普通用户隐藏参数。

缺点是用户不能收藏通过POST发送的查询结果。为此,您需要GET。