我一直在研究微软的ASP.NET MVC教程,最后到了这个页面
http://www.asp.net/learn/mvc/tutorial-32-cs.aspx
以下声明是针对此页面的底部进行的:
通常,在调用修改Web应用程序状态的操作时,您不希望执行HTTP GET操作.执行删除时,您希望执行HTTP POST,或者更好的是,执行HTTP DELETE操作.
这是真的?任何人都能对这一陈述背后的理由提供更详细的解释吗?
维基百科声明如下:
某些方法(例如,HEAD,GET,OPTIONS和TRACE)被定义为安全,这意味着它们仅用于信息检索,不应更改服务器的状态.
相比之下,POST,PUT和DELETE等方法适用于可能导致服务器副作用的操作
Chris Cudmor.. 55
Jon Skeet的答案是规范的答案.但是:假设你有一个链接:
href = "\myApp\DeleteImportantData.aspx?UserID=27"
并且google-bot出现并为您的页面编制索引?那么会发生什么?
Jon Skeet的答案是规范的答案.但是:假设你有一个链接:
href = "\myApp\DeleteImportantData.aspx?UserID=27"
并且google-bot出现并为您的页面编制索引?那么会发生什么?
GET通常没有副作用 - 换句话说,它不会改变状态.这意味着可以缓存结果,可以安全地制作书签等.
来自HTTP 1.1 RFC 2616
实施者应该意识到软件代表用户在互联网上的交互,并且应该小心地让用户知道他们可能采取的任何可能对他们自己或他人有意想不到的意义的行为.
特别是,已经建立了这样的惯例:GET和HEAD方法不应该具有采取除检索之外的动作的重要性.这些方法应该被认为是"安全的".这允许用户代理以特殊方式表示其他方法,例如POST,PUT和DELETE,以便使用户意识到正在请求可能不安全的操作.
当然,不可能确保服务器不会因执行GET请求而产生副作用; 实际上,一些动态资源会考虑这个功能.这里的重要区别是用户没有请求副作用,因此不能对他们负责.
除了关于幂等的纯粹主义问题外,还有一个实用的方面:蜘蛛/机器人/爬虫等将遵循超链接.如果您将"删除"操作作为执行GET的超链接,则Google可以快速删除您的所有数据.参见" 末日的蜘蛛 ".
有了帖子,这不是风险.
另一个例子..
http://example.com/admin/articles/delete/2
如果您已登录并具有正确的权限,这将删除该文章.如果您的网站接受评论,例如用户将该链接作为图片提交; 像这样:
然后,当您自己作为管理员用户浏览您网站上的评论时,浏览器将尝试通过向该URL发送请求来获取该图像.但是因为您在浏览器执行此操作时已登录,所以该文章将被删除.
您可能甚至没有注意到源代码,因为大多数浏览器在找不到图像时都不会显示任何内容.
希望有道理.
请在这里查看我的答案.它同样适用于这个问题.
预取:很多Web浏览器都会使用预取.这意味着它会在您单击链接之前加载页面.预计您稍后会点击该链接.
机器人:有几个机器人扫描并索引互联网以获取信息.他们只会发出GET请求.出于这个原因,您不希望从GET请求中删除某些内容.
缓存: GET HTTP请求不应该改变状态,它们应该是幂等的.幂等意味着发出一次请求或多次发出请求会产生相同的结果.即没有副作用.因此,GET HTTP请求与缓存紧密相关.
HTTP标准如此说:HTTP标准说明了每种HTTP方法的用途.构建了几个程序来使用HTTP标准,并且它们假设您将按照预期的方式使用它.因此,如果您不遵循,您将从一系列随机程序中获得未定义的行为.