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

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

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


当前回答

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

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

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

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

其他回答

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

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

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

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

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

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

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

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

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

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

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

RFC7231:

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

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

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

修改POST请求更加困难(它需要比编辑查询字符串更多的努力)。编辑:换句话说,它只是通过模糊来保证安全,而且几乎不是这样。