CSRF的原理与防御 | 你想不想来一次CSRF攻击?
CSRF是Cross Site Request Forgery的缩写,中文翻译过来是跨站请求伪造。这个漏洞往往能给用户带来巨大的损失,CSRF在等保安全检测中,也是一个非常重要的检测项。但是在我们的网站中,大部分都没有做CSRF的防御,小伙伴们想不想来一次CSRF攻击,体验一下做黑客感觉?如果想要做黑客,可要仔细的往下看哟~
CSRF攻击的原理
要想理解CSRF攻击的原理,我们从一个经典的案例出发,看看它是如何进行攻击的。假设你的银行网站的域名是www.a-bank.com,这个银行网站提供了一个转账的功能,在这个功能页面中,有一个表单,表单中有两个输入框,一个是转账金额,另一个是对方账号,还有一个提交按钮。当你登录了你的银行网站,输入转账金额,对方账号,点击提交按钮,就会进行转账。
当然,现在的银行网站不会有这么简单的转账操作了,我们在这里只是举一个简单的例子,让大家明白CSRF的原理。咱们可以发散思维,联想到其他类似的操作。
这个转账的表单项,如下所示:
<form method="post" action="/transfer">
<input type="text" name="amount"/>
<input type="text" name="account"/>
<input type="submit" value="Transfer"/>
</form>
当我们输入金额和账号,点击提交按钮,表单就会提交,给后端的银行网站服务发送请求。请求的内容如下:
POST /transfer HTTP/1.1
Host: www.a-bank.com
Cookie: JSESSIONID=randomid
Content-Type: application/x-www-form-urlencoded
amount=100.00&account=9876
请求成功后,你输入的转账金额100元,将转账到9876这个账户当中。假如你完成转账操作后,并没有退出登录,而是访问了一个恶意网站,这时,你的银行网站www.a-bank.com还是处于登录状态,而这个恶意网站中,出现了一个带有”赢钱“字样的按钮,这个”赢钱“字样的按钮后面是一个form表单,表单如下:
<form method="post" action="https://www.a-bank.com/transfer">
<input type="hidden" name="amount" value="100.00"/>
<input type="hidden" name="account" value="黑客的银行账户"/>
<input type="submit" value="赢钱!"/>
</form>
我们可以看到这个表单中,金额和账户都是隐藏的,在网页上只看到了一个赢钱按钮。这时,你忍不住冲动,点了一个”赢钱“按钮,这时,将会发生什么操作呢?我们仔细看一下上面表单中的action写的是什么?action写的是你的银行网站的转账请求接口。你点了一下赢钱按钮,在这个不正规的网站中,将会发送https://www.a-bank.com/transfer这个请求,在发送这个请求的时候,会自动带上www.a-bank.com的cookie,不要问我为什么是这样,这是浏览器的标准,标准就是这样规定的。银行后台接到这个请求后,首先要判断用户是否登录,由于携带了cookie,是登录的,会继续执行后面的转账流程,最后转账成功。你点了一下”赢钱“按钮,自己没有赚到钱,而是给黑客转账了100元。
这就是CSRF攻击的原理,在其他的网站向你的网站发送请求,如果你的网站中的用户没有退出登录,而发送的请求又是一些敏感的操作请求,比如:转账,那么将会给你的网站的用户带来巨大的损失。
CSRF的防御
我们知道了CSRF攻击的原理,就可以做针对性的防御了。CSRF的防御可以从两个方面考虑,一个是后台接口层做防御;另一个则是在前端做防御,这种不同源的请求,不可以带cookie。
后端防御CSRF
我们先聊聊后端的防御,后端防御主要是区分哪些请求是恶意请求,哪些请求是自己网站的请求。区分恶意请求的方式有很多,在这里给大家介绍两种吧。
第一种,CSRF Token的方式。这种方式是在表单页面生成一个随机数,这个随机数一定要后端生成,并且对这个随机数进行存储。在前端页面中,对这个Token表单项进行隐藏。代码如下:
<form method="post" action="/transfer">
<input type="hidden" name="_csrf" value="4bfd1575-3ad1-4d21-96c7-4ef2d9f86721"/>
<input type="text" name="amount"/>
<input type="hidden" name="account"/>
<input type="submit" value="Transfer"/>
</form>
_csrf就是CSRF Token。我们看到他的value是一个UUID,这个UUID是后台生成的。当用户点击转账按钮时,会给银行的后台发送请求,请求中包含_csrf参数,如下:
POST /transfer HTTP/1.1
Host: www.a-bank.com
Cookie: JSESSIONID=randomid
Content-Type: application/x-www-form-urlencoded
amount=100.00&account=9876&_csrf=4bfd1575-3ad1-4d21-96c7-4ef2d9f86721
银行后台接收到这个请求后,判断_csrf的值是否存在,如果存在则是自己网站的请求,进行后续的流程;如果不存在,则是恶意网站的请求,直接忽略。
第二种,通过请求头中的referer字段判断请求的来源。每一个发送给后端的请求,在请求头中都会包含一个referer字段,这个字段标识着请求的来源。如果请求是从银行网站发出的,这个字段会是银行网站转账页的链接,比如:https://www.a-bank.com/transfer-view;如果是从恶意网站发出的,那么referer字段一定不会是银行网站。我们在做后端防御时,可以先取出每个请求的请求头中的referer字段,判断是不是以自己网站的域名开头,在咱们的示例中,如果referer字段是以https://www.a-bank.com/开头的,则继续执行转账操作;如果不是,则直接忽略掉这个请求。
以上就是后端防御CSRF攻击的两种方式,都需要在后端做特殊的处理。当然也可以在前端做处理,怎么做呢?我们接着往下看。
前端防御CSRF
既然CSRF攻击的危害这么大,为什么不能在前端禁止这种请求呢?各大浏览器厂商似乎也注意到了这个问题,谷歌提出了same-site cookies概念,same-site cookies 是基于 Chrome 和 Mozilla 开发者花了三年多时间制定的 IETF 标准。它是在原有的Cookie中,新添加了一个SameSite属性,它标识着在非同源的请求中,是否可以带上Cookie,它可以设置为3个值,分别为:
- Strict
- Lax
- None
Cookie中的内容为:
POST /transfer HTTP/1.1
Host: www.a-bank.com
Cookie: JSESSIONID=randomid;SameSite=Strict;
Strict是最严格的,它完全禁止在跨站情况下,发送Cookie。只有在自己的网站内部发送请求,才会带上Cookie。不过这个规则过于严格,会影响用户的体验。比如在一个网站中有一个链接,这个链接连接到了GitHub上,由于SameSite设置为Strict,跳转到GitHub后,GitHub总是未登录状态。
Lax的规则稍稍放宽了些,大部分跨站的请求也不会带上Cookie,但是一些导航的Get请求会带上Cookie,如下:
| 请求类型 | 示例 | Lax情况 |
|---|---|---|
| 链接 | <a href="..."></a> |
发送 Cookie |
| 预加载 | <link rel="prerender" href="..."/> |
发送 Cookie |
| GET 表单 | <form method="GET" action="..."> |
发送 Cookie |
| POST 表单 | <form method="POST" action="..."> |
不发送 |
| iframe | <iframe src="..."></iframe> |
不发送 |
| AJAX | $.get("...") |
不发送 |
| Image | <img src="..."> |
不发送 |
上面的表格就是SameSite设置为Lax的时候,Cookie的发送情况。
None就是关闭SameSite属性,所有的情况下都发送Cookie。不过SameSite设置None,还要同时设置Cookie的Secure属性,否则是不生效的。
以上就是在前端通过Cookie的SameSite属性防御CSRF攻击,不过大家在使用SameSite属性时,要注意浏览器是否支持SameSite属性。
总结
到这里CSRF的攻和防都已经介绍完了,大部分网站都是没有做CSRF防御的,小伙伴们有没有想当黑客的瘾,找几个网站搞一下试试吧~~

