我是前端西瓜哥,今天来学习 CSRF。

CSRF,跨站请求伪造,英文全称为 Cross-site request forgery。也可称为 XSRF。

CSRF 攻击 利用的是用户对浏览器的信任

当我们成功登录一个网站时,其实浏览器在这个网站域名下保存好了 登录凭证,通常通过 cookies 保存。

登录后,我们的在当前域名下发起请求就会带上 cookie,服务器就通过它来确定你对应哪个用户,允许你去执行一些涉及到个人隐私的操作。

浏览器的一个机制:访问了一个 url,会带上对应域名的 Cookies,这就给了 CSRF 可乘之机。

利用 CSRF,攻击者可以欺骗浏览器,让你用特定网站的账号,发送一些请求(比如转账)。

例子

攻击者设计了一个钓鱼网站。网站很简单,里面有一个 form 表单:

  • 提交的 url 为你登录的一个银行网站的地址;

  • 使用 POST 请求(解决浏览器地址栏访问只能为 GET 请求的局限);

  • 预填充转账对象账号、金额等信息;

  • 直接用脚本触发提交操作;

<form method="POST" action="http://a-bank.com"><input type="text" name="toAccountId"><input type="text" name="acount"><input type="submit" name="submit" value="Submit">
</form>
<script>const form = document.querySelector('form');form.submit();
</script>

这样,攻击者会通过各种方式诱导你访问它的钓鱼网站。

一旦我们访问了攻击者的网站,模拟你自己在银行网站点击 “转账” 按钮的行为,发送转账请求。

当然前提是你在这个银行网站处于登录状态。

不过也不用担心,银行不会犯这么低级的错误,会有非常多的防御措施,可能还要你输入手机验证码。这只是一个用烂的例子而已。

CSRF 的一些防御方式

校验 token

我们可以让请求带上一个额外的 csrf_token,来确保请求是通过网站的前端页面发送的。

这个 csrf_token 由服务器颁发,不要放到 cookie 里,要通过其他方式提供给网站的前端页面,一种方式是放到 DOM 上。

前端请求时就会从 DOM 找出这个 csrf_token,作为一个参数带上,让服务端校验。

为了防止攻击者伪造 csrf_token,我们要确保 csrf_token 和用户凭证有关联,可以考虑对用户凭证做密钥哈希,攻击者没有密钥,就无法伪造。

使用严格的 SameSite

Cookie 有一个 SameSite 属性,设置为严格模式(非 none 值),可以让其他网站的中跨域请求不带上 Cookie。

通过 Referer 判断

如果在网站中发送的请求,HTTP头字段 Referer 中的域名就是当前网站。如果是其他网站发起的请求,Referer 就是这个网站域名。

服务端可以利用这个 Referer 判断请求是否在网站页面中发起的。

此外还可以利用 Origin 头字段,它通常在跨域请求时会携带上。

但 Referer 并不完全可靠,在一些老旧的浏览器在实现上可能会有一些问题,有丢失的可能。

不使用 Cookies

将用户凭证保存到 localStorage 本地缓存中,在网站中发送 Ajax 请求时,手动从中取出放到请求头字段中。这样其他网站进行 CSRF 攻击时,自定携带的 cookie 就没有我们的用户凭证了。

看起来没啥大问题。有个小问题,就是好像不能利用 cookie 的 http-only 防 XSS 攻击了。

人机校验

加一个短信校验、邮箱校验、谷歌万恶的九宫格什么的,确保是一个人在尝试发这个请求。

可以吊打所有攻击,缺点是用户体验不太好。

结尾

CSRF 跨站请求伪造,利用的是人们对浏览器的信任(访问网站会带上 cookie)。当你在网站 A 登录了,攻击者分析网站 A 的请求结构,进行构造好一些请求,诱导用户点击然后真正发起该请求,来实现攻击。

要防范 CSRF,需要开发者在开发中做好各种防御措施。

我是前端西瓜哥,关注我,学习更多前端知识。

