Web 安全 — CSRF 的原理和攻防

1、CSRF 是个啥?

CSRF 是跨站请求伪造(Cross Site Request Forgery),它和 XSS 的攻击性相当,危害性也是非常大的。

举个例子,小明今天打开电脑登录 qq,然后去别的小网站找苍老师的学习视频,正在津津有味的学习的过程中,这时候走入了 CSRF 的攻击流程!这个网站的内容是大黑客精心布局的,画面非常刺激。典型的 CSRF 攻击就是点击 B 网站,影响 A 网站。比如,点击小网站,qq 号被盗。

其原理通俗点讲就是:攻击者盗用了你的身份,并以你的名义发送恶意请求或消息,盗取你的账号。比如说用攻击者盗取了你 qq 邮箱的身份,那么它就可以以你的名义发送邮件,这样不仅你的隐私会泄露,你的邮件还可以散播病毒,危害极大。

2、CSRF 的防御手段

解决的办法一定是在服务器端做相应的处理:

(1)服务器端最好过滤掉 GET 请求,尽量使用 POST 请求

因为 GET 请求的参数会显示在 url 上,这样就及其容易被人利用。比如说黑客知道了转账的 url 及参数,那他就可以构建一个 <img> 标签,它的 src 就是你转账的 GET 请求的 url,当你点击黑客构造的页面后,img 标签就会自动发送转账请求,这样就会导致用户的金额被而已转账。

POST 可以很大程度上降低被攻击的风险,但也并不是万无一失的。比如黑客可以构建一个带有 form 表单的网页,通过 script 脚本来触发 submit,这样也能完成恶意转账。

(2)加入验证码

上面这种防御手段并不彻底,即使使用 POST 请求也会存在被攻击的风险,所以可以在前者的基础上加入验证码,这就是为什么大家在登录网站或手机银行转账的过程中需要添加验证码的原因了。

验证码的方式有很多,比如手机短信、图片滑动、点击图片中的字等,加入验证码之后就可以保证了当前的行为是用户发出的而不是黑客伪造的请求了。除非黑客可以破解这个验证码,但是现代化的这些验证码基本上没有办法破解。

(3)验证 Referer

Referer 是存在于 HTTP 报文头部的一个字段,它是由浏览器提供的,可以记录当前请求的来源地址。黑客在伪造请求时只能在自己的网站上构造请求,这样的话服务器验证 Referer 就可以知道这个请求并不是自己网站内部的请求,而是黑客伪造的,直接拒绝。

使用这种方式的好处是简单、方便,一般的开发人员就不用去操心 CSRF 的安全性漏洞了,只需要在转账的接口中加一个拦截器,去验证请求的 Referer 值就可以了。

这种验证 Referer 的方式固然简单高效,但是也并不是万无一失的,虽然说 Referer 的值是由浏览器提供的,但是在某些浏览器上黑客是可以在发送请求时去篡改 Referer 或其他 Header 的值的,这样的话就i相当于跳过了验证,从而又可以进行 CSRF 攻击了。

(4)Anti CSRF Token

之所以会出现 CSRF 的攻击,本质原因是黑客可以伪造用户的请求,用户的请求信息实际上是存在 cookie 中的,所以黑客可以在不知道上述那些验证信息直接跳过安全验证。所以防御 CSRF 的关键点在于当用户的请求在发出的时候,黑客不能去伪造这个信息,并且这个信息不能存在于 cookie 之中。

下面说一种专门预防 CSRF 攻击的方法:Anti CSRF Token。Token,就是令牌,最大的特点就是随机性,不可预测。

Anti CSRF Token 原理上是通过 session token 来实现的。当客户端请求页面时,服务器会生成一个随机数 Token,并且将 Token 放置到 session 当中,然后将 Token 发给客户端(一般通过构造 hidden 表单)。下次客户端提交请求时,Token 会随着表单一起提交到服务器端,服务器端会在收到请求后用拦截器去对 Token 的值进行验证,判断是否和 session 中的 Token 值相等,若相等,则可以证明请求有效,不是伪造的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击,击者通过利用用户在已登录的网站上的身份验证凭证,向目标网站发送恶意请求。攻击原理如下: 1. 用户在已登录的网站A上获取了一个身份验证凭证,通常是一个cookie。 2. 攻击者诱导用户访问恶意网站B,网站B上包含了针对网站A的恶意请求。 3. 用户在不知情的情况下,浏览器会自动发送之前获取的身份验证凭证到网站A,执行恶意请求。 预防CSRF攻击的方法有以下几种: 1. 验证来源:服务器端验证请求的来源是否合法,可以通过检查Referer头或使用CSRF Token来实现。Referer头验证可防止一部分攻击,但可能存在被伪造的风险;而CSRF Token是一种随机生成的令牌,将其嵌入到表单或请求参数中,并在服务器端进行验证,可以有效防止CSRF攻击。 2. SameSite属性:通过设置SameSite属性为Strict或Lax,限制cookie只能在同一站点内发送,防止跨站点请求。 3. 双重提交Cookie验证:服务器在生成页面时,在返回给客户端的表单中添加一个隐藏字段,该字段包含了与用户cookie关联的数据。在接收到表单提交请求时,服务器会验证该字段的合法性。 4. 随机化请求参数:在每次请求中都生成一个随机的请求参数,并将其嵌入到请求中,服务器在接收到请求时验证这个参数的合法性。 5. 使用验证码:对于重要操作,可以要求用户输入验证码,增加安全性。 综合采用以上多种预防措施可以有效地减少CSRF攻击的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值