我一直在使用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等方法适用于可能导致服务器副作用的操作
答案 0 :(得分:52)
href = "\myApp\DeleteImportantData.aspx?UserID=27"
并且google-bot出现并为您的网页编制索引?那么会发生什么?
答案 1 :(得分:46)
GET通常没有副作用 - 换句话说,它不会改变状态。这意味着可以缓存结果,可以安全地制作书签等。
执行者应该意识到这一点 软件代表他们的用户 互联网上的互动,和 应该小心允许用户 注意他们可能采取的任何行动 拿出可能出乎意料的 对自己或他人的意义。
特别是,惯例已经 建立了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的另一个问题是该命令会进入浏览器的地址栏。因此,如果您刷新页面,则再次发出命令,无论是“删除最后的东西”,“提交订单”还是类似的。