【问题标题】:How does AntiForgeryToken work?AntiForgeryToken 是如何工作的?
【发布时间】:2012-07-28 03:48:27
【问题描述】:

我正在对我的 .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?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我得到了问题 2 的答案,因为浏览器 cookie 还维护 __RequestVerificationToken 所以虽然我从网页复制了 __RequestVerificationToken ,但异常类型化了。前2段+1,谢谢。期待 Q1 的答案,我的方法是否正确?或者我必须做更多的事情。
    • @d.Siva。如果该值是动态的(尝试在不同的浏览器中访问该页面)并正确检查,那么是的,它应该可以工作。
    • 我在 chrome 中进行了测试,即 firefox 及其工作,我认为这种方法是正确的。我接受了这个答案。
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2021-11-04
    • 2016-02-14
    • 2015-07-21
    • 2017-07-24
    相关资源
    最近更新 更多