0

我只想评估我应该如何处理这个问题,并最终寻找一个快速胜出的意见(错误的方式来思考的事情螺母时间压力意味着我必须快速思考和行动!防止网址篡改访问其他用户的数据

我已经拥有一个网站,有一个有点问题

我登录使用标准窗体身份验证为User1234和我的网址如下:

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

This将带我到User1234的细节。

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

一旦通过身份验证,我可以访问[Authorize]属性存在的视图,任何匿名/未经身份验证的用户都会被重定向。

然而,一旦身份登录User1234,那么我可以通过URL鼓捣像这样:

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

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

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

在global.asax中是否存在一个事件我可以使用哪个命中每个ActionResult请求,我可以将会话登录ID与URL ID进行比较?

另外,任何人都可以提供一些关于如何实现这一点或限制URL篡改的建议吗?

回答

0

我假设你不想改变你的URL路由,因为你也可以从会话中检索用户标识。快速解决方案是使用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>>"); 
    } 
} 
0

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

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

} 
-1

我不明白为什么网址中包含数据的切入点。这似乎是一个设计缺陷。我将删除所有使用URL参数的代码,并确保控制器查找基于登录用户的ID。