一、CSRF介绍

1.CSRF是什么?

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

2.CSRF可以做什么?

你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

3.CSRF漏洞现状

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

4.CSRF的原理

从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

  1.登录受信任网站A,并在本地生成Cookie。

  2.在不登出A的情况下,访问危险网站B。

  看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:

  1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。

  2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了......)

  3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

二、ASP.NETCORE MVC 防CSRF

前端采用的是 elmentui+vue.js

1.前端html:

@{
Layout = null;
}
<link href="~/lib/element-ui/theme-chalk/index.css" rel="stylesheet" />
<link href="~/css/common.css" rel="stylesheet" />
<style>
.el-header {
background-color: aliceblue;
color: lightcyan;
line-height: 800px;
}
</style>
@Html.AntiForgeryToken()
<!--
mvc前端页面加上 @Html.AntiForgeryToken() 方法,这个方法会生成一个隐藏域 <input name="__RequestVerificationToken" type="hidden" value="7FTM...sdLr1" />,
原理请查看本文后面的说明。
-->
<div id="app">
<el-form :model="addForm.data" status-icon :rules="addRules" ref="addData" label-width="100px" class="demo-ruleForm">
<el-form-item label="账号" prop="account">
<el-input style="width:300px" v-model="addData.account"></el-input>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input style="width:300px" v-model="addData.name"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input style="width:300px" type="password" v-model="addData.password" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="checkpassword">
<el-input style="width:300px" type="password" v-model="addData.checkpassword" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="是否启用" prop="isEnabled">
<el-switch v-model="addData.isEnabled"></el-switch>
</el-form-item>
<el-form-item>
<el-button type="primary" @@click="saveData('addForm')">保存</el-button>
<el-button @@click="resetForm('addForm')">重置</el-button>
</el-form-item>
</el-form>
</div>

2.前端JS脚本:

new Vue({
el: "#app",
data:{
//新增表单数据
addData: {
  account: '',
  name: '',
  password: '',
  checkpassword: '',
  isEnabled: false,
},
token:"",
},
//挂在模板之后调用
   mounted() {
  //获取防 CSRF 攻击token
  this.token = document.getElementsByName("__RequestVerificationToken")[0].value;
   },
    methods:{
saveData:function(){
var data = new FormData();
}
},
saveData: function (formName) {
      var data = new FormData();
data.append("__RequestVerificationToken", this.token);//需要通过 FormData表单来传递 @Html.AntiForgeryToken()
data.append("account", this.addData.account);
data.append("name", this.addData.name);
data.append("password", this.addData.password);
data.append("checkpassword", this.addData.checkpassword);
data.append("isEnabled", this.addData.isEnabled);
var url = "/UserManagement/AddUser";
axios.post(url, data).then(response => { //必须使用 post请求
var data = response.data;
//todu-----------
}).catch(() => {
//todu--------
});
     }
})

3.后台代码拦截:

//[AutoValidateAntiforgeryToken]  会拦截 前端传递过来的token,并进行比对,比对通过,则允许访问,否则不允许。
//AutoValidateAntiforgeryToken 只对 httppost请求生效,因此必须将action 限定为httppost请求
[HttpPost]
[AutoValidateAntiforgeryToken]
public async Task<ResultDTO> AddUser(UserAddDTO dto)
{
if (!ModelState.IsValid)
throw new KMException("请按要求填写数据");
return await _userInfoBLL.AddUser(dto, UserAccount);
}

@Html.AntiForgeryToken() 防CSRF说明:

1.在CSHtml 页面中,@Html.AntiForgeryToken() 方法会生成 一个隐藏域  <input name="__RequestVerificationToken" type="hidden" value="7FTM...sdLr1" />

2.前端JS里,将获取到的CSHtml 隐藏域 的token,通过表单FormData 传递给 后台 Action(注意,只能通过FormData来传递,而且必须使用post请求)

3.后台 Action 的 [AutoValidateAntiforgeryToken] 属性,会拦截前端传递过来的 token,并进行比对,通过则允许访问,否则不允许。注意,AutoValidateAntiforgeryToken 只对 httppost请求生效,因此必须将action 限定为httppost请求

