【问题标题】:Abusing HTTP POST滥用 HTTP POST
【发布时间】:2011-10-18 16:52:39
【问题描述】:

目前正在阅读 Bloch 的 Effective Java(第 2 版),他指出,在 Web 应用程序中过度使用 POST 本质上是不好的。不幸的是,他没有具体说明原因。

这让我大吃一惊,因为当我进行任何 Web 开发时,我使用的都是 POST!出于安全原因,我一直避免使用 GET,因为它感觉更专业(长而难看的 URL 总是因某种原因困扰我)。

GET 和 POST 之间是否存在性能差异?谁能详细说明为什么过度使用 POST 不好,为什么?我的理解 - 以及初步搜索 - 似乎都表明这两个是 Web 服务器非常相似的句柄。提前致谢!

【问题讨论】:

  • 我不喜欢 Bloch 认为他的想法重要到足以将其写成粗体但没有添加任何理由的事实。 P.S.:“有效的 Java”?我生活的矛盾。

标签: http web-applications


【解决方案1】:

您应该使用应该使用的 HTTP。

GET 应该用于幂等、读取查询(即查看项目、搜索产品等)。

POST 应该用于创建、删除或更新请求(即删除项目、更新配置文件等)

GET 允许刷新页面、为其添加书签、将 URL 发送给某人。 POST 不允许这样做。一个有用的模式是post/redirect/get(也就是发布后重定向)。

请注意,除了长搜索表单外,GET URL 应该很短。它们通常应该看起来像http://www.foo.com/app/product/view?productId=1245,甚至是http://www.foo.com/app/product/view/1245

【讨论】:

  • 谢谢 JB!我现在去看看那个链接。
【解决方案2】:

您应该几乎总是在请求内容时使用GET。仅在以下情况下使用 POST

  • 传输不应出现在 URL 栏中的敏感信息,或
  • 更改服务器上的状态(添加/更改/删除内容,尽管最近一些 Web 应用程序使用POST 更改,PUT 添加和DELETE 删除。)

区别如下:如果您想将页面链接提供给朋友,或将其保存在某处,甚至只将其添加到您的书签中,您需要页面的完整 URL。就像你的地址栏现在应该说http://stackoverflow.com/questions/7810876/abusing-http-post。你可以 Ctrl-C 那个。你可以保存它。再次输入该链接,您将返回此页面。

现在,当您使用GET 以外的任何操作时,根本没有要复制的 URL。就像您的浏览器会说您在http://stackoverflow.com/question。你不能复制那个。你不能为它添加书签。此外,如果您尝试重新加载此页面,您的浏览器会询问您是否要再次发送数据,这对于您页面的非技术用户来说相当混乱。其余的都很烦人。

但是,您应该在传输数据时使用POST/PUT。 URL 只能这么长。您不能在 URL 中传输整个博客文章。此外,如果您重新加载这样的页面,您几乎肯定会重复发布,因为上述消息不会出现

GETPOST 非常不同。为工作选择合适的人。

【讨论】:

    【解决方案3】:

    如果您出于安全原因使用 POST,我可能会在此不再提及其他安全因素。即使您使用 POST,您也需要确保以加密形式从表单提交中发送数据。

    至于 GET 和 POST 的区别,就如 GET 用于发送 GET 请求一样简单。因此,您可能希望从页面获取数据并对其采取行动,这就是一切的结束。

    另一方面,POST 用于将数据 POST 到应用程序。我这里说的是事务(完成创建、更新或删除操作)。

    如果您有一个敏感的应用程序需要使用 ID 来删除用户。您不希望为此使用 GET,因为在这种情况下,机智的用户可能会引发混乱,只需更改 URL 末尾的 ID 并删除所有随机使用。

    POST 允许更多数据,也可以被黑客入侵以发送文件流。不过 GET 的大小有限。

    使用 GET 或 POST 几乎没有任何权衡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      相关资源
      最近更新 更多