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

本文深入讲解了CSRF(跨站请求伪造)攻击的概念及其危害,包括个人隐私泄露和财产安全风险,并提供了具体的防御措施,如使用@Html.AntiForgeryToken()及$.ajaxAntiForgery等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
复制代码
在C# MVC中,要将数据写入API,通常会遵循以下步骤: 1. **创建控制器(Controller)**:首先,在ASP.NET MVC项目中,你需要创建一个控制器,比如`ProductsController`,它负责处理HTTP请求并操作业务逻辑。 ```csharp public class ProductsController : Controller { } ``` 2. **添加动作方法(Action Methods)**:为API添加处理特定HTTP动词(如GET、POST、PUT、DELETE等)的方法。例如,用于添加产品的POST方法: ```csharp [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([FromBody] Product product) { // 检查数据是否有效,然后保存到数据库 if (ModelState.IsValid) { _repository.Add(product); _repository.SaveChanges(); return Ok("Product added successfully."); } else { return BadRequest(ModelState); } } ``` 在这里,`[HttpPost]`表示这是一个HTTP POST请求,`[ValidateAntiForgeryToken]`用于防止跨站请求伪造(CSRF攻击。`[FromBody]`属性告诉框架应该从请求体解析JSON数据。 3. **模型绑定(Model Binding)**:`product`参数就是模型类`Product`的实例,需要在`Models`文件夹中定义它,并包含所需的数据属性。 4. **数据访问层(Repository)**:通过依赖注入或手动管理,创建一个`IRepository<Product>`接口的实现,用于操作数据库。`_repository.Add(product)`用于将产品添加到数据源。 5. **响应结果(Response)**:最后,根据操作结果返回适当的HTTP状态码和响应体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值