使用GET方法和POST方法有什么不同?哪个更安全?它们各自的优点是什么?
(类似问题)
使用GET方法和POST方法有什么不同?哪个更安全?它们各自的优点是什么?
(类似问题)
当前回答
当我从URL检索信息时使用GET,当我向URL发送信息时使用POST。
其他回答
GET和POST是HTTP方法,可以实现类似的目标
GET基本上只是为了获取(检索)数据,GET不应该有一个主体,所以除了cookie,唯一传递信息的地方是URL, URL的长度是有限的,GET比POST更不安全,因为发送的数据是URL的一部分
当发送密码、信用卡或其他敏感信息时,不要使用GET !,数据在URL中对每个人都是可见的,可以缓存数据。 GET是无害的,当我们重新加载或回调按钮,它将被book标记,参数保留在浏览器历史记录中,只允许ASCII字符。
POST可能涉及任何内容,如存储或更新数据,或订购产品,或发送电子邮件。POST方法有一个主体。
POST方法是安全的,用于将敏感和机密信息传递到服务器,它不会在URL中的查询参数中可见,并且参数不会保存在浏览器历史记录中。数据长度没有限制。当我们重新加载时,浏览器应该提醒用户数据即将被重新提交。POST方法不能被收藏
这个W3C文档解释了HTTP GET和POST的使用。
我认为这是一个权威的来源。
摘要如下(文件第1.3节):
如果交互更像是一个问题(例如,它是一个安全的操作,如查询、读取操作或查找),则使用GET。 在以下情况下使用POST: 这种互动更像是一种命令,或者 交互以一种方式更改资源的状态 用户将感知(例如,对服务的订阅),或者 用户应该对交互的结果负责。
在这个问题和其他关于SO的问题中,关于GET和POST的所有或大部分答案都是错误的。他们在技术上是正确的,他们正确地解释了标准,但在实践中是完全不同的。让我解释一下:
GET被认为是幂等的,但它不一定是。您可以将GET中的参数传递给服务器脚本,该脚本对数据进行永久更改。相反,POST被认为不是幂等的,但是您可以POST到一个脚本,而不对服务器进行任何更改。所以这是一个错误的二分法,与实践无关。
此外,说GET在重新加载后不会造成任何损害是错误的——当然,如果它调用的脚本和它传递的参数发生了永久性的更改(例如删除数据),它就会造成损害。POST也可以!
现在,我们知道POST(到目前为止)更安全,因为它没有公开传递的参数,也没有缓存。另外,你可以通过POST传递更多的数据,它也给你一个干净的,不混乱的URL。它做GET能做的所有事情。所以这是更好的选择。至少在生产中是这样。
那么在实践中,什么时候应该使用GET和POST呢?我在开发过程中使用GET,所以我可以看到并调整我传递的参数。我用它来快速尝试不同的值(例如测试条件)甚至不同的参数。如果我需要一组不同的参数,我不需要构建一个表单,也不需要修改它,就可以做到这一点。我只需根据需要在浏览器中编辑URL即可。
一旦开发完成,或者至少稳定下来,我就把所有的东西都切换到POST。
如果你能想到任何技术上的原因,这是不正确的,我很乐意学习。
使用GET有两种常见的“安全”含义。由于数据出现在URL字符串,它可能有人看着你的肩膀在地址栏/URL可能能够看到一些他们不应该知道的东西,如会话cookie,可能会被用来劫持你的会话。记住,每个人都有照相手机。
GET的另一个安全含义与GET变量被记录到大多数web服务器访问日志作为请求URL的一部分有关。根据情况、监管环境和数据的总体敏感性,这可能会引发担忧。
一些客户端/防火墙/IDS系统可能会拒绝包含过多数据的GET请求,因此可能会提供不可靠的结果。
POST支持高级功能,如支持用于文件上传到web服务器的多部分二进制输入。
POST需要一个内容长度的报头,这可能会增加特定于应用程序的客户端实现的复杂性,因为必须提前知道提交的数据的大小,以防止客户端请求以单次传递的增量模式形成。对于那些选择滥用HTTP作为RPC(远程过程调用)传输的人来说,这可能是一个小问题。
其他人已经很好地涵盖了语义差异和这个问题的“何时”部分。
我发现这个列表非常有用
GET
GET请求可以被缓存 GET请求保留在浏览器历史记录中 GET请求可以被收藏 在处理敏感数据时,不应该(几乎)使用GET请求 GET请求有长度限制 GET请求应该只用于检索数据
POST
POST请求不会被缓存 POST请求不会保留在浏览器历史记录中 POST请求不能被收藏 POST请求对数据长度没有限制