滥用HTTP POST

时间:2011-10-18 16:52:40

标签: http web-applications

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

这令我吃了一惊,因为当我进行任何Web开发时,我所使用的都是POST!出于安全考虑,我总是避开GET,因为它感觉更专业(长,不雅观的URL总是因为某些原因而烦恼)。

GET和POST之间是否存在性能差异?任何人都可以详细说明为什么过度使用POST是坏的,为什么?我的理解 - 和初步搜索 - 似乎都表明这两个处理程序非常类似于Web服务器。提前谢谢!

3 个答案:

答案 0 :(得分:4)

您应该使用HTTP,因为它应该被使用。

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

POST应该用于创建,删除或更新请求(即删除项目,更新个人资料等)。

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

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

答案 1 :(得分:2)

在请求内容时,几乎总是使用GET。只有在以下情况下才使用POST

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

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

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

但是,在传输数据时应使用POST / PUT。网址只能这么长。您无法在网址中传输整篇博文。此外,如果您重新加载此类页面,您几乎肯定会发布双重帖子,因为上述消息不会出现

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

答案 2 :(得分:1)

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

至于GET和POST之间的区别,就像使用GET发送GET请求一样简单。因此,您希望从页面获取数据并对其进行操作,这就是所有内容的结束。

另一方面,POST用于将POST数据发送到应用程序。我在这里讨论交易(完成创建,更新或删除操作)。

如果您有一个敏感的应用程序,它会删除用户,比如ID和ID。你不会想要使用GET,因为在这种情况下,一个机智的用户可能会引起混乱只是改变URL末尾的ID并删除所有随机使用。

POST允许更多数据,并且可以被黑客攻击以发送文件流。 GET虽然规模有限。

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