我一直在学习 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是常规免费的副作用 - 换句话说,它不改变的状态。这意味着结果可以被缓存,书签可以安全地制造等

的HTTP 1.1 RFC 2616

  

实现者应该注意,该   软件代表了用户的   在互联网上的互动,和   应仔细允许用户   要知道任何行动,他们可能   采取可能有意想不到的   意义自己或他人。

     

在特别地,常规已   建立了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的另一个问题是,命令进入到浏览器的地址栏中。所以,如果你刷新页面,你再次发出命令,无论是“删除最后的东西”,“提交订单”或类似的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top