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

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

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


当前回答

我通常的选择方法是:

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

其他回答

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

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

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

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

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

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

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

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

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

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

免责声明:以下几点仅适用于API调用,不适用于网站url。

网络安全:必须使用HTTPS。在这种情况下,GET和POST同样安全。

浏览器历史记录:对于前端应用程序,如Angular JS, React JS等,API调用是前端进行的AJAX调用。这些不会成为浏览器历史的一部分。因此,POST和GET是同样安全的。

服务器端日志:通过使用写入数据屏蔽和访问日志格式,可以隐藏所有或仅从request-URL中隐藏敏感数据。

浏览器控制台中的数据可见性:对于怀有恶意的人来说,查看POST数据和查看GET数据几乎是一样的。

因此,通过正确的日志记录实践,GET API与POST API一样安全。在所有地方都使用POST,会强制执行糟糕的API定义,应该避免。

这是一篇旧文章,但我想反对其中的一些答案。如果要传输敏感数据,则需要使用SSL。如果您使用带有GET参数的SSL(例如?userid=123),该数据将以纯文本形式发送!如果使用POST发送,则将值放在消息的加密正文中,因此大多数MITM攻击都无法读取。

最大的区别在于数据传递的位置。如果数据放在URL中,就不能加密,否则就无法路由到服务器,因为只有你可以读取URL。这就是GET的工作方式。

简而言之,您可以在POST中通过SSL安全地传输数据,但您不能使用GET,无论是否使用SSL。