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。