CSRF攻击的原理与防范措施详解 | Web安全指南

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的Web安全漏洞,攻击者利用用户已登录的身份,在用户不知情的情况下,以用户的名义执行恶意操作。这种攻击通常发生在用户已经通过身份验证的网站上。
概念与原理
-
概念:
- CSRF攻击利用了Web应用程序对用户浏览器的信任。攻击者通过诱导用户点击恶意链接或访问恶意网站,使得用户在不知情的情况下向目标网站发送请求,从而执行某些操作(如转账、修改密码等)。
-
原理:
- 用户登录目标网站(如银行网站),并在浏览器中保存了会话Cookie。
- 用户在不登出目标网站的情况下,访问了攻击者精心构造的恶意网站。
- 恶意网站中包含一个自动提交的表单或脚本,向目标网站发送请求(如转账请求)。
- 由于用户的浏览器会自动携带目标网站的会话Cookie,目标网站会认为这是用户的合法请求,从而执行操作。
防范措施
-
使用CSRF Token:
- 在表单提交或AJAX请求中,服务器生成一个随机的CSRF Token,并将其嵌入到表单或请求头中。
- 服务器在接收到请求时,验证CSRF Token的有效性。如果Token不匹配或缺失,则拒绝请求。
<form action="/transfer" method="POST"> <input type="hidden" name="csrf_token" value="随机生成的Token"> <!-- 其他表单字段 --> <button type="submit">提交</button> </form>
// 在AJAX请求中添加CSRF Token const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); fetch('/transfer', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrfToken }, body: JSON.stringify({ amount: 1000 }) });
-
SameSite Cookie属性:
- 设置Cookie的
SameSite
属性为Strict
或Lax
,可以防止浏览器在跨站请求中自动发送Cookie。 Strict
:Cookie仅在同站请求中发送。Lax
:Cookie在跨站请求中仅对GET请求发送。
Set-Cookie: sessionid=12345; SameSite=Strict; Secure; HttpOnly
- 设置Cookie的
-
验证Referer头部:
- 服务器可以检查请求的
Referer
头部,确保请求来源于合法的站点。如果Referer
头部不匹配或缺失,则拒绝请求。
app.use((req, res, next) => { const referer = req.get('Referer'); if (!referer || !referer.startsWith('https://your-legitimate-site.com')) { return res.status(403).send('Forbidden'); } next(); });
- 服务器可以检查请求的
-
双重提交Cookie:
- 服务器在设置Cookie时,同时生成一个随机的CSRF Token,并将其存储在Cookie中。
- 客户端在提交表单或发送AJAX请求时,需要将这个CSRF Token作为请求参数或头部发送。
- 服务器在接收到请求时,验证Cookie中的CSRF Token与请求中的CSRF Token是否一致。
// 服务器设置Cookie res.cookie('csrf_token', '随机生成的Token', { httpOnly: true, secure: true }); // 客户端发送请求 const csrfToken = document.cookie.split('; ').find(row => row.startsWith('csrf_token=')).split('=')[1]; fetch('/transfer', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': csrfToken }, body: JSON.stringify({ amount: 1000 }) });
-
限制敏感操作的HTTP方法:
- 对于敏感操作(如转账、修改密码等),尽量使用POST、PUT、DELETE等HTTP方法,避免使用GET方法。GET请求容易被嵌入到恶意链接中,增加CSRF攻击的风险。
总结
CSRF攻击是一种利用用户身份执行恶意操作的安全漏洞。通过使用CSRF Token、SameSite Cookie、验证Referer头部、双重提交Cookie以及限制敏感操作的HTTP方法,可以有效防范CSRF攻击。在实际开发中,应根据具体场景选择合适的防范措施,并结合其他安全策略,确保Web应用的安全性。