asp.netcore mvc 防CSRF攻击,原理介绍+代码演示+详细讲解
一、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攻击,原理介绍+代码演示+详细讲解的更多相关文章
- ASP.NET MVC 防止CSRF攻击
简介 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cr ...
- .NET MVC中的防CSRF攻击
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...
- 保护ASP.NET 应用免受 CSRF 攻击
CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/ ...
- ASP.NET MVC防范CSRF最佳实践
XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...
- ASP.NETCORE MVC模块化
ASP.NETCORE MVC模块化编程 前言 记得上一篇博客中跟大家分享的是基于ASP.NETMVC5,实际也就是基于NETFRAMEWORK平台实现的这么一个轻量级插件式框架.那么今天我主要分享的 ...
- 网络XSS攻击和CSRF攻击原理及防范
网络XSS攻击和CSRF攻击原理及防范 原文地址:http://www.freebuf.com/articles/web/39234.html 随着Web2.0.社交网络.微博等等一系列新型的互联网产 ...
- 风炫安全web安全学习第二十八节课 CSRF攻击原理
风炫安全web安全学习第二十八节课 CSRF攻击原理 CSRF 简介 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或 ...
- CSRF 攻击原理和防御方法
1. CSRF攻击原理 CSRF(Cross site request forgery),即跨站请求伪造.我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息 ...
- CSRF攻击原理及防御
一.CSRF攻击原理 CSRF是什么呢?CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性.想要深入理解CSRF的攻击特性我们有必要 ...
随机推荐
- 【面试题资源共享】一文总结最高频软件测试|sq|语句|思维发散|计算机基础|Linux|测试用例|接口测试|等技术面试题
思维发散 1.一个球, -把尺子长度是球直径的2/3,怎样测出半径?2.四枚硬币,花面朝上,每次翻转三个,几次可以将四枚硬币变为字面朝上?3. U2合唱团在1 7分钟内赶到演唱会现场问题?4.小明一家 ...
- 写verilog程序需要注意的地方
1.在always块语句中一定要注意if-else if-else if-else的判断条件的顺序. 2.同一个寄存器信号只能在同一个always or initial 块中进行赋值. 3.在控制一个 ...
- XML转Bean
XML转Bean有很多方式,我使用的是xtream方式实现xml与bean的互转. 下面是简单的xml转bean /** * XML转换成bean * @param obj * @return yuy ...
- C#串模板
c# 6.0 的语言特性,功能类似string.formate,更方便的地方在于不要像format一样使用索引,可以直接使用变量. 使用方法如下: string name = "zhangs ...
- GridMask:一种数据增强方法
GridMask Data Augmentation, ARXIV 2020 代码地址:https://github.com/akuxcw/GridMask 这篇论文提出了一种简单的数据增强方法,在图 ...
- 大家是怎么做APP接口的版本控制的?欢迎进来看看我的方案。升级版的Versioning
背景 APP不同于网站,网站程序一发版,所有用户看到的都是最新的页面.调用最新的接口,没有新老版本一说.APP一旦下载到用户手机上,用户不更新你拿他一点办法都没有,但是随着业务的调整,同一个接口的请求 ...
- 萌新学渗透系列之Hack The Box_Legacy
我将我的walkthrough过程用视频解说的形式记载 视频地址https://www.bilibili.com/video/BV1mZ4y1u7jG 一是因为看我视频的后来者应该都是刚入门的新手,视 ...
- react 阻止事件传递/冒泡
当我们设计界面时,在以下情况会需要阻止元素/组件内的事件阻断,不被上层触发: 弹出提示框,期望点击框外空白区域可以关闭弹框.点击框内不关闭弹框 组件设计时,期望点击全局/点击指定元素时,显示不一样的交 ...
- 保姆级教程,如何发现 GitHub 上的优质项目?
先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章. ...
- Servlet容器启动过程
参考:https://blog.csdn.net/fredaq/article/details/9366043 一.概念 所谓Servlet容器其实说白了是符合Servlet规范的Java web容器 ...