使用GET而不是POST来删除经过身份验证的页面后面的数据

时间:2010-03-11 17:35:25

标签: asp.net-mvc http crud

我知道只要在公共网站上修改数据,就应该使用POST。有几个原因,包括搜索引擎将遵循所有链接并修改数据。

我的问题是你认为在管理界面之类的身份验证页面后面使用GET是否可行?

一个例子是每行都有删除链接的产品列表。由于进入该页面的唯一方法是,如果您已登录,那么在查询字符串中使用带有产品ID的链接是否有任何危害?

详细说明评论:

我个人在使用POST实现删除时没有任何问题或困难。我刚刚在ASP.NET和ASP.NET MVC中看到了几个使用GET而不是POST的“admin like”页面的代码示例。我很好奇人们对此事的看法。

8 个答案:

答案 0 :(得分:5)

使用GET的诱惑是,您可以创建一堆删除链接,而无需每页创建数十个表单,或使用JavaScript。然而,由于已经提到的各种原因,网络依赖于GET不具有破坏性。

最佳做法是,如果在服务器上为每个删除链接生成一个小表单是不切实际的,那就是使用GET链接从服务器加载一个确认页面,该页面具有执行的POST表单删除。然后做一些渐进式增强:

<a href="/controller/delete/1" onclick="$.post(this.href); return false;">Delete</a>

如果服务器获取GET到/ controller / delete / x,则使用POST表单提供确认页面。如果服务器获得POST(或可能是DELETE)请求,则执行删除操作。

答案 1 :(得分:4)

有些人前段时间才知道这是一个非常糟糕的主意。

谷歌推出了一款新的“加速浏览”应用程序(谷歌网络加速器)预览浏览器中的链接页面(没有攻击,没有第三方...),当有人登录到这些受保护的页面时,应用程序查看了所有这些链接并说:“嘿,我也会预取那些链接,因为这样我就可以在用户请求时准备页面了”

他们改变了行为,但任何人都可以做任何类似的事情。

答案 2 :(得分:3)

使用GET进行破坏性操作仍然是不好的做法 - 即使它隐藏在身份验证之后 - 因为它使得知道该URL的人可以(更容易?)利用它(例如,使用XSS)。当然,这也是一个糟糕的设计/编码实践,特别是如果您正在尝试创建RESTful服务。

还有很多其他原因......

答案 3 :(得分:3)

GET应该用于幂等地检索数据,POST应该用于非幂地更新数据。就这样。当然,这不是交换方法的“最佳实践”。

对于XSS和CSRF风险,为了防止在(重新)显示期间只是HTML-escape任何用户控制的输入,并防止另一个只使用基于请求的令牌和/或验证码。

答案 4 :(得分:2)

代码可能依赖(正确)GET不具有破坏性。该代码可以在浏览器中运行,因此将进行身份验证(链接预取会浮现在脑海中)。

答案 5 :(得分:2)

根据GET请求删除数据是不好的做法。从技术上讲,你可以做到,但你会与大多数写得很好的网站不同步。如果您使用GET请求删除,您基本上是为您的用户界面创建一组新规则。我认为您网站的网址是用户界面的一部分。如果您向某人发送了http://www.fakesite.site/posts/delete?ID=1这样的链接,他们会希望显示一个页面,询问他们是否要删除ID为#1的帖子,而不是执行实际删除。

答案 6 :(得分:1)

我在我知道有人登录的页面上执行此操作,并且我可以根据我在会话中保留的其他数据验证用户是否有权删除某些内容。我建议添加一个确认步骤:“你确定要删除这个东西吗?”

答案 7 :(得分:-3)

GET和POST非常非常相似,除了GET对HTTP操作的长度有限制这一事实,因为它们都是基于URL的。

由于您不会向未经过身份验证的人提供访问权限,因此我不相信使用获取是有问题的。