跨站请求伪造(CSRF)攻击是什么?如何防御?相关推荐

  1. 防止跨站请求伪造(CSRF)攻击 和 防重复提交 的方法的实现

    CSRF的概念可以参考:http://netsecurity.51cto.com/art/200812/102951.htm 本文介绍的是基于spring拦截器的Spring MVC实现 首先配置拦截 ...

  2. MVC安全:ajax表单提交切记加上AntiForgeryToken防止跨站请求伪造 (CSRF)攻击

    因为项目使用的是mvc的框架,前端使用的是metronic bootstrap框架,所以在处理表单的提交时就用了ajax的方式进行提交,这样前端js也方便封装,实现代码复用. 先看看js端的相关代码 ...

  3. CSRF(跨站请求伪造)攻击 --

    CSRF(跨站请求伪造)攻击 CSRF(Cross Site Request Forgery,跨站请求伪造)是一种近年来才逐渐被大众了解的网络攻击方式,又被称为One-Click Attack或Ses ...

  4. 跨站请求伪造(CSRF)-简述

    跨站请求伪造(CSRF)-简述 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 ...

  5. 带你刷burpsuite官方网络安全学院靶场(练兵场)之客户端漏洞——跨站请求伪造(CSRF)专题

    介绍 PortSwigger是信息安全从业者必备工具burpsuite的发行商,作为网络空间安全的领导者,他们为信息安全初学者提供了一个在线的网络安全学院(也称练兵场),在讲解相关漏洞的同时还配套了相 ...

  6. django16: csrf跨站请求伪造/CSRF相关装饰器

    CSRF 即跨站请求攻击 跨站请求伪造csrf钓鱼网站本质搭建一个跟正常网站一模一样的页面用户在该页面上完成转账功能转账的请求确实是朝着正常网站的服务端提交唯一不同的在于收款账户人不同给用户书写for ...

  7. 我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

    我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击 概述      众所周知,ASP.Net MVC程序在浏览器运行时产生了标准的Html标签,包括 ...

  8. 浅谈跨站请求伪造(CSRF)

    浅谈跨站请求伪造(CSRF)   这里简单的记录一下CSRF漏洞~~ 什么是CSRF?   CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可 ...

  9. Nginx配置valid_referer解决跨站请求伪造(CSRF)

    Nginx配置valid_referer解决跨站请求伪造(CSRF) 文章目录 Nginx配置valid_referer解决跨站请求伪造(CSRF) 漏洞说明 漏洞描述 危害等级 修复建议 漏洞复现 ...

  10. csrf防御 php,跨站请求伪造CSRF的防御实例(PHP版本)

    跨站请求伪造CSRF的防御:One-Time Tokens(不同的表单包含一个不同的伪随机值) 在实现One-Time Tokens时,需要注意一点:就是"并行会话的兼容".如果用 ...

最新文章

  1. mysql 去重 根据id_超详细的四类数据库去重实现方案汇总,值得收藏
  2. 酷我音乐盒里的MV怎么下载
  3. 华北电力大学计算机科学与技术考研,华北电力大学吴克河教授谈计算机科学与技术专业...
  4. Java连接SQL数据库失败的分析思路
  5. 成功之道——永远的知识
  6. LibMeshEquationSystem 类接口
  7. oss读取指定文件夹下所有图片
  8. Thread类的常用方法
  9. 衔着树枝飞跃太平洋的傻鸟!(童话版)
  10. MYSQL查询语句大全集锦
  11. ARCore从零到一 (2) 运行HelloAR 案例
  12. PWM整流器模型预测控制Simulink仿真
  13. ws office excel 基础公式
  14. ktt算法 约化_深度学习面试题
  15. win10虚拟机管理服务器,如何使用微软的虚拟机管理器来管理Hyper-V虚拟机
  16. Eagle设计师必备利器管理工具
  17. 邮件工具-MailUtil(发送邮件)
  18. Xu_Learning_to_Restore_Low-Light_Images_via_Decomposition-and-Enhancement_CVPR_2020_paper
  19. 使用R读取并查看数据
  20. Html 和 Css 的杂乱总结

热门文章

  1. blastn、blastp、blastx、tblastn和tblastx的区别与用法
  2. 极光开发者周刊【No.0827】
  3. 叉车式AGV 时间窗问题
  4. 用Excel 随机抽取不重复n行数据
  5. 华硕aura完全卸载_这把键盘,或是顶级光轴键盘!华硕TUF GAMING K7光轴机械键盘...
  6. 拼多多sdk php,学习猿地-【扩展分享】拼多多 API SDK【拼多多开放平台】
  7. ViewPager Kotlin 教程入门
  8. 从IT技术面试官的角度说说技术人的简历
  9. python时间控件readonly属性_Selenium2+python自动化25-js处理日历控件(修改readonly属性)转自-上海悠悠...
  10. 漫画C语言 做个聊天软件你不懂也得懂