【问题标题】:When should I use GET or POST method? What's the difference between them?什么时候应该使用 GET 或 POST 方法?它们之间有什么区别?
【发布时间】:2022-12-20 15:10:51
【问题描述】:

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

(similar question)

【问题讨论】:

  • Get 没有主体,因此在实践中意味着您仅限于名称 -> 值对作为数据结构,因为缺少更复杂结构的任何查询字符串编码格式。如果您需要在请求中处理更复杂的数据结构(即数组、对象等),则需要使用 POST 和更高级的格式(json/xml)。简而言之:不要使用 GET 除非你真的必须这样做(即 URL/资源必须是可发现的)。

标签: forms http post get http-method


【解决方案1】:

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

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

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

【讨论】:

  • GET 和 POST 之间的区别肯定是安全方面的。例如,恶意站点可以在图像标签中粘贴任意 GET 请求,导致用户对另一台服务器执行 GET 请求。如果这个 GET 类似于 otherserver/deletemyaccount,那么坏事就会发生。
  • 我的意思是 $_POST 的内容并没有对恶意用户神奇地隐藏起来。所有事物编程显然都存在安全方面的问题。
  • 这篇文章没有完全回答这个问题,因为他没有提到安全隐患。只要把拼写错误“pain English”改成“plain English”,上面的部分就很好了。底部太难理解了。总的来说,比我的帖子好多了。 :-)
  • “ POST 请求从查询字符串和请求正文中获取输入。”恕我直言,这是不正确的。要使用任一输入,您需要使用 $_REQUEST。 $_POST 不获取 url 条目。
  • @Frank Schwieterman 我知道这篇文章很旧,但是删除我的帐户不是幂等的,不应该使用 get。
【解决方案2】:

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

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

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

【讨论】:

  • 因为它更难改变?您可以在地址栏中更改 GET,但使用 POST 就没那么容易了。
  • 服务器不能信任客户端。围绕错误假设设计您的应用程序远非安全。
  • openid也不存,因为可以破解?
  • 我相信这是最清楚的解释——发送数据的位置不同。谢谢你。
  • 客户端也可以用curl或者ajax来get请求,想写什么就写什么。
【解决方案3】:

最好的答案是第一个。

您正在使用:

  • 得到当你想检索数据(GET DATA)。
  • 邮政当你想发送数据(POST DATA)。

【讨论】:

  • 使用的是什么请求/响应服务模式,你想同时使用这两种模式? ;) 在大多数情况下,当我需要回复时,我更愿意使用 POST。
  • 一般来说是这样。 GET 也完全能够“发送”数据,所以不是一个非常准确的答案。
【解决方案4】:

使用GET 有两种常见的“安全”含义。由于数据出现在 URL 字符串中,因此可能有人偷看​​您的地址栏/URL 可能会看到他们不应该知道的内容,例如可能被用来劫持您的会话的会话 cookie。记住每个人有照相手机。

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

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

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

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

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

【讨论】:

    【解决方案5】:

    我在检索信息时使用 GET发送信息时的 URL 和 POST一个网址。

    【讨论】:

    • 但您也可以使用 GET 发送。不同之处在于格式(在 url (GET) 中或在请求 (POST) 中)。
    • 如果端点接受文件并从文件返回一行(不涉及数据创建或更改或数据库),那么端点应该是 GET 还是 POST?
    【解决方案6】:

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

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

    只是要小心人们使用 GET 方法点击 REFRESH,因为每次都会在不警告用户的情况下再次发送数据(POST 有时会警告用户重新发送数据)。

    【讨论】:

    • 如果端点接受文件并从文件返回一行(不涉及数据创建或更改或数据库),那么端点应该是 GET 还是 POST?
    • @变量发布。在这种情况下,主要是因为 POST 是为处理文件上传而构建的,而标准 GET 不是。您必须在每次加载页面时发送文件,因此只使用标准 POST 而不是 GET+file 是有意义的,这会打破 GET 的期望,即 URL 每次应该给出或多或少相同的结果。
    【解决方案7】:

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

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

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

    • 使用得到如果交互更像是一个问题(即,它是一个安全的操作,例如查询、读取操作或查找)。
    • 使用邮政如果:
      • 交互更像是一个命令,或者
      • 交互以一种方式改变资源的状态 用户会感知(例如,订阅服务),或
      • 用户对交互结果负责。

    【讨论】:

    • 我认为可以进一步概括为:服务器状态未更改时获取,更改时发送。
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

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

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

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

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

      【讨论】:

        【解决方案10】:

        GETPOST 是 HTTP 方法,它能够达到相似的目标

        GET 基本上只是为了获取(检索)数据,GET 不应该有主体,所以除了 cookie 之外,唯一传递信息的地方是在 URL 中,并且 URL 的长度有限,GET 更少与 POST 相比安全,因为发送的数据是 URL 的一部分

        发送密码、信用卡或其他敏感信息时切勿使用GET!,数据在 URL 中对所有人可见,可以缓存数据。 GET在我们重载或回调按钮时是无害的,它会被书签,参数保留在浏览器历史记录中,只允许ASCII字符。

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

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

        【讨论】:

        • “ GET 不应该有身体” - 你是什么意思?
        【解决方案11】:

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

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

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

        现在,我们知道POST(到目前为止)更安全,因为它不会公开传递的参数,也不会被缓存。另外,您可以使用POST 传递更多数据,它还为您提供了一个干净、无混淆的 URL。它可以完成GET 可以做的所有事情。所以它只是更好。至少在生产中。

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

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

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

        【讨论】:

          【解决方案12】:
          1. GET 方法用于发送不太敏感的数据,而 POST 方法用于发送敏感数据。
          2. 与 GET 方法相比,使用 POST 方法可以发送大量数据。
          3. 通过 GET 方法发送的数据在浏览器标题栏中可见,而通过 POST 方法发送的数据不可见。

          【讨论】:

            【解决方案13】:

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

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

            【讨论】:

              【解决方案14】:

              我发现这个列表很有帮助

              得到

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

              邮政

              • POST 请求未缓存
              • POST 请求不会保留在浏览器历史记录中
              • 无法为 POST 请求添加书签
              • POST请求对数据长度没有限制

              【讨论】:

                【解决方案15】:

                GET方法:

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

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

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

                • 它不是那么安全。


                POST 方法:

                • 它用于发送无限数据。

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

                • 您可以明确提及 POST 方法

                • 它比GET方法更安全

                • 它提供了更多高级功能

                【讨论】:

                • “它仅用于发送 256 个字符的日期”——不正确。 “当使用这种方法时,信息可以在浏览器上看到”——发布数据在浏览器中也是可见的,只是不太明显。 “它提供了更高级的功能”——比如?
                • 这不是一个非常有用的答案。不正确的信息,例如“它不是那么安全”和“提供更高级的功能”,以及 Quentin 提到的其他内容。
                猜你喜欢
                • 2010-10-05
                • 1970-01-01
                • 1970-01-01
                • 2021-08-10
                • 2010-09-29
                • 2013-04-17
                • 2016-11-21
                • 2010-09-05
                • 1970-01-01
                相关资源
                最近更新 更多