Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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
C# 更新数据库时隐藏Asp.Net MVC损坏_C#_Asp.net_Entity Framework_Model View Controller_Asp.net Mvc 5 - Fatal编程技术网

C# 更新数据库时隐藏Asp.Net MVC损坏

C# 更新数据库时隐藏Asp.Net MVC损坏,c#,asp.net,entity-framework,model-view-controller,asp.net-mvc-5,C#,Asp.net,Entity Framework,Model View Controller,Asp.net Mvc 5,我正在学习Asp MVC 5并面临这样的问题。使用visual studio为我创建的脚手架更新控制器和视图。编辑值时,我注意到它使用隐藏来标识当前记录。例如: 如果您使用开发工具检查页面,您将发现一个值为“6”的隐藏输入 我可以轻松地将其修改为任何其他值,然后当我单击“保存”时,ASP将更新完全不同的记录。因此,黑客可能很容易破坏您的所有数据库。有没有办法防止这种情况发生,或者使用不同的方法或验证它 谢谢 有很多方法可以解决这个问题。其中一种方法是限制可以访问各种方法(如编辑)的用户 您可以

我正在学习Asp MVC 5并面临这样的问题。使用visual studio为我创建的脚手架更新控制器和视图。编辑值时,我注意到它使用隐藏来标识当前记录。例如:

如果您使用开发工具检查页面,您将发现一个值为“6”的隐藏输入

我可以轻松地将其修改为任何其他值,然后当我单击“保存”时,ASP将更新完全不同的记录。因此,黑客可能很容易破坏您的所有数据库。有没有办法防止这种情况发生,或者使用不同的方法或验证它


谢谢

有很多方法可以解决这个问题。其中一种方法是限制可以访问各种方法(如编辑)的用户

您可以有如下代码片段:

if (User.IsInRole("Administrators"))
{
    // TODO
}
或者您可以这样使用:

或者,也可以将其放置在控制器内的特定方法上:

[Authorize(Roles="Administrators")]
public ActionResult Edit(Album model)
{
    // TODO
}
当您对谁可以访问什么有广泛定义的角色,但假设您有一个每个用户都可以登录和管理自己项目的服务时,这些是更好的解决方案。您还可以向模型/表格中添加一个字段,以表示该项目所属的人员,例如:

if (albumModel.UserName == HttpContext.Current.User.Identity.Name)
{
    // allow user to edit if it is his item
}

您还可以查看如何组合这些功能,例如,如果允许管理员编辑用户的相册,您可以首先检查用户是否属于管理员角色,否则请检查是否属于此用户的相册,等等。

有多种方法可处理此问题。其中一种方法是限制可以访问各种方法(如编辑)的用户

您可以有如下代码片段:

if (User.IsInRole("Administrators"))
{
    // TODO
}
或者您可以这样使用:

或者,也可以将其放置在控制器内的特定方法上:

[Authorize(Roles="Administrators")]
public ActionResult Edit(Album model)
{
    // TODO
}
当您对谁可以访问什么有广泛定义的角色,但假设您有一个每个用户都可以登录和管理自己项目的服务时,这些是更好的解决方案。您还可以向模型/表格中添加一个字段,以表示该项目所属的人员,例如:

if (albumModel.UserName == HttpContext.Current.User.Identity.Name)
{
    // allow user to edit if it is his item
}

您还可以查看如何组合这些功能,例如,如果允许管理员编辑用户的相册,您可以首先检查用户是否属于管理员角色,否则请检查是否属于此用户的相册等。

这里的基本问题是,您的网站信任web浏览器提供的任何输入。无论输入是通过隐藏字段(在本例中是这样),还是通过URL或某些非隐藏字段(例如,您可以想象一个UI,其中有一个下拉选择器,允许您选择要修改的数据项),都会存在同样的问题或者,即使记录是在网页上JavaScript发送到后端的某个JSON消息中标识的

因此,您描述的问题实际上与隐藏字段的特定细节无关,也与您使用ASP.NET的事实无关,也与VS构建应用程序的方式无关。您可以更改任何这些详细信息,但仍然存在问题,因为恶意用户可以伪造请求中的任何内容。隐藏字段并不比任何其他类型的输入更难或更容易伪造

从安全角度来看,您需要将来自客户端的所有数据视为可疑数据。确定此类输入是否有效的规则是特定于应用程序的,这就是为什么框架代码不(也不能)尝试处理此问题

唯一的解决方案是使用某种机制,让您确定是否允许发送请求的用户执行请求所要求的操作。如果你做到了这一点,最终用户是否故意更改ID也没什么大不了的:如果某个特定用户有权编辑ID为6的记录或ID为7的记录,那么如果他们编辑了6并将其更改为7,这是他们的决定-他们被允许编辑记录7,并且已经选择这样做;他们做这件事的方式很奇怪,但这是他们的注意事项。如果用户有权限编辑6而不是7,并且他们试图将id更改为7,则服务器应使用403(禁止)响应代码拒绝该请求

这意味着您需要某种方法来识别用户(或者至少有一些了解他们的方式-足以确定他们有权做什么;在某些情况下,可能足以知道用户成功地针对某个安全机构进行了身份验证-对于某些操作,合理的安全策略可能只是信任所有经过身份验证的用户,或者信任所有被授权的用户长到一个特定的安全组)。并且您需要某种方法来决定在识别特定实体后,是否允许用户对特定实体执行特定操作

通常,这意味着让用户登录(你可以通过各种方式实现这一点——你的应用程序可能运行在某个具有某种单一登录系统的组织内部,或者你可以遵从外部ID提供商(如Google、Facebook或Azure Active Directory),或者你可以自己管理帐户——ASP.NET可以为你管理SQL server中的用户帐户你需要决定你的安全策略实际上是如何工作的,这是一个开放的问题,我甚至不打算给出例子,然后你需要编写代码来强制执行该策略

你从VS获得的基本框架应用程序并不能完成所有这些,因为有很多不同的方法可以实现。它可以完成其中的一部分,你可以告诉它使用用户帐户支持来配置应用程序(例如,如果您愿意,在创建项目时,它将设置基于SQL Server的帐户管理,也可以将其设置为使用AAD,或通过集成Windows身份验证进行单点登录)。但您的工作仍然是决定您想要什么样的安全策略。如果您想要一个非常基本的模型,例如,“只有经过身份验证的用户才能访问该属性”,然后您可以在控件上设置
[Authorize]
自定义属性