在使用AJAX和Web API 2时了解CSRF

时间:2016-02-11 23:22:52

标签: jquery ajax asp.net-web-api csrf csrf-protection

所以这是我的问题:如何为Web API 2 Web服务的AJAX调用实现CSRF并验证它?如果客户端创建CSRF令牌:

// using jQuery
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

var csrftoken = getCookie('csrftoken');

AJAX在标题中发送它:

$.ajax({
    type: "POST",
    crossDomain: true,
    url: "http://dev-blahblah/newWS/PostData",
    beforeSend: function (xhrObj) {
        xhrObj.setRequestHeader("X-CSRFToken", getCookie("csrftoken"));
        xhrObj.setRequestHeader("Content-Type", "application/json");
    },
    data: {
        theID: "2135648792",
        empImg: "false"
    },
    dataType: "json",
    success: function (data) {
        console.log(data);
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        console.log(XMLHttpRequest);
    }
});

现在这一切都很好,但真正的问题是:服务器端如何知道它的合法CSRF令牌如果它从来不知道它是什么(因为它是创建客户端侧)?

对我而言,如果服务器端永远不知道在客户端创建了什么,并且实际上只查看是否在标头中发送了令牌,那么这似乎是浪费时间。当将信息传递给服务器时,有人只能在那里注入一个随机令牌,并且由于它不知道令牌实际应该是什么,因此服务器不会很好吗?

所以尽管如此,一个例子(在流程视图中)看起来像这样:

 -Web page loads up
  |--Button is clicked to fire off AJAX req.
     |--On the fly a token is created for the header.
        |--Header is sent to the server as a check to see if one is there.
           |--Regardless what the token value is, if the server sees it then its fine and continues.

再说一遍,也许我正在以不正确的方式看待这个问题,但我不认为这是一种安全的方式,可以看出是否有人想要破解网络服务。

0 个答案:

没有答案