269

使用GETPOST方法有什么区别?哪个更安全?他们每个人的(缺点)优点是什么?

类似问题

4

14 回答 14

283

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

另外,请注意 PHP 有点混淆了这些概念。POST 请求从查询字符串和请求正文中获取输入。GET 请求只是从查询字符串中获取输入。所以 POST 请求是 GET 请求的超集;您可以$_GET在 POST 请求中使用,并且在其中包含具有相同名称的参数甚至可能是有意义的$_POST$_GET这意味着不同的东西。

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

于 2009-02-02T21:23:11.613 回答
85

当用户在表单中输入信息并单击提交时,可以通过两种方式将信息从浏览器发送到服务器:在 URL 中,或在 HTTP 请求的正文中。

前面示例中使用的 GET 方法将名称/值对附加到 URL。不幸的是,URL 的长度是有限的,所以这种方法只有在只有几个参数的情况下才有效。如果表单使用大量参数,或者如果参数包含大量数据,则 URL 可能会被截断。此外,在 URL 上传递的参数在浏览器的地址字段中可见,而不是显示密码的最佳位置。

GET 方法的替代方法是 POST 方法。此方法将名称/值对打包在 HTTP 请求的正文中,这使得 URL 更清晰,并且对表单输出没有大小限制。它也更安全。

于 2009-02-02T21:17:59.987 回答
38

最好的答案是第一个。

您正在使用:

  • 获取数据时要获取数据(GET DATA)
  • POST当你想发送数据时(POST DATA)。
于 2011-04-04T06:10:51.743 回答
27

使用GET. 由于数据出现在 URL 字符串中,因此可能有人在地址栏/URL 上查看您的肩膀可能能够查看他们不应该知道的内容,例如可能被用来劫持您的会话的会话 cookie。请记住,每个人都有照相手机。

另一个安全隐患GETGET作为请求 URL 的一部分记录到大多数 Web 服务器访问日志的变量有关。根据情况、监管环境和数据的一般敏感性,这可能会引起关注。

一些客户端/防火墙/IDS 系统可能会对GET包含过多数据的请求不满意,因此可能会提供不可靠的结果。

POST支持高级功能,例如支持用于将文件上传到 Web 服务器的多部分二进制输入。

POST需要一个 content-length 标头,这可能会增加特定于应用程序的客户端实现的复杂性,因为必须提前知道提交的数据大小,从而防止客户端请求以独占的单通道增量模式形成。对于那些选择滥用HTTP它作为 RPC(远程过程调用)传输的人来说,这可能是一个小问题。

其他人已经很好地涵盖了这个问题的语义差异和“何时”部分。

于 2009-02-02T22:19:44.103 回答
20

如果有大量数据或某种敏感信息(真正敏感的东西也需要安全连接),您应该使用 POST。

如果您希望人们能够为您的页面添加书签,请使用 GET,因为所有数据都包含在书签中。

请注意人们使用 GET 方法点击 REFRESH,因为每次都会再次发送数据而不会警告用户(POST 有时会警告用户重新发送数据)。

于 2009-02-02T21:23:28.913 回答
18

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

于 2009-02-02T21:23:11.597 回答
17

这个W3C 文档解释了 HTTP GET 和 POST 的使用。

我认为这是一个权威来源。

摘要是(文件的第 1.3 节):

  • 如果交互更像是一个问题(即,它是一个安全操作,例如查询、读取操作或查找),则使用GET 。
  • 在以下情况下使用POST
    • 交互更像是一个命令,或者
    • 交互以用户感知的方式更改资源的状态(例如,订阅服务),或
    • 用户应对交互结果负责。
于 2014-04-02T15:51:22.037 回答
11

Get 和 Post 方法与您使用的服务器技术无关,它在 php、asp.net 或 ruby​​ 中的工作方式相同。GET 和 POST 是 HTTP 协议的一部分。正如标记所指出的,POST 更安全。POST 表单也不会被浏览器缓存。POST 也用于传输大量数据。

