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();                
         }

但除了来自此功能的请求之外,我还可以在浏览器 website.com/Act 的地址行中收集地址以执行操作。我的网站的这种不可接受的行为。如何正确防止用户的此类行为?

4

2 回答 2

1

您可以通过将请求更改为“POST”而不是“GET”来做到这一点。然后动作应该用 [HttpPost] 属性装饰,如下所示:

[HttpPost]
public string Act()
{     
}
于 2013-08-28T18:14:57.173 回答
1

Request.IsAjaxRequest您可以使用.For 您的操作在控制器操作中进行检查,如下所示:

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

}

您甚至可以为此编写自定义属性,如下所示:

[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()
{     


}
于 2013-08-28T18:17:50.763 回答