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

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

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


当前回答

就安全性而言,它们本质上是相同的。虽然POST确实不通过URL公开信息,但它在客户机和服务器之间的实际网络通信中公开的信息与GET一样多。如果需要传递敏感信息,那么第一道防线就是使用Secure HTTP传递。

GET或查询字符串帖子对于标记特定项目或协助搜索引擎优化和索引项目所需的信息非常有用。

POST适用于用于提交一次性数据的标准表单。我不会使用GET来发布实际的表单,除非在搜索表单中,您希望允许用户将查询保存在书签中,或者类似的东西。

其他回答

没有额外的安全性。

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

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

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

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

RFC7231:

uri的目的是共享的,而不是安全的,即使它们被识别 获取资源。uri通常显示在添加到的显示器上 模板当一个页面被打印出来,并存储在各种 未受保护的书签列表。因此,包括 URI中的敏感信息、个人身份信息、 或者是要暴露的风险。

服务的作者应该避免在提交时使用基于get的表单 敏感数据,因为这些数据将放在 请求目标。许多现有的服务器、代理和用户代理都有日志记录 或者将请求目标显示在可以看到它的地方 第三方。这样的服务应该使用基于post的表单提交 相反。”

这个RFC明确指出不应该使用GET提交敏感数据。由于这句话,一些实现者可能不会同样小心地处理从GET请求的查询部分获得的数据。我自己也在研究一个保证数据完整性的协议。根据这个规范,我不应该保证GET数据的完整性(我将这样做,因为没有人遵守这些规范)

就安全性而言,它们本质上是相同的。虽然POST确实不通过URL公开信息,但它在客户机和服务器之间的实际网络通信中公开的信息与GET一样多。如果需要传递敏感信息,那么第一道防线就是使用Secure HTTP传递。

GET或查询字符串帖子对于标记特定项目或协助搜索引擎优化和索引项目所需的信息非常有用。

POST适用于用于提交一次性数据的标准表单。我不会使用GET来发布实际的表单,除非在搜索表单中,您希望允许用户将查询保存在书签中,或者类似的东西。

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

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

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