本文参考:https://blog.csdn.net/sunstar8921/article/details/81974071

asp.netcore mvc 防CSRF攻击,原理介绍+代码演示+详细讲解的更多相关文章

  1. ASP.NET MVC 防止CSRF攻击

    简介 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cr ...

  2. .NET MVC中的防CSRF攻击

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  3. 保护ASP.NET 应用免受 CSRF 攻击

    CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/ ...

  4. ASP.NET MVC防范CSRF最佳实践

    XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...

  5. ASP.NETCORE MVC模块化

    ASP.NETCORE MVC模块化编程 前言 记得上一篇博客中跟大家分享的是基于ASP.NETMVC5,实际也就是基于NETFRAMEWORK平台实现的这么一个轻量级插件式框架.那么今天我主要分享的 ...

  6. 网络XSS攻击和CSRF攻击原理及防范

    网络XSS攻击和CSRF攻击原理及防范 原文地址:http://www.freebuf.com/articles/web/39234.html 随着Web2.0.社交网络.微博等等一系列新型的互联网产 ...

  7. 风炫安全web安全学习第二十八节课 CSRF攻击原理

    风炫安全web安全学习第二十八节课 CSRF攻击原理 CSRF 简介 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或 ...

  8. CSRF 攻击原理和防御方法

    1. CSRF攻击原理 CSRF(Cross site request forgery),即跨站请求伪造.我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息 ...

  9. CSRF攻击原理及防御

    一.CSRF攻击原理 CSRF是什么呢?CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性.想要深入理解CSRF的攻击特性我们有必要 ...

随机推荐

  1. 【测试工具】这些APP实用测试工具,不知道你就out了!

    本期,我将给大家介绍14款实用的测试工具,希望能够帮到大家!(建议收藏) UI自动化测试工具 1. uiautomator2 Github地址:https://github.com/openatx/u ...

  2. “我放弃了年薪20W的offer......”

    我的职业生涯开始和大多数测试人一样,开始接触都是纯功能界面测试.那时候在一家电商公司做测试,做了有一段时间,熟悉产品的业务流程以及熟练测试工作流程规范之后,效率提高了,工作比较轻松,也得到了更好的机会 ...

  3. OSCP Learning Notes - Post Exploitation(4)

    Pivoting 1. Edit the virtual network settings of the Vmware. 2. Set the Network Adapter(s) of Kali L ...

  4. 从连接器组件看Tomcat的线程模型——NIO模式

    Tomcat8之后,针对Http协议默认使用org.apache.coyote.http11.Http11NioProtocol,也就是NIO模式.通过之前的博客分析,我们知道Connector组件在 ...

  5. Python虚拟环境(virtualenv)

    python虚拟环境 虚拟环境:一个独立的可以运行的python执行环境,可以创建多个,且相互之间互不影响 使用virtualenv库 pip install virtualenv 用法 # 创建虚拟 ...

  6. 最小割树(Gomory-Hu Tree)

    当我们遇到这样的问题: 给定一个 \(n\) 个点 \(m\) 条边的无向连通图,多次询问两点之间的最小割 我们通常要用到最小割树. 博客 建树 分治.记录当前点集,然后随便找俩点当 \(s\) 和 ...

  7. JMS资源文件下载列表

    网关程序(Gateway) https://files.cnblogs.com/files/IWings/Gateway.zip 网关裁判程序(GatewayReferee) https://file ...

  8. python-闭包和装饰器-02-装饰器(decorator)

    装饰器(decorator) 理解了上一章的闭包之后,装饰器就是闭包的一种应用,只是外部函数的参数传入的不是普通的变量类型,而是传入一个函数名.装饰器一般用于:不修改被装饰函数(即外部函数传入的参数) ...

  9. Mybatis(三)动态sql语句

    动态sql语句操作 1.MyBatis中#{ }和${ }的区别 在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析.mybatis 为我们提供了两种支 ...

  10. SQL语法入门

    SQL语句概述 ·SQL定义:是一种特定目的编程语言,用于管理关系数据库 ·GaussDB T是一种关系数据库,SQL语句包括 1.DDL 数据定义语言,用于定义或修改数据库中的对象(表,视图,序列, ...