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

を使用してコントローラーアクションで確認Request.IsAjaxRequestできます。アクションの場合、次のように実行できます。

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 に答える
1

これを行うには、リクエストを「GET」ではなく「POST」に変更します。次に、アクションを次のように [HttpPost] 属性で装飾する必要があります。

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