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

那么CSRF到底能够干嘛呢?你可以这样简单的理解:攻击者可以盗用你的登陆信息,以你的身份模拟发送各种请求。攻击者只要借助少许的社会工程学的诡计,例如通过QQ等聊天软件发送的链接(有些还伪装成短域名,用户无法分辨),攻击者就能迫使Web应用的用户去执行攻击者预设的操作。例如,当用户登录网络银行去查看其存款余额,在他没有退出时,就点击了一个QQ好友发来的链接,那么该用户银行帐户中的资金就有可能被转移到攻击者指定的帐户中。

所以遇到CSRF攻击时,将对终端用户的数据和操作指令构成严重的威胁;当受攻击的终端用户具有管理员帐户的时候,CSRF攻击将危及整个Web应用程序。

CSRF的原理

要完成一次CSRF攻击,受害者必须依次完成两个步骤 :

  • 1.登录受信任网站A,并在本地生成Cookie 。
  • 2.在不退出A的情况下,访问危险网站B。

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

  • 你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站,特别现在浏览器都是支持多tab的。
  • 你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。
  • 上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

因此对于用户来说很难避免在登陆一个网站之后不点击一些链接进行其他操作,所以随时可能成为CSRF的受害者。

CSRF攻击主要是因为Web的隐式身份验证机制,Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。

如何预防CSRF

过上面的介绍,读者是否觉得这种攻击很恐怖,意识到恐怖是个好事情,这样会促使你接着往下看如何改进和防止类似的漏洞出现。

CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。

服务端的预防CSRF攻击的方式方法有多种,但思想上都是差不多的,主要从以下2个方面入手:

  • 1、正确使用GET,POST和Cookie;
  • 2、在非GET请求中增加伪随机数;

我们上一章介绍过REST方式的Web应用,一般而言,普通的Web应用都是以GET、POST为主,还有一种请求是Cookie方式。我们一般都是按照如下方式设计应用:

1、GET常用在查看,列举,展示等不需要改变资源属性的时候;

2、POST常用在下达订单,改变一个资源的属性或者做其他一些事情;

接下来我就以Go语言来举例说明,如何限制对资源的访问方法:

mux.Get("/user/:uid", getuser)
mux.Post("/user/:uid", modifyuser)

这样处理后,因为我们限定了修改只能使用POST,当GET方式请求时就拒绝响应,所以上面图示中GET方式的CSRF攻击就可以防止了,但这样就能全部解决问题了吗?当然不是,因为POST也是可以模拟的。

因此我们需要实施第二步,在非GET方式的请求中增加随机数,这个大概有三种方式来进行:

  • 为每个用户生成一个唯一的cookie token,所有表单都包含同一个伪随机值,这种方案最简单,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败,但是由于用户的Cookie很容易由于网站的XSS漏洞而被盗取,所以这个方案必须要在没有XSS的情况下才安全。
  • 每个请求使用验证码,这个方案是完美的,因为要多次输入验证码,所以用户友好性很差,所以不适合实际运用。
  • 不同的表单包含一个不同的伪随机值,我们在4.4小节介绍“如何防止表单多次递交”时介绍过此方案,复用相关代码,实现如下:

生成随机数token

h := md5.New()
io.WriteString(h, strconv.FormatInt(crutime, 10))
io.WriteString(h, "ganraomaxxxxxxxxx")
token := fmt.Sprintf("%x", h.Sum(nil))t, _ := template.ParseFiles("login.gtpl")
t.Execute(w, token)

输出token

<input type="hidden" name="token" value="{{.}}">

验证token

r.ParseForm()
token := r.Form.Get("token")
if token != "" {//验证token的合法性
} else {//不存在token报错
}

这样基本就实现了安全的POST,但是也许你会说如果破解了token的算法呢,按照理论上是,但是实际上破解是基本不可能的,因为有人曾计算过,暴力破解该串大概需要2的11次方时间。

