我試圖找到一種方法來拒絕任何直接訪問我的行動方法。基本上,我希望我的用戶點擊鏈接來瀏覽,而不是直接在瀏覽器的地址欄中輸入網址。拒絕直接URL訪問行動方法
現在我知道這可以通過檢查請求對象中的urlreferrer來完成,但是這種方式不可靠並且很弱,因爲urlreferrer可以很容易地被修改,並且一些安全套件實際上將它從請求中移除。
你們有沒有人知道在asp.net mvc3中做到這一點的方法?
我試圖找到一種方法來拒絕任何直接訪問我的行動方法。基本上,我希望我的用戶點擊鏈接來瀏覽,而不是直接在瀏覽器的地址欄中輸入網址。拒絕直接URL訪問行動方法
現在我知道這可以通過檢查請求對象中的urlreferrer來完成,但是這種方式不可靠並且很弱,因爲urlreferrer可以很容易地被修改,並且一些安全套件實際上將它從請求中移除。
你們有沒有人知道在asp.net mvc3中做到這一點的方法?
我不知道,但也許這個提議可以幫你老兄 讓認爲你有這樣
www.yoursite.com/home.aspx
OK網址?爲避免你的用戶直接眉頭此頁面,您可以重寫你的URL這樣
www.yoursite.com/fdmf489ruv30/home.aspx
,並在此URL中的部分「fdmf489ruv30」是創建它的session_start,並會破壞它Session_End中
一個唯一的字符串你明白了嗎?還是需要更多關於這個想法的描述? 你可以搜索這種URL重寫的傢伙。
這是一個好主意。但是,如果唯一標識是查詢字符串,它不會有效嗎? –
我真的不想這樣做,因爲這會讓網址混亂而不是seo友好。 – Duy
是的,對於搜索引擎優化是一個壞主意(嘗試通過SEO的其他概念獲得更好的排名)。和關於查詢字符串,我沒有測試,如果我self.try它,並說我的結果 –
這樣做的一個快速方法是在重定向的動作中設置包含隨機數的會話,並將該隨機數作爲參數傳遞給其他動作。
在其他操作(重定向的)內部,將會話的值與操作的參數進行比較。如果值相同,則用戶按下按鈕即可到達那裏,否則,用戶通過更改URL來到達那裏。希望能幫助到你。
這是不可能安全地確保授權用戶不能欺騙一個有效的請求。
畢竟,如果瀏覽器可以創建一個「有效請求」,那麼授權用戶也可以這麼做!
但是,這是一個不尋常的要求,我很想知道它背後的動機是什麼?
但是,有很多方法可以更難以欺騙請求。
由於沒有方法將是完全安全的,您可以嘗試混淆並使其繁瑣有人欺騙您的請求。
正如其他人所建議的,您可以爲每個會話創建一個隨機「標記」,並在URL中要求它(作爲路徑或查詢字符串)。
對此使用JavaScript會更好。用這個「標記」呈現隱藏的輸入。然後,攔截每個鏈接的click
事件,將「標記」值附加到該URL,然後導航到該URL。
您可以在使用JavaScript之前以某種方式「加強」您的令牌,並縮小您的JavaScript以使其混淆......這絕對會阻止高於平均水平的用戶修補您的URL。
有很多可能的解決方案,但「正確的」解決方案實際上取決於您試圖阻止的具體行爲。
同意這一點。你想達到什麼目的?您可以創建一個全局html頁面容器,並使用基於Ajax的操作來返回您嵌入的html。 Ajax操作可以通過屬性或其他隱藏標記方法來限制直接訪問URL。 – Roman
下面是該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操作方法的任何直接的訪問會自動將用戶重定向到主/索引操作方法。
它在一定程度上解決了問題(一定程度) – Aji
使用此代碼在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 = "" }));
}
}
}
如何「安全」這是否需要呢?你只是想阻止用戶能夠書籤和/或輸入網址?或者你是否真的想要讓那些真正知道如何欺騙Javascript和cookies的人確保安全? –
我想盡可能保證安全,這就是爲什麼urlreferrer不太合適,因爲它可以很容易地欺騙 – Duy
這是爲了防止CSRF?或者你是否真的需要阻止即使「授權」用戶欺騙有效請求? –