这是我在知乎的一个回答。原提问是如何在单页应用下进行 XSRF 防护。

XSRF(CSRF) 攻击的原理是什么?就是攻击者能猜测出所有的需要提交的内容以及类型,所以所有的解决方案共同出发点就是加一个攻击者也不知道随机值发送给后端验证就可以防范。

有很多解决方案,cookie-session,很不友好的所有表单都得填写验证码,还有一种很少人知道 JSON Web Token。

验证码(图形或者手机)这种就不说了吧,这个在互联网场景中因为用户体验原因几乎没有应用的。

首先要知道直接让后端验证 cookie 是否存在正确是不可取的,因为所有请求都会自动附带请求所在域的 cookie,当然只验证 http referrer 也是不靠谱的。

正确的方式是当用户进行登录请求的时候,这时候后端应该把包含 xsrf 字段的 cookie 保存在 session 中并且返还给前端,前端需要获取到 cookie 中的值并且能放入 ajax 请求体或请求头中,后端把这个值与 session 中的相应值进行判断就可以了,根据跨域不可访问不同域的 cookie ,攻击者也很难猜测出 xsrf 的值,那么这样就防范了 xsrf 攻击。

所以这里对 xsrf cookie 不能设置 httpOnly(当然就会有 XSS 问题,后面会提),同时提一句所以的 Token 必须得让后端设置 expire 过期时间。

这个 axios 就提供了这个功能,只要设置约定好 xsrf cookie字段名就可以了,axios 获取到值后默认是放入 request header 中,这也是业界最流行的方式。

如果不是单页应用都是后端在表单中加入一个隐藏的表单域。

<input type="hidden" name="_token" value="lAfHB..">

当然还有JWT,这个主要应用场景是 app,因为 app 通常没有 Cookie,当然也有应用到 Web 中的,要讲这个就有点多了,和上述也差不多。

简单说,JWT 就是服务端和客户端约定好一个Token格式,最后用密钥进行签名 base64 编码后放入请求头即可,客户端存放这个签名的内容通常会放在 localstorage 中,也有放在 cookie 中的。JWT应用了哈希签名的密码学技术,相比 cookie-session 的方式就是服务端可以不用(在内存或者缓存)存放 session,能节省存储资源,不过同时服务器需要通过计算来验证也浪费了计算资源。详细的说明可以参考:讲真,别再使用JWT了!

现有的产品为了更安全还需要考虑 XSS 攻击,这个就是有些恶意脚本或者插件不存在跨域问题,所以能获取到 cookie 和 localstorage 的值。

很安全的方式就是把 XSRF Token 加入到 JWT 中,并且把 JWT 存放在设置 httpOnly 的 cookie 中,然后单独把 XSRF Token 设置在 httpOnly=false 的 cookie 中,前端请求时,需要获取 XSRF Token 并放入请求头(RequestHeader)。服务器端可以直接验证JWT中XSRF的值和XSRF的值即可。因为用了哈希密钥签名的技术,这样就可以防止篡改内容。

这样的安全防护就能抵御所有的 XSRF 攻击了。

说说 XSRF 防范相关推荐

  1. tornado cookie和session

    一.cookie (一).cookie运作机制 (二).设置cookie的常用方法 self.set_cookie('cookie_test','this_is_test') 默认过期时间是浏览器关闭 ...

  2. XSRF 的攻击与防范

    官方定义 CSRF(Cross-site request forgery跨站请求伪造,也被称成为"one click attack"或者session riding,通常缩写为CS ...

  3. XSS XSRF 介绍与防范

    XSS Definition 存储型 XSS 反射型 XSS DOM 型 XSS DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 ...

  4. .NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理...

    通过 ASP.NET Core,开发者可轻松配置和管理其应用的安全性. ASP.NET Core 中包含管理身份验证.授权.数据保护.SSL 强制.应用机密.请求防伪保护及 CORS 管理等等安全方面 ...

  5. ASP.NET Core 防止跨站请求伪造(XSRF\/CSRF)攻击

    什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可能会影响客户端浏览器和浏览器信任网站之间的交互.这种攻击是完全有可能的 ...

  6. 跨站请求伪造(CSRF/XSRF)

    简介 CSRF(Cross-site request forgery跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或 ...

  7. 网络(14)-Web站点如何防范XSS、CSRF、SQL注入攻击?

    一.XSS跨站脚本攻击 XSS跨站脚本攻击指攻击者在网页中嵌入客户端脚本(例如JavaScript),当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的,比如获取用户的Cookie ...

  8. Web安全相关(二):跨站请求伪造(CSRF/XSRF)

    简介 CSRF(Cross-site request forgery跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或 ...

  9. 14 Tornado - XSRF

    跨站请求伪造 先建立一个网站127.0.0.1:8000,使用上一节中的Cookie计数器: class IndexHandler(RequestHandler):def get(self):cook ...

最新文章

  1. 全面理解目标检测中的anchor
  2. Windows 10系统如何使用Ctrl+Alt+Delete解锁屏幕?
  3. C#非泛型集合类-ArrayList数组集合类
  4. Django 的视图层
  5. C# T 泛型类,泛型方法的约束条件用法
  6. 离职后才搞懂vue项目开发流程中的疑惑点
  7. hadoop-1.1.2 在centos环境下的部署
  8. Silverlight 3D开源项目,取材于CodePlex和微软的开源项目,主要是更新至Silverlight RTM版...
  9. Android自定义滑动进度条,Android自定义View实现圆形水波进度条
  10. Kali Linux 秘籍 第四章 信息收集
  11. 零基础带你学习MySQL—Insert语句以及注意事项(七)
  12. python添加包路径_python包/模块路径
  13. 程序员面试金典——9.8硬币表示
  14. Android Sensors (3) 传感器坐标系统
  15. *第九周*数据结构实践项目一【猴子选大王(数组)】
  16. 荒野行动android模拟,荒野行动用模拟器玩教程 荒野行动模拟器不支持机型解决方法...
  17. onenote登录显示服务器问题,onenote启动不了怎么回事 onenote为什么登录显示无法连接...
  18. 班级纪念册php源码,班级纪念册内容,班级纪念册的创意设计图片内容
  19. 开放下载 | 2022阿里妈妈技术年刊来啦!
  20. wordpress中如何禁止或者屏蔽更新提示

热门文章

  1. Imageloader3-单例模式
  2. 避障机器人程序c语言,基于51单片机小车寻迹、避障源程序(注释很详细)
  3. SpringBoot配置嵌入式Servlet容器
  4. C#教程8:面向对象编程【01】
  5. 计算机二级考试3月时间安排,2017年3月份计算机二级考试时间安排
  6. erc20 php,使用php将erc20令牌从一个帐户传输到另一个帐户
  7. 点击列表高亮_HTML5 标签列表
  8. vscode 在标签的src引入别名路径_从零开始 - VSCode 插件运行机制
  9. java 填充字符串_如何用Java填充字符串?
  10. mysql parameters_MySqlCommand Command.Parameters.Add已过时