Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我们要在asp.net MVC中发布一篇确认删除的帖子?_Asp.net_Asp.net Mvc_Security_Asp.net Mvc 2 - Fatal编程技术网

为什么我们要在asp.net MVC中发布一篇确认删除的帖子?

为什么我们要在asp.net MVC中发布一篇确认删除的帖子?,asp.net,asp.net-mvc,security,asp.net-mvc-2,Asp.net,Asp.net Mvc,Security,Asp.net Mvc 2,下面是Scott Hanselman的Professional ASP.NET MVC 2的注释++ 你可能会问,我们为什么要通过 努力创造一个内在的世界 我们的删除确认屏幕?为什么? 不仅仅是使用标准的超链接 链接到执行以下操作的操作方法: 实际删除操作?原因是 因为我们要小心防守 针对网络爬虫和搜索 引擎发现我们的URL和 无意中导致数据丢失 当他们跟随链接时被删除。 考虑基于HTTP GET的URL 可安全进入/爬行,以及 他们不应该跟随 HTTP-POST。一个好的规则是 确定你总是把它

下面是Scott Hanselman的Professional ASP.NET MVC 2的注释++

你可能会问,我们为什么要通过 努力创造一个内在的世界 我们的删除确认屏幕?为什么? 不仅仅是使用标准的超链接 链接到执行以下操作的操作方法: 实际删除操作?原因是 因为我们要小心防守 针对网络爬虫和搜索 引擎发现我们的URL和 无意中导致数据丢失 当他们跟随链接时被删除。 考虑基于HTTP GET的URL 可安全进入/爬行,以及 他们不应该跟随 HTTP-POST。一个好的规则是 确定你总是把它放在 或后面的数据修改操作 HTTP-POST请求


如果网络爬虫和搜索引擎无法访问包含删除按钮的页面,那么使用标准超链接链接到执行实际删除操作的操作方法是否安全?

是的,如果搜索引擎无法访问它,则安全。但要确保包含某种确认或撤销功能。链接很容易被误点击。

一个好的经验法则是GET不应该更改数据。如果要更改某些数据,请使用POST

这就是ScottHa etc使用表单提交删除的原因。如果它不适用于你的应用程序,你可以在需要时使用GET



或者,您可以在用户单击链接时使用JavaScript提交表单。

我会添加一些内容,即使管理员页面受密码保护,也可以通过一些本地安装的web加速器软件“单击”删除链接。所以使用POST方法更安全。

@xport:POST执行一个操作需要2次,而GET只需要1次。在POST中,它将第一次与服务器联系以进行身份验证操作,然后执行此操作。在GET情况下,它只调用不进行身份验证的操作。所以在通常情况下,POST比GET花费更多的时间来执行操作(2次往返)。如果您有一些操作,如删除、更新、添加,。。。您必须使用POST执行它,如果某些操作仅从数据库中选择数据,则只能获取。这是我在GET和POST中的理解。

如果您使用GET请求对数据库进行任何更改,那么您很可能会在某个时候受到跨站点请求伪造攻击。你正在读的那本书更多地讨论了这一点,我在我的博客上有一些关于这一点的帖子。这是我最近发现的一个极其普遍的弱点;与SQL注入一样频繁,而且更易于利用。

有一个很好的理由不使用GET进行更改数据的操作。这不仅仅是为了语义的纯洁

提交删除后提供撤消将很困难,对吗?与其从数据库中实际删除记录,不如将“已删除”等字段设置为true。仅显示“已删除”标志为false的项目。您可以再次将此标志设置为false以撤消。@Michael,如果不删除行,并为数据库中的所有表定义一个“IsDeleted”列,则每当父表行被标记为已删除时,我将执行更多工作,例如执行已删除标记级联规则。请记住链接上的javascript确认(
onclick=“return confirm(“你确定吗?”)”
不会与蜘蛛一起工作。@xport-yesp会带来更多的工作。必须评估权衡-这是用户需要的东西吗?它会增加价值吗?如果不是,就不要这样做。在我们的应用程序中,信任是一个巨大的交易,所以我们从来不会真正删除任何东西。我们的用户不害怕单击按钮,因为他们知道他们可以“撤消”任何东西。为什么他们会这样做当存在删除http方法时,选择使用POST方法?我的意思是,他们使用POST而不是GET确实很麻烦。使用DELETE方法并不比POST复杂。回答我自己的评论:正确,任何GET请求都不应该有副作用(这称为幂等性)。此外,如果您使用链接删除某些内容,则在删除完成且用户回击后重定向,不会提示他们再次提交该操作。但就原始问题而言,如果没有搜索引擎点击链接,您可以安全地使用该链接。@alexander,我们如何对受密码保护的页面发出get请求?听起来很有趣ting对我来说!@xport-就像你对一个没有密码保护的页面发出GET请求一样。@安德鲁,这真的有可能吗?我以前不知道。@xport-那是因为你不知道一个有密码保护的页面与你使用什么HTTP方法访问它毫无关系。@xport-你的网站一定很吸引人(而且不必要)复杂,如果无法通过GET…@ThangChung访问受密码保护的页面-您对GET和POST的理解不正确。我认为我在解释消息身份验证时错了。“GET”和“POST”之间的区别,即前者意味着表单数据要(通过浏览器)进行编码而URL表示表单数据将显示在消息体中。“身份验证”与此无关;在谈论GET或POST时,不要使用该词。你上面的评论基本上是正确的,尽管措辞笨拙。但是,你上面的回答提到了一些与差异根本不相关的事情;例如身份验证、POST是两个请求、POST占用“更多时间”。tru中有相关的颗粒在这里或那里,但是一个评论真的不能详细说明所有这些。POST需要2次来执行一个操作这不是严格的或必然的。事实上,典型的模式是GET请求首先发生,然后从该页面发出POST请求。严格地说,这是一个GET和一个POST…而不是POST需要两次。esse你的意思似乎是“你必须提出一个额外的请求才能发表一篇文章”,但在这种情况下,即使这样也不完全正确:在典型情况下,要通过GET提交相同的数据,你也需要首先提出另一个GET请求。谢谢你的评论。R