如何阻止用户更改URL中的ID以访问其他记录?

时间:2016-10-12 16:19:17

标签: asp.net-mvc url-routing

使用asp mvc 4。

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

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

目前,用户可以在网址中更改studentId并让学生记录,除非它不存在。如果用户更改了网址,我如何隐藏网址的查询字符串部分,或者在控制器上检测/验证?

1 个答案:

答案 0 :(得分:1)

首先,您无法阻止用户做任何事情,尤其是更改URL中的ID。您可以做的是确保如果他们这样做,他们会得到类似404或403的内容,而不是实际的内容。

这样做的方法是进行对象级权限,这基本上只是意味着将对象绑定到允许以某种方式查看/编辑它的用户。通常,这将通过外键完成,例如你的"用户"实体或类似团体或角色的更广泛的东西。

例如,如果"学生380"记录归jdoe所有,然后您可以阻止jdoe以外的任何人访问该记录,方法是先向您的用户添加外键"你"学生的实体"实体。 (假设身份,因为未指明):

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但未设置为"所有者"对于匹配的学生,他们将获得404。