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

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

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


当前回答

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

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

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

其他回答

即使POST与GET相比没有提供真正的安全优势,对于登录表单或任何其他具有相对敏感信息的表单,请确保您使用POST作为:

post的信息不会保存在用户的历史记录中。 表单中发送的敏感信息(密码等)以后将不会在URL栏中可见(通过使用GET,它将在历史记录和URL栏中可见)。

此外,GET有理论上的数据限制。不。

对于真正敏感的信息,请确保使用SSL (HTTPS)

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

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

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

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

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

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

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

我不打算重复所有其他的答案,但有一个方面我还没有看到提到——那就是数据消失的故事。我不知道去哪里找,但是…

基本上,它是关于一个网络应用程序,每隔几晚就会神秘地丢失所有数据,而且没有人知道原因。检查日志后发现,该网站是由谷歌或其他任意蜘蛛找到的,它很高兴地GET(读:GET)它在网站上找到的所有链接——包括“删除此条目”和“你确定吗?”链接。

事实上,部分已经提到了。这就是“不要在GET上而只在POST上更改数据”背后的故事。爬虫会很高兴地遵循GET,而不是POST。即使robots.txt也不能帮助对抗行为不当的爬虫。

区别在于GET发送数据是开放的,而POST是隐藏的(在http-header中)。

所以get更适合于不安全的数据,比如谷歌中的查询字符串。Auth-data永远不会通过GET发送,所以在这里使用POST。当然,整个主题有点复杂。如果你想阅读更多,请阅读这篇文章(德语)。