go预防CSRF攻击相关推荐

  1. 如何预防 CSRF 攻击?

    简介 CSRF(Cross-site request forgery)跨站请求伪造,也被称为"One Click Attack"或者Session Riding,是一种对网站的恶意 ...

  2. 如何预防 CSRF 攻击

    1.CSRF 攻击 CSRF:Cross-Site Request Forgery(中文:跨站请求伪造),可理解为攻击者盗用某用户的身份,以此用户的名义发送恶意请求,比如:发送邮件.发消息.购买商品, ...

  3. Flask项目--预防csrf攻击原理

    1.CSRF机制原理 2.csrf成功攻击示意图 3.csrf防御

  4. 同源策略为什么可以防csrf_Spring Security 如何预防CSRF跨域攻击?

    序言 前面我们学习了 spring security 与 springmvc 的整合入门教程. spring secutity整合springboot入门 spring security 使用 mav ...

  5. csrf攻击与防护—2用flask简单演示防范csrf攻击之referer

    接上篇 csrf攻击与防护-1用flask简单演示csrf攻击 以下是根据referer字段防止csrf攻击的新代码: bank.py import uuid from flask import re ...

  6. 什么是CSRF攻击,如何防范CSRF攻击?

    一.什么是CSRF攻击 CSRF攻击的全称为跨站脚本伪造,也称为One Click Attack或者Session Eiding,通常缩写为CSRF或者XSRF.CSRF通过伪装来自受信任的用户的请求 ...

  7. PHP防SQL注入代码,PHP 预防CSRF、XSS、SQL注入攻击

    1.服务端进行CSRF防御 服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数. (1).Cookie Hashing(所有表单都包含同一个伪随机值): 这可能是最简单 ...

  8. PHP 预防CSRF、XSS、SQL注入攻击

    1.服务端进行CSRF防御 服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数. (1).Cookie Hashing(所有表单都包含同一个伪随机值): 这可能是最简单 ...

  9. XSS、CSRF攻击以及预防手段

    文章目录 XSS 反射型 持久型 DOM型 XSS如何防御? CSRF XSS XSS全程Cross Site Scripting,名为跨站脚本攻击,是一种常见于 Web 应用中的计算机安全漏洞. 恶 ...

最新文章

  1. 悉尼大学计算机研究生学制,悉尼大学研究生学制
  2. url参数传递 java_URL中文参数传递问题
  3. 东北能源大数据中心正式成立,一期将建设2.4万平方米数据中心
  4. python pywinauto 单击鼠标_Python 基础(十):模块与包
  5. MCU为什么内部不集成晶振
  6. 极度丝滑!CentOS/Unbuntu系统下快速设置虚拟内存,一行命令快速搞定!!!
  7. 计算机三级之嵌入式系统学习笔记2
  8. HTML input 控件
  9. 第二阶段冲刺之站立会议1
  10. 说你呢,装着JDK8,却孜孜不倦的写着 JDK6 的代码,写了3年了,JDK8的特性都没用过......
  11. 2022.3.14-3.20 AI行业周刊(第89期):商业计划书
  12. FPI厂商SoleraNetworks被Blue Coat收购
  13. 日记侠:如何用手机月入万元,只需从这5步开始
  14. ps中如何批量修改图片
  15. rviz中的标记(markers)和交互标记(interactive markers)
  16. 基于人工智能视觉芯的高速公路交通事故预警预测方案
  17. 旅游网站的设计与实现
  18. 数据中心的服务器是怎么运作的,数据中心想要更有效的运行得怎样借助AI的力量...
  19. JavaSE查漏补缺1
  20. blender动作学习笔记(一) : 动作的十二原则

热门文章

  1. 【嵌入式开发】 ARM 关闭 MMU ( 存储体系 | I/D-Cache | MMU | CP15 寄存器 | C1 控制寄存器 | C7 寄存器 | 关闭 MMU )
  2. Class对象和反射
  3. 一行代码搞定 R 语言模型输出!(使用 stargazer 包)
  4. Java 时期格式 星期显示英文
  5. bzoj1196 [HNOI2006]公路修建问题
  6. 利用scrollTop 制作图片无缝滚动
  7. Codeforces 167B Wizards and Huge Prize(概率dp)
  8. java rmi 使用方法
  9. WPF中的动画——(五)路径动画
  10. 细颗粒度Singleton模式实现