为什么不应该在HTTP GET请求上修改数据?

时间:2009-04-01 14:27:49

标签: http get

我知道使用非GET方法(POST,PUT,DELETE)来修改服务器数据是正确的做事方式。我可以找到多个资源声称GET请求不应该更改服务器上的资源。

然而,如果客户今天来找我并说“我不关心做什么事情的正确方法是什么,如果我们可以使用调用URL并获得一些,我们就更容易使用您的API XML回来 - 我们不想构建HTTP请求和POST / PUT XML,“我可以用什么有助于商业的原因来说服他们呢?

是否存在缓存问题?安全问题?我有点想要的不只是“它在语义上没有意义”或“它使事情变得模棱两可。”

修改

感谢迄今为止有关预取的答案。我并不关心预取,因为主要是围绕内部网络API的使用,而不是可访问的HTML页面,这些页面可能有浏览器预取的链接。

7 个答案:

答案 0 :(得分:46)

  • 预取:很多网络浏览器都会使用预取功能。这意味着它会在您单击链接之前加载页面。预计您稍后会点击该链接。
  • Bots:有几个机器人扫描并索引互联网以获取信息。他们只会发出GET请求。出于这个原因,您不希望从GET请求中删除某些内容。
  • 缓存: GET HTTP请求不应更改状态,并且它们应该是幂等的。幂等意味着发出一次请求或多次发出请求会产生相同的结果。即没有副作用。因此,GET HTTP请求与缓存紧密相关。
  • HTTP标准如此:HTTP标准说明了每种HTTP方法的用途。构建了几个程序来使用HTTP标准,并且它们假设您将按照预期的方式使用它。因此,如果您不遵循,您将从一系列随机程序中获得未定义的行为。

答案 1 :(得分:6)

Google如何使用网址中的所有GET参数查找指向该网页的链接,并不时地重新访问该网页?这可能会导致灾难。

The Daily WTF 上有一个funny article

答案 2 :(得分:5)

可以强制用户使用GET并导致跨站点请求伪造(CSRF)。例如,如果您在http://example.com/logout.php处有注销功能,这会更改用户的服务器状态,则恶意用户可以在使用上述网址作为其来源的任何网站上放置图片代码:http://example.com/logout.php 。加载此代码会导致用户退出。在给出的例子中没什么大不了的,但如果这是一个从账户转出资金的命令,那将是一件大事。

答案 3 :(得分:3)

以正确的方式做到这一点的充分理由......

它们是行业标准,文档齐全且易于保护。虽然你完全支持让客户尽可能轻松地生活,但你不想在短期内实现更容易的事情,而不是那些对他们来说不那么容易但却能带来长期利益的事情。

我最喜欢的一句话

  

快速而肮脏......很久之后   Quick离开了Dirty遗骸。

对你而言,这是一个“及时节省九个”;)

答案 4 :(得分:2)

安全 GET请求中CSRF非常容易。

使用POST 无论如何都不会保护你,但是通过使用接受图片标签的论坛和地方,GET可以更容易地利用和大规模利用。

根据您在服务器端执行的操作,使用GET可以帮助攻击者启动 DoS(拒绝服务)。攻击者可以使用图像标记中的昂贵GET请求向数千个网站发送垃圾邮件,这些网站的每个访问者都会针对您的网络服务器执行此昂贵的GET请求。这会给你带来很多CPU周期。

我知道有些页面总是很重,这总是一个风险,但如果你在每个GET请求中添加10条大记录,风险会更大。

答案 5 :(得分:1)

一个人的安全。如果网络抓取工具遇到删除链接,或者用户被欺骗点击超链接,会发生什么?用户在实际操作之前应该知道他们在做什么。

答案 6 :(得分:1)

  

我在寻找的不仅仅是“它在语义上没有意义”或“它使事情变得模棱两可。”

     

...

     

我不关心做事的正确方法是什么,对我们来说更容易

告诉他们想一想他们曾经使用过的最糟糕的API。他们难道不能想象这是由快速破解延长造成的吗?

如果你从语义上有意义的东西开始,它将在2个月内更容易(也更便宜)。我们称之为“正确的方式”,因为它使事情变得更容易,而不是因为我们想要折磨你。