天天看點

Html.AntiForgeryToken() 防止CSRF攻擊 的AJaX應用

有關Html.AntiForgeryToken()的使用其實網上的說明很多了,比如http://blog.csdn.net/cpytiger/article/details/8781457

Html.AntiForgeryToken() 防止CSRF攻擊 的AJaX應用

那麼我們寫的AJAX調用怎麼辦了,難道需要修改所有的ajax請求資料嗎?我個人比較懶惰喜歡寫一個通用的代碼.其實原理很簡單就是攔截ajax請求,然後追加自己的資料.注意在ajax傳輸資料的時候可以是String/object,是以這裡需要處理一下:

if (typeof data !== "string") {

data = $.param(data);

}

一般我們都是在ready方法中攔截指定方法:

var oldajax = $.ajax;
        $.ajax = function () {
            var len = arguments.length;
            for (var i = 0; i < len; i++) {
                var data = arguments[i].data;
                var type = $.trim(arguments[i].type);
                type = type.toLowerCase();
                if (data && type=="post") {
                    var tokenstr = $(document.getElementsByName("__RequestVerificationToken")).val();
                    if (typeof data !== "string") {
                        data = $.param(data);
                    }
                    data = data + "&__RequestVerificationToken=" + tokenstr;
                    arguments[i].data = data;
                }
            }
            oldajax.apply(null, arguments);
        }
           

全部的js code 如下:

$(function () {
        var oldajax = $.ajax;
        $.ajax = function () {
            var len = arguments.length;
            for (var i = 0; i < len; i++) {
                var data = arguments[i].data;
                var type = $.trim(arguments[i].type);
                type = type.toLowerCase();
                if (data && type=="post") {
                    var tokenstr = $(document.getElementsByName("__RequestVerificationToken")).val();
                    if (typeof data !== "string") {
                        data = $.param(data);
                    }
                    data = data + "&__RequestVerificationToken=" + tokenstr;
                    arguments[i].data = data;
                }
            }
            oldajax.apply(null, arguments);
        }

        $('#btn1').click(function () {
            $.ajax({
                type: "POST",
                url: "home/SecurityPost",
                // data: "name=John&location=Boston",
                data: { "name": "John", "location": "Boston" },
                success: function (msg) {
                    alert("Data Saved: " + msg);
                }
            });

        });


    });