2013-08-28 57 views
0

我希望這個行動僅適用於XHR對象請求時的性能。正如我試圖它來實現: 在控制器有一個動作:忽略非阿賈克斯行動請求

 public string Act() 
     {  
     string view=""; 
     if(Request.Headers["p"]!="p") 
      Response.Redirect("/",true); 
     else 
      view = GetActView(); 

     return view; 
     } 

它是由一個事件的的onclick的手段導致功能連接,其中:

 function updateDiv() { 
       xmlhttp = new XMLHttpRequest(); 
      xmlhttp.onreadystatechange = function() { 
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
       document.getElementById('actdiv').innerHTML = xmlhttp.responseText; 
      } 
      } 
      xmlhttp.open('GET', '/Act', true); 
      xmlhttp.setRequestHeader("p", "p"); 
      xmlhttp.send();     
     } 

但是除了來自這個功能的要求我可以針對行動,收集在瀏覽器網站的一個地址欄中。這是我的網站不可接受的行爲。如何正確防止用戶的這種行爲?

+0

你不能可靠地做到這一點。更好的選擇是設計應用程序,以便通過地址欄訪問操作即可。 –

+0

在這種情況下如何做SPA? –

+1

@JohnStiks我們使用多種方法來實現安全功能。一個是在我的回答中,第二個是使用'AntiForgeryToken' –

回答

1

可以使用Request.IsAjaxRequest。對於你的行動可以按以下步驟進行檢查,在控制器動作甚至可以編寫自定義屬性爲這個如下:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class AjaxOnlyAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      var result = filterContext.Result as ViewResultBase; 
      if (result != null && result.Model != null) 
      { 
       filterContext.Result = new JsonResult 
       { 
        Data = result.Model, 
        JsonRequestBehavior = JsonRequestBehavior.AllowGet 
       }; 
      } 
     } 
    } 
} 

這可以在就像如下其它ffilters控制器的方法施加:

[AjaxOnly] 
public string Act() 
{  


} 
+1

應該指出,這可能是僞造的,不應該依靠安全的目的。 –

1

您可以通過將您的請求更改爲'POST'而不是'GET'來做到這一點。然後,動作要飾有[HttpPost]屬性是這樣的:

public string Act() 
{  
    if(Request.IsAjaxRequest) 
    { 
     //AJAX work or response 
    } 
    //Non-AJAX work 

} 

您:

[HttpPost] 
public string Act() 
{  
}