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

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

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


当前回答

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

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

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

其他回答

RFC7231:

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

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

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

你也应该意识到,如果你的网站包含链接到其他外部网站,你不控制使用GET将把数据放在外部网站的引用头,当他们按下你的网站上的链接。因此,通过GET方法传输登录数据总是一个大问题。因为这可能会暴露登录凭据,以便通过检查日志或查看谷歌分析(或类似)轻松访问。

我通常的选择方法是:

GET用于稍后将通过URL检索的项 例如,搜索应该是GET,所以你可以做Search .php?s=XXX POST将被发送的项目 与GET相比,这是相对不可见的,并且更难发送,但数据仍然可以通过cURL发送。

POST在安全性方面较差的一个原因是GET在默认情况下被记录,参数和所有数据几乎都被你的web服务器记录。

POST则相反,它几乎没有被记录,导致很难发现攻击者的活动。

我不相信“它太大了”的说法,这不是不记录任何东西的理由,至少1KB,这对人们识别攻击者很有帮助,直到它出现,然后POST做了双重破坏服务,通过启用任何基于HTTP的后门来无声地传递无限数量的数据。

考虑一下这种情况:一个草率的API接受如下GET请求:

http://www.example.com/api?apikey=abcdef123456&action=deleteCategory&id=1

在某些设置中,当您请求此URL时,如果有关于请求的错误/警告,则整行内容将记录在日志文件中。更糟糕的是:如果您忘记禁用生产服务器中的错误消息,则此信息将在浏览器中显示!现在你已经把你的API密钥给了所有人。

不幸的是,有一些真正的API是这样工作的。

我不喜欢在日志中有一些敏感信息或在浏览器中显示它们的想法。POST和GET是不同的。在适当的地方使用它们。