2011-12-01 59 views
7

我試圖找到一種方法來拒絕任何直接訪問我的行動方法。基本上,我希望我的用戶點擊鏈接來瀏覽,而不是直接在瀏覽器的地址欄中輸入網址。拒絕直接URL訪問行動方法

現在我知道這可以通過檢查請求對象中的urlreferrer來完成,但是這種方式不可靠並且很弱,因爲urlreferrer可以很容易地被修改,並且一些安全套件實際上將它從請求中移除。

你們有沒有人知道在asp.net mvc3中做到這一點的方法?

+0

如何「安全」這是否需要呢?你只是想阻止用戶能夠書籤和/或輸入網址?或者你是否真的想要讓那些真正知道如何欺騙Javascript和cookies的人確保安全? –

+0

我想盡可能保證安全,這就是爲什麼urlreferrer不太合適,因爲它可以很容易地欺騙 – Duy

+0

這是爲了防止CSRF?或者你是否真的需要阻止即使「授權」用戶欺騙有效請求? –

回答

3

我不知道,但也許這個提議可以幫你老兄 讓認爲你有這樣

www.yoursite.com/home.aspx 

OK網址?爲避免你的用戶直接眉頭此頁面,您可以重寫你的URL這樣

www.yoursite.com/fdmf489ruv30/home.aspx 

,並在此URL中的部分「fdmf489ruv30」是創建它的session_start,並會破壞它Session_End中

一個唯一的字符串

你明白了嗎?還是需要更多關於這個想法的描述? 你可以搜索這種URL重寫的傢伙。

+0

這是一個好主意。但是,如果唯一標識是查詢字符串,它不會有效嗎? –

+0

我真的不想這樣做,因爲這會讓網址混亂而不是seo友好。 – Duy

+0

是的,對於搜索引擎優化是一個壞主意(嘗試通過SEO的其他概念獲得更好的排名)。和關於查詢字符串,我沒有測試,如果我self.try它,並說我的結果 –

0

這樣做的一個快速方法是在重定向的動作中設置包含隨機數的會話,並將該隨機數作爲參數傳遞給其他動作。

在其他操作(重定向的)內部,將會話的值與操作的參數進行比較。如果值相同,則用戶按下按鈕即可到達那裏,否則,用戶通過更改URL來到達那裏。希望能幫助到你。

question on Stackoverflow

0

這是不可能安全地確保授權用戶不能欺騙一個有效的請求。
畢竟,如果瀏覽器可以創建一個「有效請求」,那麼授權用戶也可以這麼做

但是,這是一個不尋常的要求,我很想知道它背後的動機是什麼?

但是,有很多方法可以更難以欺騙請求。
由於沒有方法將是完全安全的,您可以嘗試混淆並使其繁瑣有人欺騙您的請求。

正如其他人所建議的,您可以爲每個會話創建一個隨機「標記」,並在URL中要求它(作爲路徑或查詢字符串)。

對此使用JavaScript會更好。用這個「標記」呈現隱藏的輸入。然後,攔截每個鏈接的click事件,將「標記」值附加到該URL,然後導航到該URL。

您可以在使用JavaScript之前以某種方式「加強」您的令牌,並縮小您的JavaScript以使其混淆......這絕對會阻止高於平均水平的用戶修補您的URL。

有很多可能的解決方案,但「正確的」解決方案實際上取決於您試圖阻止的具體行爲。

+0

同意這一點。你想達到什麼目的?您可以創建一個全局html頁面容器,並使用基於Ajax的操作來返回您嵌入的html。 Ajax操作可以通過屬性或其他隱藏標記方法來限制直接訪問URL。 – Roman

7

下面是該NoDirectAccessAttribute方法的代碼限制到了那裏你不任何控制器或操作方法如下應用NoDirectAccess屬性

using System; 
using System.Web.Mvc; 
using System.Web.Routing; 

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class NoDirectAccessAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.UrlReferrer == null || 
        filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host) 
      { 
      filterContext.Result = new RedirectToRouteResult(new 
          RouteValueDictionary(new { controller = "Home", action = "Index", area = "" })); 
     } 
    } 
} 

使用動作過濾器的任何類或動作方法直接訪問不想用戶上面直接

[NoDirectAccess] 
public ActionResult IsUsernameUnique() 

請求它在該示例中,給IsUsernameUnique操作方法的任何直接的訪問會自動將用戶重定向到主/索引操作方法。

+1

它在一定程度上解決了問題(一定程度) – Aji

0

使用此代碼在Global.asax.cs中並調用[NoDirectAccess]所有控制器

//Prevent direct URL access: Call [NoDirectAccess] to all controllers to block 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
    public class NoDirectAccessAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (filterContext.HttpContext.Request.UrlReferrer == null || 
         filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host) 
      { 
       filterContext.Result = new RedirectToRouteResult(new 
           RouteValueDictionary(new { controller = "Home", action = "Login", area = "" })); 
      } 
     } 
    }