Asp.net mvc 如何阻止用户更改url中的ID以访问其他记录?

Asp.net mvc 如何阻止用户更改url中的ID以访问其他记录?,asp.net-mvc,url-routing,Asp.net Mvc,Url Routing,使用asp MVC4 当用户转到学生记录时,URL显示: http://studentTracker.org/Record/Student?studentId=380 目前,用户可以在url中更改studentId并获取该students记录,除非该记录不存在。如何隐藏url的查询字符串部分,或者在控制器上检测/验证用户是否更改了url?首先,您不能阻止用户做任何事情,尤其是更改url中的id之类的事情。你能做的是确保如果他们这样做,他们会得到404或403之类的东西,而不是实际的内容 实现这

使用asp MVC4

当用户转到学生记录时,URL显示:

http://studentTracker.org/Record/Student?studentId=380

目前,用户可以在url中更改studentId并获取该students记录,除非该记录不存在。如何隐藏url的查询字符串部分,或者在控制器上检测/验证用户是否更改了url?

首先,您不能阻止用户做任何事情,尤其是更改url中的id之类的事情。你能做的是确保如果他们这样做,他们会得到404或403之类的东西,而不是实际的内容

实现这一点的方法是进行对象级许可,这基本上只是意味着将对象绑定到允许以某种方式查看/编辑它的用户。通常,这将通过外键完成,外键指向“用户”实体或更广泛的组或角色

例如,如果“Student 380”记录归
jdoe
所有,则可以通过首先向“Student”实体上的“user”实体添加外键来阻止除
jdoe
之外的任何人访问该记录。(假设身份,因为未指定):

然后,在您的操作中,不只是通过id进行查询,而是通过URL中的id和经过身份验证的用户的id进行查询:

var userId = User.Identity.GetUserId();
var student = db.Students.SingleOrDefault(m => m.Id == studentId && m.OwnerId == userId);
if (student == null)
{
    return new HttpNotFoundResult();
}

现在,如果用户更改了
studentId
,但没有设置为匹配学生的“所有者”,他们将获得404。

首先,你不能阻止用户做任何事情,尤其是更改URL中的id之类的事。你能做的是确保如果他们这样做,他们会得到404或403之类的东西,而不是实际的内容

实现这一点的方法是进行对象级许可,这基本上只是意味着将对象绑定到允许以某种方式查看/编辑它的用户。通常,这将通过外键完成,外键指向“用户”实体或更广泛的组或角色

例如,如果“Student 380”记录归
jdoe
所有,则可以通过首先向“Student”实体上的“user”实体添加外键来阻止除
jdoe
之外的任何人访问该记录。(假设身份,因为未指定):

然后,在您的操作中,不只是通过id进行查询,而是通过URL中的id和经过身份验证的用户的id进行查询:

var userId = User.Identity.GetUserId();
var student = db.Students.SingleOrDefault(m => m.Id == studentId && m.OwnerId == userId);
if (student == null)
{
    return new HttpNotFoundResult();
}

现在,如果用户更改了
studentId
,但未设置为匹配学生的“所有者”,他们将获得404。

我不使用asp,但尝试将用户id存储在会话变量或cookie中,然后将存储变量的值与
studentId
的值进行比较。如果它们不匹配,则将用户重定向到某个位置。我不使用asp,但尝试将用户id存储在会话变量或cookie中,然后将存储变量的值与
studentId
的值进行比较。如果他们不匹配,那么将用户重定向到某个地方。因此在这种情况下,可以查看学生记录的人是辅导员,他们都可以访问所有学生记录。因此,他们没有安全理由不能这样做,实际上,就业务规则而言,这很好。总的来说,获取数据似乎是一个非常不安全的原因。我的意思是,参数不能隐藏在标题或GET上的某个地方,所以它们在URL中不可见吗?不。HTTP不是这样工作的。URI是一个“唯一的资源标识符”,在这里,
studentId
使其唯一,并允许服务器返回特定的student。这也不是“不安全”。首先,像id这样的东西在数据库表之外没有固有的值,如果有人可以看到数据库表,那么您需要考虑的问题远比在URL中公开id更紧迫。就用户能够操作它而言,应用程序总是通过执行类似于我在这里描述的操作来增强自身的抗操作能力。通过将studentid数据类型设置为guid,手动设置参数和获取用户信息将非常困难,因此在这种情况下,可以查看学生记录的人是辅导员,他们都可以访问所有学生记录。因此,他们没有安全理由不能这样做,实际上,就业务规则而言,这很好。总的来说,获取数据似乎是一个非常不安全的原因。我的意思是,参数不能隐藏在标题或GET上的某个地方,所以它们在URL中不可见吗?不。HTTP不是这样工作的。URI是一个“唯一的资源标识符”,在这里,
studentId
使其唯一,并允许服务器返回特定的student。这也不是“不安全”。首先,像id这样的东西在数据库表之外没有固有的值,如果有人可以看到数据库表,那么您需要考虑的问题远比在URL中公开id更紧迫。就用户能够操作它而言,应用程序始终需要通过执行类似于我在此处所述的操作来增强自身抵御此类操作的能力。通过将studentid数据类型设置为guid,手动设置参数和获取用户信息将非常困难