为什么应该使用 HTTP POST 或 DELETE 而不是 GET 进行删除?
-
16-09-2019 - |
题
我一直在学习 Microsoft 的 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 等方法适用于可能对服务器造成副作用的操作
解决方案
乔恩斯基特的回答是规范的答案。但是:假设你有一个链接:
href = "\myApp\DeleteImportantData.aspx?UserID=27"
和谷歌与机器人走来和索引你的网页?然后会发生什么?
其他提示
GET是常规免费的副作用 - 换句话说,它不改变的状态。这意味着结果可以被缓存,书签可以安全地制造等
实现者应该注意,该 软件代表了用户的 在互联网上的互动,和 应仔细允许用户 要知道任何行动,他们可能 采取可能有意想不到的 意义自己或他人。
在特别地,常规已 建立了GET和HEAD 方法不能有 采取其他行动的意义 比检索。这些方式应该 被认为是“安全的”。这允许用户 剂代表的其它方法, 如POST,PUT和DELETE,在一个 特殊的方式,使用户由 知道的事实,一个可能 正在请求不安全的行动。
自然地,不可能 确保服务器不会 产生的副作用如的结果 执行GET请求;事实上, 一些动态资源认为这是一个 特征。最重要的差别 这里要说的是,用户没有请求 副作用,因此,因此不能 被保持为它们的责任。
除了周围是幂等的纯粹的问题,有实际的侧:蜘蛛/机器人/抓取工具等将遵循超链接。如果你有你的“删除”行动,做一个GET的超链接,那么Google就可以愉快地删除所有数据。请参见 “末日的蜘蛛”。
通过讯息,这不是一个风险。
又如..
http://example.com/admin/articles/delete/2
这将删除,如果你登录的文章,并有正确的权限。如果您的网站接受例如评论和用户提交该链接为图像;像这样:
<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>
然后,当你自己是admin用户都通过浏览器将尝试通过发送关闭该URL的请求,以获取该图像网站上的评论浏览。但是因为你登录而浏览器就是做这个的文章将被删除。
您可能没有注意到,不看源代码作为大多数浏览器不会显示任何东西,如果它不能找到一个图像。
希望是有道理的。
请在这里查看我的答案. 。这同样适用于这个问题。
- 预取: 许多网络浏览器都会使用预取。这意味着 它会在你之前加载一个页面 点击链接。期待 稍后您将单击该链接。
- 机器人: 有几个机器人可以扫描互联网并为其编制索引 信息。他们只会发出 GET 请求。您不想删除 来自 GET 请求中的某些内容 原因。
- 缓存: GET HTTP 请求不应该改变状态并且它们应该是幂等的。幂等意味着 发出一次请求,或发出请求 多次给出相同的结果。IE。没有副作用。为 这个原因 GET HTTP 请求是 与缓存紧密相关。
- HTTP 标准是这么说的:HTTP标准说明了每种HTTP方法是什么 为。构建了几个程序 使用 HTTP 标准,他们假设 你会以你现在的方式使用它 应该的。所以你会有 来自大量 如果您不遵循,则随机程序。
除了蜘蛛和具有幂等也有使用GET请求一个安全问题的请求。有人可以很容易地把你的用户的电子邮件
<img src="http://yoursite/Delete/Me" />
在文本浏览器会快乐地去尝试和访问资源。使用POST是不是这样的事情治愈(你可以放在一起在JavaScript中很容易地表单POST),但它是一个好的开始。
关于这个话题(HTTP方法的用法),我建议你阅读这篇博客文章:的 http://blog.codevader.com/2008/11/02/why-learning-http-does-matter/
这实际上是相反的问题:当没有数据被改变为什么不使用POST。
让我们说我们有一个网上银行应用程序,我们参观转移页。登录的用户选择$ 10转移到另一个账户。
点击提交按钮重定向(作为GET请求) HTTPS: //my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2j
但是,互联网连接速度慢和/或服务器(S)的(是)很忙,所以打提交按钮的新页面加载后缓。
用户得到沮丧并且开始按F5(刷新页面)愤怒。猜猜会发生什么?将可能发生不止一个传递排空用户的帐户。
如果请求作出POST(或除得到任何其他)第一F5(刷新页面)
现在用户将浏览器会轻轻地问:“你确定你要这么做?它可能有副作用[唧唧歪歪] ...“
除了在这里所提到的所有的优秀的原因,GET请求可以由接收方服务器登录,如在access.log
。如果您在敏感数据发送,如要求密码,他们会得到记录为明文。
即使他们被散列/盐化安全DB存储,违反(或有人找过IT人的肩膀上)可以揭示它们。这种数据应该在POST体。
与GET的另一个问题是,命令进入到浏览器的地址栏中。所以,如果你刷新页面,你再次发出命令,无论是“删除最后的东西”,“提交订单”或类似的。