Web安全之 CSRF 攻击
简介
CSRF
是跨站请求伪造(Cross-Site Request Forgery
)的缩写。跨站请求伪造是一种网络攻击方式,攻击者利用已登录的用户在浏览器中存储的合法会话信息,伪造用户发出的请求,以达到欺骗服务器的目的。这种攻击方式并不涉及窃取用户的会话信息,而是利用会话信息。攻击者通常会在用户毫不知情的情况下,在用户的浏览器上执行恶意操作,如更改密码、发布信息、购买商品等。
攻击原理
CSRF
的攻击原理基于Web的隐式身份验证机制。在用户访问Web应用时,浏览器会自动携带用户的会话凭证(如Cookie
),以便服务器能够识别用户的身份。攻击者通过构造一个恶意网站或链接,诱使用户访问该网站或点击链接,从而触发一个针对目标网站的伪造请求。由于浏览器会自动携带用户的会话凭证,目标网站无法区分正常请求和伪造请求,因此会执行伪造请求中的操作。
攻击目标
CSRF
的攻击目标主要是需要用户身份认证的操作,如修改用户信息、更改密码、发表评论、进行转账等。攻击者希望利用用户的身份执行这些操作,以达到窃取数据、篡改内容、转移资金等目的。
案例
- 受害者登录 a.com,并保留了登录凭证(Cookie)
- 攻击者引诱受害者访问了b.com
- b.com 向 a.com 发送了一个请求:a.com/act=xx浏览器会默认携带a.com的Cookie
- a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求
- a.com以受害者的名义执行了act=xx
- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作
例如: 攻击者构造一个伪造的银行转账请求,诱导受害者点击后,该请求会携带受害者的cookie信息,并向正常站点发起请求,从而完成非法转账。或者攻击者设置了一个自动转发邮件的规则,使得受害者的所有邮件都被自动转发到攻击者的邮箱中。
预防方案
CSRF
通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强自己网站针对CSRF的防护能力来提升安全性。
同源检测
:通过Header
中的Origin Header
、Referrer Header
确定,但不同浏览器可能会有不一样的实现,不能完全保证CSRF Token 校验
:将CSRF Token
输出到页面中(通常保存在Session
中),页面提交的请求携带这个Token
,服务器验证Token
是否正确双重cookie验证
:- 流程:
- 步骤1:在用户访问网站页面时,向请求域名注入一个
Cookie
,内容为随机字符串(例如csrfcookie=v8g9e4ksfhw
) - 步骤2:在前端向后端发起请求时,取出
Cookie
,并添加到URL
的参数中(接上例POSThttps://www.a.com/comment?csrfcookie=v8g9e4ksfhw
) - 步骤3:后端接口验证
Cookie
中的字段与URL
参数中的字段是否一致,不一致则拒绝。
- 步骤1:在用户访问网站页面时,向请求域名注入一个
- 优点:
- 无需使用
Session
,适用面更广,易于实施。 Token
储存于客户端中,不会给服务器带来压力。- 相对于
Token
,实施成本更低,可以在前后端统一拦截校验,而不需要一个个接口和页面添加。
- 无需使用
- 缺点:
Cookie
中增加了额外的字段。- 如果有其他漏洞(例如
XSS
),攻击者可以注入Cookie
,那么该防御方式失效。 - 难以做到子域名的隔离。
- 为了确保
Cookie
传输安全,采用这种防御方式的最好确保用整站HTTPS的方式,如果还没切HTTPS的使用这种方式也会有风险。
- 流程:
SameSite Cookie属性
:Cookie
的SameSite
属性是一种安全策略,用于限制第三方网站获取Cookie
的能力,从而增强网站的安全性。SameSite
属性可以设置三个值,分别是:Strict
:完全禁止第三方获取Cookie
,只有在当前网页的URL
与请求目标一致时,才会带上Cookie
。这种设置可能会对用户体验造成一定的影响,例如,在跳转到其他网站时,可能会因为未携带Cookie
而导致登录状态丢失。Lax
:比Strict
宽松一些,允许在跨站使用GET
请求时携带Cookie
。例如,在通过链接进行页面跳转时,会带上Cookie
,但在通过表单提交数据时,不会带上Cookie
。None
:允许在任何情况下都携带Cookie
。但是,为了安全起见,当设置为None时,必须同时设置Secure
属性,即Cookie
只能通过HTTPS
协议发送,否则设置将无效。
验证码:在关键操作或敏感操作前,要求用户输入验证码。这样即使攻击者能够构造伪造请求,也无法自动执行操作,因为需要用户手动输入验证码。
总结
CSRF是一种严重的网络威胁,对于需要用户身份认证的操作尤其危险。为了保障用户数据的安全性和隐私保护,开发人员在设计和开发网络应用时,应该充分考虑CSRF攻击的防御措施,并采取多种手段提高系统的安全性。同时,用户也应该保持警惕,避免点击不明来源的链接或访问可疑网站,以防止CSRF攻击的发生。