如何阻止用户更改 url 中的 ID 以访问其他记录?
How to stop user from changing ID in url to access other records?
使用 asp mvc 4.
当用户转到学生记录时,URL 表示:
http://studentTracker.org/Record/Student?studentId=380
目前,用户可以直接在 url 中更改 studentId 并获取学生记录,除非它不存在。如果用户更改了 url,如何在控制器中隐藏 url 或 detect/validate 的查询字符串部分?
首先,您不能阻止用户做任何事情,真的,尤其是像更改 URL 中的 id 这样的事情。您可以做的是确保如果他们这样做,他们会得到类似 404 或 403 的内容,而不是实际内容。
这样做的方法是进行对象级许可,这基本上只是意味着将对象绑定到允许以某种方式 view/edit 它的用户。通常,这将通过外键完成,比如你的 "user" 实体或更广泛的东西,比如组或角色。
例如,如果 "Student 380" 记录归 jdoe
所有,那么您可以通过首先向 [=] 添加外键来阻止 jdoe
以外的任何人访问它27=] 实体在您的 "student" 实体上。 (假设身份,因为未指定):
public class Student
{
...
[ForeignKey("Owner")]
public string OwnerId { get; set; }
public virtual ApplicationUser Owner { get; set; }
}
然后,在您的操作中,您不是仅通过 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
但未设置为匹配学生的 "owner",他们将收到 404。
使用 asp mvc 4.
当用户转到学生记录时,URL 表示:
http://studentTracker.org/Record/Student?studentId=380
目前,用户可以直接在 url 中更改 studentId 并获取学生记录,除非它不存在。如果用户更改了 url,如何在控制器中隐藏 url 或 detect/validate 的查询字符串部分?
首先,您不能阻止用户做任何事情,真的,尤其是像更改 URL 中的 id 这样的事情。您可以做的是确保如果他们这样做,他们会得到类似 404 或 403 的内容,而不是实际内容。
这样做的方法是进行对象级许可,这基本上只是意味着将对象绑定到允许以某种方式 view/edit 它的用户。通常,这将通过外键完成,比如你的 "user" 实体或更广泛的东西,比如组或角色。
例如,如果 "Student 380" 记录归 jdoe
所有,那么您可以通过首先向 [=] 添加外键来阻止 jdoe
以外的任何人访问它27=] 实体在您的 "student" 实体上。 (假设身份,因为未指定):
public class Student
{
...
[ForeignKey("Owner")]
public string OwnerId { get; set; }
public virtual ApplicationUser Owner { get; set; }
}
然后,在您的操作中,您不是仅通过 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
但未设置为匹配学生的 "owner",他们将收到 404。