为什么要使用HTTP POST或DELETE而不是GET删除?

时间:2009-04-24 14:25:23

标签: asp.net-mvc http http-delete

我一直在使用Microsoft的ASP.NET MVC教程,最后到了这个页面

http://www.asp.net/learn/mvc/tutorial-32-cs.aspx

以下声明针对本页底部:

  

通常,在调用修改Web应用程序状态的操作时,您不希望执行HTTP GET操作。执行删除时,您希望执行HTTP POST,或者更好的是,执行HTTP DELETE操作。

这是真的吗?任何人都能对这一陈述背后的理由提供更详细的解释吗?

修改

Wikipedia声明如下:

  

某些方法(例如,HEAD,GET,OPTIONS和TRACE)被定义为安全,这意味着它们仅用于信息检索,不应更改服务器的状态。

     

相比之下,POST,PUT和DELETE等方法适用于可能导致服务器副作用的操作

10 个答案:

答案 0 :(得分:52)

Jon Skeet的答案是规范的答案。但是:假设你有一个链接:

href = "\myApp\DeleteImportantData.aspx?UserID=27"

并且google-bot出现并为您的网页编制索引?那么会发生什么?

答案 1 :(得分:46)

GET通常没有副作用 - 换句话说,它不会改变状态。这意味着可以缓存结果,可以安全地制作书签等。

来自the HTTP 1.1 RFC 2616

  

执行者应该意识到这一点   软件代表他们的用户   互联网上的互动,和   应该小心允许用户   注意他们可能采取的任何行动   拿出可能出乎意料的   对自己或他人的意义。

     

特别是,惯例已经   建立了GET和HEAD   方法不应该有   采取行动的重要性   而不是检索。这些方法应该   被认为是“安全的”。这允许用户   代理人代表其他方法,   例如POST,PUT和DELETE,在   特殊的方式,使用户成为   意识到可能的事实   正在要求采取不安全行动。

     

当然,这是不可能的   确保服务器没有   产生副作用的结果   执行GET请求;事实上,   一些动态资源考虑到了   特征。重要的区别   这是用户没有请求   副作用,所以不能   对他们负责。

答案 2 :(得分:17)

除了关于幂等的纯粹问题外,还有一个实用的方面:蜘蛛/机器人/爬虫等会跟随超链接。如果您将“删除”操作作为执行GET的超链接,则Google可以快速删除您的所有数据。请参阅“The Spider of Doom”。

对于帖子,这不是风险。

答案 3 :(得分:14)

另一个例子..

http://example.com/admin/articles/delete/2

如果您已登录并具有正确的权限,则会删除该文章。如果您的网站接受评论,例如用户将该链接作为图片提交;像这样:

<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>

然后当您自己作为管理员用户浏览您网站上的评论时,浏览器将尝试通过向该URL发送请求来获取该图像。但是因为您在浏览器执行此操作时已登录,所以该文章将被删除。

如果没有查看源代码,您可能甚至都没注意到,因为大多数浏览器在找不到图像时都不会显示任何内容。

希望这是有道理的。

答案 4 :(得分:12)

Please see my answer here。它同样适用于这个问题。

  
      
  • 预取:很多网络浏览器都会使用预取功能。意思是   它将在您之前加载页面   点击链接。预料到这一点   稍后您将点击该链接。
  •   
  • Bots:有几个机器人扫描并索引互联网   信息。他们只会发出GET   要求。你不想删除   来自GET请求的东西   原因。
  •   
  • 缓存: GET HTTP请求不应该更改状态,它们应该是幂等的。幂等意味着   发出一次请求或发出请求   多次给出相同的结果。   即没有副作用。对于   这是GET HTTP请求的原因   与缓存紧密相关。
  •   
  • HTTP标准如此:HTTP标准说明了每种HTTP方法的含义   对于。建立了几个程序   使用HTTP标准,他们假设   你将按照自己的方式使用它   应该。所以你会有   来自一大堆的未定义行为   如果你不遵守随机程序。
  •   

答案 5 :(得分:4)

除了蜘蛛和请求必须是幂等的,还有get请求的安全问题。有人可以轻松地通过

向您的用户发送电子邮件
<img src="http://yoursite/Delete/Me" />

在文本中,浏览器很乐意继续尝试访问资源。使用POST不能解决这些问题(因为你可以很容易地在javascript中组合一个表单帖子),但这是一个好的开始。

答案 6 :(得分:3)

关于本主题(HTTP方法用法),我建议您阅读此博文:http://blog.codevader.com/2008/11/02/why-learning-http-does-matter/

这实际上是相反的问题:为什么在没有数据更改时不使用POST。

答案 7 :(得分:2)

假设我们有一个网上银行应用程序,我们访问转移页面。登录用户选择将10美元转移到另一个帐户。

点击提交按钮会将(作为GET请求)重定向到https://my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2j

但是互联网连接速度很慢和/或服务器很忙,所以在点击提交按钮后新页面加载速度很慢。

用户感到沮丧并开始疯狂地点击F5(刷新页面)。猜猜会发生什么?可能会发生多次转移,可能会清空用户的帐户。


现在,如果请求是作为POST(或GET以外的任何其他内容),用户将使第一个F5(刷新页面)轻轻地询问“您确定要这样做吗?它可能有副作用[ bla bla bla] ......“

答案 8 :(得分:2)

除了此处提到的所有出色原因之外,收件人服务器还可以记录GET请求,例如access.log中。如果您在请求中发送敏感数据(例如密码),它们将被记录为纯文本。

即使为安全的数据库存储而对它们进行了哈希处理/加盐处理,也可以通过泄露(或有人在IT人士的肩膀上看)泄露它们。这样的数据应该放在POST正文中。

答案 9 :(得分:1)

GET的另一个问题是该命令会进入浏览器的地址栏。因此,如果您刷新页面,则再次发出命令,无论是“删除最后的东西”,“提交订单”还是类似的。