CSRF跨站请求伪造
CSRF跨站请求伪造
每日更新前端基础,如果觉得不错,点个star吧 ? https://github.com/WindrunnerMax/EveryDay
跨站请求伪造通常缩写为CSRF
或者XSRF
,是一种挟制用户在当前已登录的Web
应用程序上执行非本意的操作的攻击方法。跟跨网站脚本XSS
相比,XSS
利用的是用户对指定网站的信任,CSRF
利用的是网站对用户浏览器的信任,浏览器对于同一domain
下所有请求会自动携带cookie
。
原理
- 用户A正常打开网站B,并且成功登录获取
cookie
- 用户A未退出网站B,在同一个浏览器中打开新的
TAB
访问了网站C - 网站C的页面存有一些攻击性的代码,会发出对于网站B的一个访问请求
- 浏览器收到请求后,在用户不知情的情况下携带
cookie
访问网站B,导致网站B以用户A的权限处理请求
实例
小明在某银行有存款,通过GET
表单请求http://bank.example/withdraw?uid=1&amount=100&for=2
就可以向账户2
转账100
,当对银行发起这个请求后,首先会验证cookie
是否有合法的session
才进行数据处理。
小黑近期无聊,就自己做了一个网站,利用某些标签允许跨域请求资源的策略,在自己的网站中构造<img src="http://bank.example/withdraw?uid=1&amount=100&for=2">
,并通过广告、游戏等方式诱导小明点击进入这个网站,此时浏览器会携带cookie
访问银行网站。在大部分情况下,这个请求并不会成功被执行,因为他并没有小明的认证信息,但是如果此时恰好小明刚刚访问了银行,此时服务端session
尚未过期,这个url
就会被正常响应,转账就会被执行。
防御
验证码
对于敏感操作加入验证码,强制用户与网站进行交互,能很好遏制CSRF
攻击。
避免使用GET
GET
接口太容易被拿来做CSRF
攻击,只要构造一个<img>
标签,而<img>
标签又是不能过滤的数据。接口最好限制为POST
使用,GET
则无效,降低攻击风险。当然强制POST
只是降低了风险,攻击者只要构造一个<form>
就可以,但需要在第三方页面做,这样就增加暴露的可能性。
检查Referer字段
HTTP
协议有一个Referer
字段,记录了该HTTP
请求的来源地址,浏览器限制其改动,最多将其设置为空rel="noreferrer"
,当然如果不是在浏览器中发起HTTP
请求是可以随意改动这个字段的。
同样以小黑的CSRF
攻击为例,假如小黑诱导小明的网站为www.black.com
,那么对于其构建的CSRF
攻击请求的Referer
为www.black.com
,而正常情况下应该为http://bank.example
域名开头的一个链接,检测其不正确或者为空即拒绝响应。
但是这种方法也有一定的局限性,某些旧版本的浏览器比如IE6
可以篡改Referer
字段,有些用户认为Referer
字段会侵犯他们的隐私,从而关闭了浏览器发送Referer
,正常访问网站会被误认为为CSRF
而拒绝响应。
加入Token验证字段
CSRF
攻击之所以能够成功,是因为浏览器自动携带cookie
进行请求,该请求中所有的用户验证信息都是存在于cookie
中,由此可以完全伪造用户的请求。要抵御CSRF
,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于cookie
之中。
在请求头中加入一个Token
字段,浏览器并不会自动携带Token
去请求,且Token
可以携带一段加密的jwt
用作身份认证,这样进行CSRF
的时候仅传递了cookie
,并不能表明用户身份,网站即拒绝攻击请求。
- 51Nod 1277 字符串中的最大值(KMP,裸题)
- Codeforces Round #345 (Div. 2)【A.模拟,B,暴力,C,STL,容斥原理】
- 07.移动先行之谁主沉浮----控件之轮流轰炸——布局类控件
- BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
- UVa 10341 - Solve It【经典二分,单调性求解】
- UVa 11461 - Square Numbers【数学,暴力】
- BZOJ 3097: Hash Killer I【构造题,思维题】
- Python Selenium设计模式-POM
- BZOJ 1207: [HNOI2004]打鼹鼠【妥妥的n^2爆搜,dp】
- HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)
- BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】
- BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
- 洛谷 P1019 单词接龙【经典DFS,温习搜索】
- MVCforum 支持多国语言
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 关于HashMap的一些理解
- SpringBoot2.x系列教程(六十一)Spring Boot集成FastDFS实现文件上传
- 解决对接华为kafka 进行Kerberos认证时的sun.security.krb5.KrbException
- Newbe.Claptrap 框架如何实现多级生命周期控制?
- Kafka linux(centos7)安装配置kerberos并在另一台机器上使用Java服务接收消息
- SpringCloud bus 手动post可用 使用webhooks自动更新配置失效的解决小记
- 处理Storm1.2.2 日志报错 与spring boot冲突
- Java 中的 ==, equals 与 hashCode 的区别与联系
- 专家精品|密码朋克的社会实验(三):比特币发明了什么
- 面试题答案
- Vue3 为何使用 Proxy 实现数据监听
- vivo 悟空活动中台 - H5 活动加载优化
- PostgreSQL常用命令
- 实用!一键生成数据库文档,堪称数据库界的Swagger
- 布隆过滤器原理