一.CSRF是什么?

  CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。它跟XSS(XSS又叫CSS:Cross-Site-Script)攻击不同,XSS一般是利用站内信任的用户在网站内插入恶意的脚本代码进行攻击,而CSRF则是伪造成受信任用户对网站进行攻击,攻击者能使用登陆用户的权限做一些该用户权限范围内的事。

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

二.CSRF的原理

  下图简单阐述了CSRF攻击的思想:

  

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

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

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

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

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

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

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

三、.Net MVC中提供的防跨CSRF攻击的方法

一个简单的栗子:

  我们在登陆了网站A时,没有退出的情况下点击链接访问了网站B的如下页面(同源和不同源都可以,但是攻击者使用ajax则会受到同源限制),那么Id为1的账号就会被改掉密码和用户名,完成了简单的盗号。为什么 /Admins/UserInfo/EditUserInfo 只有登陆用户能够访问和操作,而攻击者没有用户的账号密码也完成了修改用户信息呢?这是因为网站A只通过Cookie(Session也是基于Cookie的)来记住用户。当发起一个对网站A的请求时,浏览器只负责找到网站A的Cookie,把Cookie一并发给网站A的服务器,服务器根据Cookie的SessionId获取用户信息,顺利验证成功,就有修改用户密码的权限了。

@{
ViewBag.Title = "DoSomeSthingBad";
}
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<h2>你中招了哦~</h2>
<form action="http://localhost:1911/Admins/UserInfo/EditUserInfo" method="post">
<input type="text" name="Id" value="1" />
<input type="text" name="UserName" value="testhk" />
<input type="text" name="Account" value="testhk" />
<input type="text" name="UserPass" value="456456" />
<button id="attack" type="submit">修改管理员</button>
</form>
<script>
var attact = document.querySelector('#attack');
attack.click();
</script>

在.net mvc中防CSRF攻击十分简单步骤如下:

第一步:在form表单中添加 :  @Html.AntiForgeryToken()

   Html.AntiForgeryToken()方法会在input和Cookie中分别生成一个名为__RequestVerificationToken的token

第二步:在后台对应的Action上边加  [ValidateAntiForgeryToken]

  这是一个验证过滤器,调用AntiForgery类的Validate方法,判断上边的两个token是否一致(不是相等),一致则通过。

第三步:把token发送到服务器

我们直接使用表单的submit时,会自动的将name为__RequestVerificationToken的input中的值直接提交,几乎不用添加任何操作,不再展示。下边时用普通ajax请求时将token发送到后台的方式:

var __RequestVerificationToken = $("input[name='__RequestVerificationToken']").val();
//layui中的用法,普通ajax中在ajax的data中新增一个字段即可
//如$.post(url,{Id:1,__RequestVerificationToken:__RequestVerificationToken},funtion(){..})
data.field.__RequestVerificationToken = __RequestVerificationToken;
$.post('@Url.Action("EditUserInfo")', data.field, function (result) {
if (result.IsSuccess === 1) {
layer.msg(result.Msg, {
icon: 1,
time: 1000
}, function () {
parent.layer.close(index);
parent.layui.table.reload('testReload'); //重载表格
});
} else {
layer.msg(result.Msg, {icon:2});
}
});

参考文献:

1.https://www.cnblogs.com/soundcode/p/4884260.html

2.https://blog.csdn.net/cpytiger/article/details/8781457

3.https://www.cnblogs.com/wangyuyu/p/3388169.html

.NET MVC中的防CSRF攻击的更多相关文章

  1. 记录一下自己在MVC项目中如何防CSRF攻击,直接上代码

    1.前端的处理: 2.后台 1.)添加过滤器,哪里用放哪里 2.)需要验证的方法上直接添加过滤器即可 大功告成 以下为过滤器代码块 /// <summary>/// ajax中加上Anti ...

  2. asp.netcore mvc 防CSRF攻击,原理介绍+代码演示+详细讲解

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

  3. 转:MVC Html.AntiForgeryToken() 防止CSRF攻击

    (一)MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site requ ...

  4. [转]MVC Html.AntiForgeryToken() 防止CSRF攻击

    [转]MVC Html.AntiForgeryToken() 防止CSRF攻击 本文转自:http://blog.csdn.net/luck901229/article/details/8261640 ...

  5. MVC Html.AntiForgeryToken() 防止CSRF攻击 - CSDN博客

    原文:MVC Html.AntiForgeryToken() 防止CSRF攻击 - CSDN博客 (一)MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.A ...

  6. [ASP.NET MVC]@Html.AntiForgeryToken() 防止CSRF攻击

    MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request ...

  7. MVC Html.AntiForgeryToken() 防止CSRF攻击

    转自:http://blog.csdn.net/cpytiger/article/details/8781457 一.MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(C ...

  8. 转载MVC Html.AntiForgeryToken() 防止CSRF攻击

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

  9. Spring mvc拦截器防御CSRF攻击

    CSRF(具体参考百度百科) CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSR ...

随机推荐

  1. 组件vue传值

    <div id="app"> <hs :message="name"></hs> 用来接收值 </div> &l ...

  2. ThreadLocal的使用场景及实现原理

    1. 什么是ThreadLocal? 线程局部变量(通常,ThreadLocal变量是private static修饰的,此时ThreadLocal变量相当于成为了线程内部的全局变量) 2. 使用场景 ...

  3. BZOJ5306 HAOI2018染色(容斥原理+NTT)

    容易想到枚举恰好出现S次的颜色有几种.如果固定至少有i种恰好出现S次,那么方案数是C(M,i)·C(N,i*S)·(M-i)N-i*S·(i*S)!/(S!)i,设为f(i). 于是考虑容斥,可得恰好 ...

  4. Hibernate事务以及一级缓存02

    一. Hibernate中的事务 1. 事务的回顾 1.1 什么是事务(Transaction)(面试重点) 是并发控制的单元,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的 ...

  5. 【刷题】BZOJ 2407 探险

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  6. 【AGC005F】Many Easy Problems (NTT)

    Description ​ 给你一棵\(~n~\)个点的树和一个整数\(~k~\).设为\(~S~\)为树上某些点的集合,定义\(~f(S)~\)为最小的包含\(~S~\)的联通子图的大小.\(~n~ ...

  7. BZOJ 4212: 神牛的养成计划

    4212: 神牛的养成计划 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 142  Solved: 30[Submit][Status][Discus ...

  8. [luogu4265][USACO18FEB]Snow Boots silver

    题目大意 求出最少需要丢去多少双靴子才能到达终点. 解法 解法一: 看到数据的范围,非常清楚\(O(n^3)\)能过掉所有的数据,那么我们就果断暴力. 解法二: 比较容易会想到用DP做,我一开始定义\ ...

  9. [NOIP提高组2018day2t1]旅行

    题目描述 给定n个城市,m条双向道路的图, 不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路.并且, 从任意一个城市出发,通过这些道路都可以到达任意一个其他城市.小 Y 只能通过 ...

  10. AutoCompleteTextView 简单用法 实现自定义list adapter

    网上有不少教程,那个提示框字符集都是事先写好的,例如用一个String[] 数组去包含了这些数据,但是,我们也可以吧用户输入的作为历史记录保存       下面先上我写的代码:import andro ...