在ASP.NET MVC項目中,使用AJAX向控制器發送GET請求獲取JSON數據時,出現這個錯誤:"此請求已被阻止,因為當用在 GET 請求中時,會將敏感信息透漏給第三方網站。若要允許 GET 請求,請將 JsonRequestBehavior 設置為 AllowGet"。
其實從返回的這個錯誤信息我們已經可以知道解決方法了,看這個信息:”因為當用在 GET 請求中時,會將敏感信息透漏給第三方網站“,說明我們只要使用POST請求就可以了。后面的 “若要允許 GET 請求,請將 JsonRequestBehavior 設置為 AllowGet”,這是提示第二種解決方法,就是設置JSON結果對象使其允許來自客戶端的 HTTP GET 請求。以下為具體解決方法:
方法一 使用POST請求來調用控制器,從而獲取JSON數據
原來發送ajax請求的前台JS代碼如下:
/*可以看到type 設置的是GET請求*/ $.ajax({ type:'GET', url: '/Home/AjaxGetJsonData', success: function (data) { alert(data); }, error: function (error) { alert(error.responseText); } });
或者
$.get('/Home/AjaxGetJsonData', null, function (data) { alert(data); });
那么我們只要將代碼更改為下面兩種任意一種就可以了:
/*這里更改了ajax的參數 type 為POST ,發送POST請求就不會報錯了*/ $.ajax({ type: 'POST', url: '/Home/AjaxGetJsonData', success: function (data) { alert(data); }, error: function (error) { alert(error.responseText); } });
或者
/*也可以直接使用$.post方法進行ajax調用*/ $.post('/Home/AjaxGetJsonData', null, function (data) { alert(data); });
方法二 在控制器返回的JSON結果對象里,設置JsonRequestBehavior.AllowGet(允許來自客戶端的 HTTP GET 請求)
原來控制器中的代碼如下:
public ActionResult AjaxGetJsonData() { string strData = "測試數據"; return Json(strData); }
更改后的代碼如下 :
public ActionResult AjaxGetJsonData() { string strData = "測試數據"; //這里我們設置了第二個參數JsonRequestBehavior為AllowGet return Json(strData,JsonRequestBehavior.AllowGet); }
我們可以看到在最后return Json(list, JsonRequestBehavior.AllowGet)中增加了第二個參數JsonRequestBehavior.AllowGet,默認是JsonRequestBehavior.DenyGet。之所以我們要在這里設置允許HTTP GET請求,是因為ASP.NET MVC為了預防一個網站信息泄漏的漏洞,所以默認是禁止客戶端的HTTP GET 請求的。這是一個很出名的漏洞,名字是:JSON 劫持漏洞,所以我建議AJAX還是使用POST請求來獲取數據,防止重要的信息被惡意攻擊者竊取。
這里是MSDN文檔的具體說明:允許 GET 請求可能會導致用戶在某一網站中仍處於已登錄狀態時訪問另一個網站。 這可能會生成導致信息泄漏的安全漏洞。有關此漏洞的信息,請參見 Phil Haack 的博客上的文章 JSON Hijacking,文章是英文的,我已經翻譯,點擊此鏈接:JSON劫持漏洞(詳細講解利用JSON從而進行數據劫持的漏洞攻防策略),另外還可以查看這篇文章:JSON劫持漏洞分析和攻防演練。