于 2009-02-02T21:21:21.163 回答
10

更改数据时使用 POST 的原因:

  • 像 Google Web Accelerator 这样的网络加速器将点击页面上的所有 (GET) 链接并缓存它们。如果链接对事物进行更改,这将非常糟糕。
  • 浏览器缓存 GET 请求,因此即使用户单击链接,它也可能不会向服务器发送请求以执行更改。
  • 为了保护您的站点/应用程序免受 CSRF 攻击,您必须使用 POST。为了完全保护您的应用程序,您还必须在服务器上生成一个唯一标识符并将其发送到请求中。

此外,不要将敏感信息放在查询字符串中(只有 GET 选项),因为它会显示在地址栏、书签和服务器日志中。

希望这可以解释为什么人们说 POST 是“安全的”。如果您要传输敏感数据,则必须使用 SSL。

于 2009-02-03T18:47:17.510 回答
9

GET并且POST可以实现类似目标的 HTTP 方法

GET基本上是为了获取(检索)数据,AGET不应该有正文,所以除了 cookie 之外,传递信息的唯一地方是 URL 并且 URL 的长度有限,与发送的数据是一部分GET相比不太安全POST网址

GET发送密码、信用卡或其他敏感信息时 切勿使用!,URL中的每个人都可以看到数据,可以缓存数据。GET当我们重新加载或回调按钮时是无害的,它将被标记,参数保留在浏览器历史中,只允许ASCII字符。

POST可能涉及任何事情,例如存储或更新数据、订购产品或发送电子邮件。POST方法有一个主体。

POST方法是安全的,可以将敏感和机密信息传递给服务器,它不会在 URL 的查询参数中可见,并且参数不会保存在浏览器历史记录中。数据长度没有限制。当我们重新加载时,浏览器应该提醒用户数据即将被重新提交。POST方法无法添加书签

于 2014-06-26T12:07:51.480 回答
5

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

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

此外,说GET如果重新加载不会损害任何东西是错误的——当然,如果它调用的脚本和它传递的参数正在进行永久性更改(例如删除数据),它当然可以。也可以POST

现在,我们知道这POST(到目前为止)更安全,因为它不会暴露正在传递的参数,也不会被缓存。另外,您可以传递更多数据,并GET获得一个干净、不混淆的 URL。它做了所有GET可以做的事情。所以它只是更好。至少在生产中。

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

一旦开发完成,或者至少稳定,我将所有内容切换到POST.

如果您能想到任何技术上的原因表明这是不正确的,我将非常乐意学习。

于 2020-07-30T09:47:02.817 回答
4
  1. GET 方法用于发送不太敏感的数据,而 POST 方法用于发送敏感数据。
  2. 与 GET 方法相比,使用 POST 方法可以发送大量数据。
  3. GET 方法发送的数据在浏览器标题栏中可见,而 POST 方法发送的数据不可见。
于 2009-03-05T10:06:49.087 回答
1

如果要从 URL 检索资源,请使用 GET 方法。如果您点击浏览器的后退按钮,您总是可以看到最后一页,并且它可能被加入书签,因此它不如 POST 方法安全。

如果您想向 URL “提交”某些内容,请使用 POST 方法。例如你想创建一个谷歌账户,你可能需要填写所有详细信息,然后你点击“提交”按钮(这里调用POST方法),一旦你提交成功,然后尝试点击浏览器的返回按钮,您将收到错误或新的空白表格,而不是填写表格的最后一页。

于 2016-03-06T18:33:07.913 回答
-10

GET方法:

  • 它仅用于发送 256 个字符的日期

  • 使用此方法时,可以在浏览器上看到信息

  • 这是表单使用的默认方法

  • 它没有那么安全。


POST方法:

  • 它用于发送无限数据。

  • 使用这种方法,在浏览器上看不到信息

  • 您可以明确提及该POST方法

  • 它比GET方法更安全

  • 它提供了更高级的功能

于 2012-09-30T05:45:26.053 回答