AntiForgeryToken如何运作?

时间:2012-07-30 13:00:34

标签: security asp.net-mvc-2 xss antiforgerytoken

我将安全性应用于我的.net 3.5 mvc2 Web应用程序。 我的网站不包含任何用户身份验证,并且包含许多.js文件中的ajax调用

在我写的.aspx文件中

<%= Html.AntiForgeryToken() %>   

在我的.js文件函数中我写了

$(document).ready(function() {

var token = $('input[name=__RequestVerificationToken]').val();

    $.ajax({
    url: "/Home/getCurrentLanguage/" + Math.random(),
        cache: false,
        type: "POST",
        async: false,
        data: {"__RequestVerificationToken":token},
        success: function(data) {
            if (data == "mr") {
                alert("its Marathi");
            } else {
                alert("its English huh !!!");
            }
            return false;
        },
        error: function(data) {
            alert("some Error" + data);
        }
    });

});

在我的控制器中我写了

    [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken]
    public JsonResult getCurrentLanguage(string id)
    {
        return new JsonResult
        {
            Data = "mr"
        };

    }

这对我来说很好, 但我有2个问题 Q1。这是正确的方法吗? 如果我看到页面源代码,我发现了这段代码

<input name="__RequestVerificationToken" type="hidden" value="WFd+q5Mz0K4RHP7zrz+gsloXpr8ju8taxPJmrLO7kbPVYST9zzJZenNHBZqgamPE1KESEj5R0PbNA2c64o83Ao8w8z5JzwCo3zJKOKEQQHg8qSzClLdbkSIkAbfCF5R6BnT8gA==" /> 

但是当我创建外部html文件并复制__RequestVerificationToken的这个值并传入ajax调用时,我收到此错误
     未提供所需的防伪令牌或无效。 然后
Q2。运行时如何知道此页面提供了复制的__RequestVerificationToken?

1 个答案:

答案 0 :(得分:2)

这个“AntiForgeryToken”用于防止Cross-Site Request Forgery攻击。如果您的应用程序遭受跨站点脚本攻击漏洞,则攻击者可能会破坏此系统。

此令牌可防止CSRF攻击,因为由于same-origin policy攻击者可以发送请求但他无法从页面读取令牌以使请求成功(除非他有xss漏洞)。

对于Q2,此值必须是每个用户唯一的,因此每次加载页面时都会更新。如果它只是一个静态值,那么它在停止CSRF时无用,因为攻击者会知道这个静态值。