【问题标题】:So why should we use POST instead of GET for posting data? [duplicate]那么我们为什么要使用 POST 而不是 GET 来发布数据呢? [复制]
【发布时间】:2010-11-18 06:08:01
【问题描述】:

可能的重复:
How should I choose between GET and POST methods in HTML forms?
When do you use POST and when do you use GET?

显然,您应该这样做。但是除了为了满足HTTP协议,还有什么理由这样做呢?减少开销?某种安全问题?

【问题讨论】:

  • 有人可以链接到声称的副本吗?

标签: http post


【解决方案1】:

因为 GET 不能根据定义改变服务器的状态。

RFC2616 9.1.1 Safe Methods:

9.1.1 安全方法

实施者应该意识到 软件代表用户在他们的 互联网上的互动,以及 应小心让用户 注意他们可能采取的任何行动 采取可能有意想不到的 对自己或他人的意义。

特别是,该公约已 确定 GET 和 HEAD 方法不应该有 采取其他行动的意义 比检索。这些方法应该 被认为是“安全的”。这允许用户 代表其他方法的代理, 例如 POST、PUT 和 DELETE,在一个 特殊的方式,使用户成为 意识到一个可能的事实 正在请求不安全的操作。

如果您使用 GET 来更改服务器的状态,那么搜索引擎机器人或网络浏览器中的某些链接预取扩展程序可能会对您的网站和(例如)delete all user data just by following links to your site 造成严重破坏。

【讨论】:

  • 幂等是你要找的词-en.wikipedia.org/wiki/Idempotence
  • 不是,不是。幂等意味着重复相同的请求不会改变结果。 PUT 和 DELETE 也应该是幂等的(但不安全)
【解决方案2】:

W3C 有一篇关于此的好论文:URIs, Addressability, and the use of HTTP GET and POST

1.3 选择 HTTP GET 或 POST 的快速清单

  • 在以下情况下使用 GET:
    • 交互更像是一个问题(即,它是一种安全操作,例如查询、读取操作或查找)。
  • 在以下情况下使用 POST:
    • 交互更像是一个订单,或者
    • 交互以用户感知的方式更改资源的状态(例如,订阅服务),或
    • 用户应对交互结果负责

【讨论】:

    【解决方案3】:

    因为,如果你使用 GET 来改变状态,Google can delete your stuff

    【讨论】:

      【解决方案4】:
      【解决方案5】:

      如果您接受 GET 来执行写入操作,那么恶意黑客可能会在某处注入链接以执行未经授权的操作。您的用户单击一个链接 - 并且从数据库中删除了某些内容。或者,如果用户仍然登录在线银行,可能会从用户的帐户中转出一些金额。

      http://superbank.com/TransferMoney?amount=1000&recipient=2342524

      发送包含引用此链接的嵌入图像的恶意电子邮件,文档一打开,幕后就发生了一些有趣的事情。

      【讨论】:

      • 虽然这是正确的,但对于一个不称职的黑客来说,诱使您执行恶意 POST 请求并不难。
      • 但这将是一个技巧,可以反击,而 image-get 是完全合法的操作
      • @ymv:是的,但是你通过链接接受 GET 命令来更新你的东西是愚蠢的。
      • @LukeH 如何欺骗用户执行恶意 POST 请求?请举个例子。
      【解决方案6】:

      GET 受限于浏览器/服务器可以处理的 URL 长度。这过去只有 256 个字符。

      【讨论】:

      • HTTP 规范中没有这样的限制。实际上,限制高于 256 个字符。
      • 2000 个字符应视为当前的实际限制。见stackoverflow.com/questions/417142/…
      • “曾经是”。我在 1997 年查看了 POST 与 GET,我在这里给出的原因是我当时发现的。
      【解决方案7】:

      至少在一种情况下,您希望 GET 更改服务器上的数据。也就是 GET 返回数据的时候,你需要记录下给用户的是哪些数据,什么时候给的。

      如果您使用复杂的数据类型,那么它必须在 POST 中,而不能在 GET 中。例如,只有在合约使用简单数据类型时才能在浏览器中测试 WCF Web 服务。

      在预期的地方使用 GET 和 POST 有助于让您的程序易于理解。

      【讨论】:

        【解决方案8】:

        当您使用 POST 时,您可以在网络浏览器的地址栏中看到正在“发布”的信息。当您使用 GET 方法时,[显然] 不是这种情况。

        这篇文章在某处http://www.w3schools.com/ 找到它所在的确切页面后,我将重新发布。 :-)

        【讨论】:

        • 肯定错了!
        • 对不起伙计们,我到底在想什么!?我知道情况正好相反,但我……啊……我需要睡觉
        猜你喜欢
        • 2022-01-12
        • 2021-09-13
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 2020-07-11
        • 2018-11-23
        • 1970-01-01
        相关资源
        最近更新 更多