阻止Url篡改以访问其他用户数据

时间:2013-01-05 09:54:24

标签: asp.net-mvc asp.net-mvc-3 forms-authentication url-routing

我只是想评估一下我应该如何处理这个问题的意见,并最终寻找一个快速的胜利(错误的方式来思考事情的时间压力意味着我必须快速思考并采取行动!

我收到了一个有点问题的网站。

我使用标准表单身份验证登录为User1234,我的URL如下:

www.mywebsite.co.uk/1234/Contact。

这将带我到User1234的详细信息。

您可以将两个和两个放在一起并正确地假设1234是某种用户ID。

经过身份验证后,我可以使用[授权]属性访问视图,任何匿名/未经过身份验证的用户都会被重定向。

然而,一旦以User1234身份登录,我就可以像这样修改网址:

www.mywebsite.co.uk/1235/Contact。

所以我被认证为User1234,但可以看到User1235的数据。由于显而易见的原因,这很糟糕。

当我登录时,我主动在会话中设置登录ID,所以理论上,每当用户点击ActionResult时我都可以检查,我可以根据会话登录ID交叉检查URL中存在的ID。然而,这是一个有很多行动结果的项目,因此,我不愿意在周六下午为每一个ActionResult添加一些东西。

我可以使用global.asax中的一个事件,它可以在每个ActionResult请求中点击,我可以将会话登录ID与URL ID进行比较吗?

或者,任何人都可以就如何实现此目标或限制URL篡改提出一些建议吗?

3 个答案:

答案 0 :(得分:0)

你可以尝试做一个基本控制器

public class BaseController : Controller 
{
     protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        //Do your stuff here
        base.OnActionExecuted(filterContext);
    }

}

答案 1 :(得分:0)

我假设您不想更改URL路由,因为您也可以从会话中检索用户ID。一个快速的解决方案是使用ActionFilter,您可以将其置于受影响的控制器或操作方法上:

public class VerifyUserIdAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var sessionUserId = filterContext.HttpContext.Session["UserId"];

        var routeUserId = filterContext.RouteData.Values["UserId"];
        if (routeUserId != null && sessionUserId == routeUserId)
            filterContext.Result = new RedirectResult("<<url to redirect to>>");
    }
}

答案 2 :(得分:-1)

我不明白为什么URL包含数据入口点。这似乎是一个设计缺陷。我会删除所有使用URL参数的代码,而是确保控制器根据登录用户查找ID。