• MVC中使用[ValidateAntiForgeryToken]防止CSRF 注入攻击


    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。通俗的理解就是

    攻击者盗用了你的身份,以你的名义发送恶意请求。

    CSRF能够以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

    CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI......而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。

    CSRF的攻击原理请移步http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html说的非常的详细清楚。

    防范XSRF的方法:

    1、在Html表单里面使用了@Html.AntiForgeryToken()就可以阻止CSRF攻击。

    2、相应的我们要在Controller中也要加入[ValidateAntiForgeryToken]过滤特性。该特性表示检测服务器请求是否被篡改。注意:该特性只能用于post请求,get请求无效。

    3、至于JS,我们的项目中引用的是<script src="~/Content/js/jqueryToken.js" type="text/JavaScript"></script>

    在JS时要使用: $.ajaxAntiForgery才行,
    如:
     $.ajaxAntiForgery({
                type: "post",
                data: { GroupName: $("#GroupName").val(), GroupPhones: $("#GroupPhones").val() },
                dataType: "json",
                url: "/Event/Mass/AddGroup",
                success: function (data) {
                    if (data) {

                        alert("添加成功 ");
                     
                    }
                    else {
                        alert("添加失败 ");
                    }
             }
     })

    注:对数据进行增删改时要防止csrf攻击!

    附:jqueryToken的代码

    复制代码
    (function ($) {
        $.getAntiForgeryToken = function (tokenWindow, appPath) {
            // HtmlHelper.AntiForgeryToken() must be invoked to print the token.
            tokenWindow = tokenWindow && typeof tokenWindow === typeof window ? tokenWindow : window;
    
            appPath = appPath && typeof appPath === "string" ? "_" + appPath.toString() : "";
            // The name attribute is either __RequestVerificationToken,
            // or __RequestVerificationToken_{appPath}.
            var tokenName = "__RequestVerificationToken" + appPath;
            var inputElements = tokenWindow.document.getElementsByTagName("input");
            for (var i = 0; i < inputElements.length; i++) {
                var inputElement = inputElements[i];
                if (inputElement.type === "hidden" && inputElement.name === tokenName) {
                    return {
                        name: tokenName,
                        value: inputElement.value
                    };
                }
            }
        };
    
        $.appendAntiForgeryToken = function (data, token) {
            // Converts data if not already a string.
            if (data && typeof data !== "string") {
                data = $.param(data);
            }
    
            // Gets token from current window by default.
            token = token ? token : $.getAntiForgeryToken(); // $.getAntiForgeryToken(window).
    
            data = data ? data + "&" : "";
            // If token exists, appends {token.name}={token.value} to data.
            return token ? data + encodeURIComponent(token.name) + "=" + encodeURIComponent(token.value) : data;
        };
    
        // Wraps $.post(url, data, callback, type) for most common scenarios.
        $.postAntiForgery = function (url, data, callback, type) {
            return $.post(url, $.appendAntiForgeryToken(data), callback, type);
        };
    
        // Wraps $.ajax(settings).
        $.ajaxAntiForgery = function (settings) {
            // Supports more options than $.ajax(): 
            // settings.token, settings.tokenWindow, settings.appPath.
            var token = settings.token ? settings.token : $.getAntiForgeryToken(settings.tokenWindow, settings.appPath);
            settings.data = $.appendAntiForgeryToken(settings.data, token);
            return $.ajax(settings);
        };
    })(jQuery);
    复制代码
  • 相关阅读:
    Android Studio安装与配置
    T-SQL:qualify和window 使用(十七)
    《c#图解教程》
    c# 创建,加载,修改XML文档
    c# 使用迭代器来创建可枚举类型
    C#上手练习3(while、do while语句)(添加机器人聊天)
    C#上手练习2(FOR语句)
    C#上手练习1(if语句、Swich语句)
    解决java导入project出现红叉
    ABAP ALV显示前排序合并及布局显示
  • 原文地址:https://www.cnblogs.com/Alex80/p/7051309.html
Copyright © 2020-2023  润新知