使用GET方法和POST方法有什么不同?哪个更安全?它们各自的优点是什么?

(类似问题)


当前回答

在这个问题和其他关于SO的问题中,关于GET和POST的所有或大部分答案都是错误的。他们在技术上是正确的,他们正确地解释了标准,但在实践中是完全不同的。让我解释一下:

GET被认为是幂等的,但它不一定是。您可以将GET中的参数传递给服务器脚本,该脚本对数据进行永久更改。相反,POST被认为不是幂等的,但是您可以POST到一个脚本,而不对服务器进行任何更改。所以这是一个错误的二分法,与实践无关。

此外,说GET在重新加载后不会造成任何损害是错误的——当然,如果它调用的脚本和它传递的参数发生了永久性的更改(例如删除数据),它就会造成损害。POST也可以!

现在,我们知道POST(到目前为止)更安全,因为它没有公开传递的参数,也没有缓存。另外,你可以通过POST传递更多的数据,它也给你一个干净的,不混乱的URL。它做GET能做的所有事情。所以这是更好的选择。至少在生产中是这样。

那么在实践中,什么时候应该使用GET和POST呢?我在开发过程中使用GET,所以我可以看到并调整我传递的参数。我用它来快速尝试不同的值(例如测试条件)甚至不同的参数。如果我需要一组不同的参数,我不需要构建一个表单,也不需要修改它,就可以做到这一点。我只需根据需要在浏览器中编辑URL即可。

一旦开发完成,或者至少稳定下来,我就把所有的东西都切换到POST。

如果你能想到任何技术上的原因,这是不正确的,我很乐意学习。

其他回答

GET方法用于发送不太敏感的数据,POST方法用于发送敏感数据。 与GET方法相比,使用POST方法可以发送大量数据。 GET方法发送的数据在浏览器头栏中是可见的,而POST方法发送的数据是不可见的。

这不是安全问题。HTTP协议将get类型的请求定义为幂等请求,而post可能有副作用。简单地说,这意味着GET用于查看某些内容而不更改它,而POST用于更改某些内容。例如,搜索页面应该使用GET,而更改密码的表单应该使用POST。

另外,请注意PHP混淆了一些概念。POST请求从查询字符串和请求体中获取输入。GET请求只是从查询字符串中获取输入。所以POST请求是GET请求的超集;你可以在POST请求中使用$_GET,甚至在$_POST和$_GET中使用相同名称的参数表示不同的含义也是有意义的。

例如,假设您有一个编辑文章的表单。article-id可能在查询字符串中(因此可以通过$_GET['id']获得),但是假设您想要更改article-id。新的id可能会出现在请求体($_POST['id'])中。好吧,也许这不是最好的例子,但我希望它能说明两者之间的区别。

在这个问题和其他关于SO的问题中,关于GET和POST的所有或大部分答案都是错误的。他们在技术上是正确的,他们正确地解释了标准,但在实践中是完全不同的。让我解释一下:

GET被认为是幂等的,但它不一定是。您可以将GET中的参数传递给服务器脚本,该脚本对数据进行永久更改。相反,POST被认为不是幂等的,但是您可以POST到一个脚本,而不对服务器进行任何更改。所以这是一个错误的二分法,与实践无关。

此外,说GET在重新加载后不会造成任何损害是错误的——当然,如果它调用的脚本和它传递的参数发生了永久性的更改(例如删除数据),它就会造成损害。POST也可以!

现在,我们知道POST(到目前为止)更安全,因为它没有公开传递的参数,也没有缓存。另外,你可以通过POST传递更多的数据,它也给你一个干净的,不混乱的URL。它做GET能做的所有事情。所以这是更好的选择。至少在生产中是这样。

那么在实践中,什么时候应该使用GET和POST呢?我在开发过程中使用GET,所以我可以看到并调整我传递的参数。我用它来快速尝试不同的值(例如测试条件)甚至不同的参数。如果我需要一组不同的参数,我不需要构建一个表单,也不需要修改它,就可以做到这一点。我只需根据需要在浏览器中编辑URL即可。

一旦开发完成,或者至少稳定下来,我就把所有的东西都切换到POST。

如果你能想到任何技术上的原因,这是不正确的,我很乐意学习。

我发现这个列表非常有用

GET

GET请求可以被缓存 GET请求保留在浏览器历史记录中 GET请求可以被收藏 在处理敏感数据时,不应该(几乎)使用GET请求 GET请求有长度限制 GET请求应该只用于检索数据

POST

POST请求不会被缓存 POST请求不会保留在浏览器历史记录中 POST请求不能被收藏 POST请求对数据长度没有限制

当我从URL检索信息时使用GET,当我向URL发送信息时使用POST。