CSRF的原理与防御 | 你想不想来一次CSRF攻击?的更多相关文章
- CSRF攻击原理及防御
一.CSRF攻击原理 CSRF是什么呢?CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性.想要深入理解CSRF的攻击特性我们有必要 ...
- CSRF攻击原理以及防御
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...
- CSRF 攻击原理和防御方法
1. CSRF攻击原理 CSRF(Cross site request forgery),即跨站请求伪造.我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息 ...
- CSRF原理及防御
CSRF原理及防御 CSRF攻击原理 CSRF攻击利用网站对用户的信任,以用户的身份发送请求来执行攻击者所要的操作,比如:转账.发邮件.修改密码.添加用户等. CSRF和XSS一样危害都特别大,只不过 ...
- CSRF攻击原理以及防御方法(写的很好)
转载地址:http://www.phpddt.com/reprint/csrf.html CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟 ...
- CSRF漏洞原理浅谈
CSRF漏洞原理浅谈 By : Mirror王宇阳 E-mail : mirrorwangyuyang@gmail.com 笔者并未深挖过CSRF,内容居多是参考<Web安全深度剖析>.& ...
- 10分钟浅谈CSRF突破原理,Web安全的第一防线!
CSRF攻击即跨站请求伪造(跨站点请求伪造),是一种对网站的恶意利用,听起来似乎与XSS跨站脚本攻击有点相似,但实际上彼此相差很大,XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户 ...
- 《前端之路》 之 前端 安全 XSS 原理以及防御手段
什么是 XSS 一.XSS 什么是 XSS XSS,即 Cross Site Script , 翻译过来就是 跨站脚本攻击:为了和 css 有所区分,因而在安全领域被称为 XSS. 什么是 XSS 攻 ...
- 用代码来细说Csrf漏洞危害以及防御
开头: 废话不多说,直接进主题. 0x01 CSRF介绍:CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session ...
随机推荐
- Tomcat性能调优实战
今日帮朋友做了tomcat性能调优的实际操作,心得记录一下. 服务器:Windows2017 配置:CPU 4 内存 8G Tomcat8.0+版本. 压力测试工具:apache-jmeter-4.0 ...
- 2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11
2019天猫双11 成交额2684亿! "不是任何一朵云都能撑住这个流量.中国有两朵云,一朵是阿里云,一朵叫其他云."11月11日晚,阿里巴巴集团CTO张建锋表示,"阿里 ...
- Java性能分析神器--VisualVM Launcher[1]
Java性能分析神器1--VisualVM Launcher VisualVM 当你日复一日敲代码的时候,当你把各种各样的框架集成到一起的时候,看着大功告成成功运行的日志,有没有那么一丝丝迷茫和惆怅: ...
- H5+app -- 自动更新
一.最近做了一个app自动更新功能,用的基本都是网上找得到的. 1.h5+ 规范 : http://www.html5plus.org/doc/zh_cn/maps.html 2.环形进度条插件:h ...
- 小白学 Python(23):Excel 基础操作(上)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- [综合] ISE的综合结果
1.count2 == 7‘d12,会被综合成下面这个样子, 7‘d12就是左边下面这根绿线,等于符号在中间的圆圈里. 2.什么线都不点的时候,也就什么也没被选中, 而一旦我点击了某根线,却发现图里到 ...
- [Xilinx笔记] 《FPGA伴你玩转USB3.0与LVDS》 读书笔记
2019年10月15日09:31:10 第一部分·哪些要看(优先级由高到低) 0.8.1 LVDS数据收发实例 8.2 带CRC校验的LVDS数据收发实例 1.3.6 USB3.0 控制器 ...
- nyoj 833-取石子(七) (摆成一圈,取相邻)
833-取石子(七) 内存限制:64MB 时间限制:1000ms 特判: No 通过数:16 提交数:32 难度:1 题目描述: Yougth和Hrdv玩一个游戏,拿出n个石子摆成一圈,Yougth和 ...
- Linux系统时间\硬件时间(date、tzselect、clock、hwclock、ntpdate)
1.系统时间和硬件时间 在Linux中有硬件时钟与系统时钟两种时钟.硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟.系统时钟则是指kernel中的时钟.所有Linux相关指令与函 ...
- 优秀的github项目学习
优秀的github项目学习 后期会陆续添加遇到的优秀项目 https://github.com/chaijunkun