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

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

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


当前回答

除非使用https,否则不存在安全性—使用https, GET和POST之间的传输安全性是相同的。

但是一个重要的方面是客户机和服务器在记住请求时的区别。在考虑使用GET或POST进行登录时,要记住这一点非常重要。

使用POST,密码由服务器应用程序处理,然后丢弃,因为一个好的设计不会在数据库中存储密码——只存储加密安全的散列。

但是使用GET,服务器日志最终将包含包含查询参数的请求。因此,无论数据库中的密码哈希值有多好,服务器日志仍然会以明文形式包含密码。除非对文件系统进行加密,否则即使在删除日志文件之后,服务器磁盘仍将包含这些密码。

使用访问令牌作为查询参数时也会出现同样的问题。这也是为什么考虑在HTTP报头数据中提供任何访问令牌是有意义的原因——比如在授权报头中使用承载令牌。

服务器日志通常是web服务中最薄弱的部分,允许攻击者从泄露的信息中提升他们的访问权限。

其他回答

我通常的选择方法是:

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

你也应该意识到,如果你的网站包含链接到其他外部网站,你不控制使用GET将把数据放在外部网站的引用头,当他们按下你的网站上的链接。因此,通过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最初的含义。

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

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

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

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

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

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

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