2013-02-12 36 views
-1

我有一個MVC3網頁,有一些JavaScript,通過jquery加載命令加載一些內容到div。它看起來像這樣...確保MVC3的行動只有通過託管網站使用JavaScript加載

$('#divContetn').load('/home/getContent') 

這是在一些其他JavaScript被執行後調用回調。 此代碼在頁面源中可見。

我的問題是,有沒有一種方法可以確保對這個URL的調用只來自網頁,而不是來自某人在瀏覽器中自己輸入的URL?

理想情況下,我想阻止用戶從頁面源獲取此URL,然後使用它僅將內容加載到瀏覽器中。

由於其加載的回調的性質,div加載必須由JavaScript完成。

有沒有人有任何想法呢? 謝謝

+0

可能的重複[是否有任何與ASP.NET MVC控制器操作設置AJAX有關的屬性?](http://stackoverflow.com/questions/6558758/is-there-any-attribute-relating-to -ajax將要設置的換ASP淨MVC控制器-ACT) – Nope 2013-02-12 11:06:29

回答

1

您將永遠無法隱藏用戶的URL。充其量,您可以增加用戶必須投入的努力來獲取URL。即使您設法從源代碼中隱藏了URL(通過使用JavaScript進行轉義或通過AJAX檢索URL),用戶仍然可以通過簡單地使用Fiddler這樣的工具來了解URL的內容。或者瀏覽器內置的調試工具,如果可用的話。

是可能的服務器端確保URL只是導航的用戶進行AJAX調用時,通過放置該屬性上面的操作方法(S):

public class AjaxOnlyRequestAttribute : ActionMethodSelectorAttribute 
{ 
    /// <summary> 
    /// Determines whether the action method selection is valid for the specified controller context. 
    /// </summary> 
    /// <param name="controllerContext">The controller context.</param> 
    /// <param name="methodInfo">Information about the action method.</param> 
    /// <returns> 
    /// true if the action method selection is valid for the specified controller context; otherwise, false. 
    /// </returns> 
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) 
    { 
     return controllerContext.HttpContext.Request.IsAjaxRequest(); 
    } 
} 

但是,同樣的,這增加用戶必須付出努力。

0

您可以檢查是否請求是可能通過測試Request.IsAjaxRequest() Ajax調用(見here)製成。

這應該會阻止「普通」用戶直接訪問該頁面。但是很容易僞造一個包含頭部的HTTP請求,以使你的服務器相信這是一個Ajax請求。

作爲一般規則:始終假定客戶端請求中的任何內容都可以僞造和操縱。不要相信任何來自客戶的東西。特別是不要將任何安全相關功能基於任何請求值或瀏覽器功能(當然,登錄憑證和類似的除外)。

相關問題