什么是 CSRF 攻击,如何避免?
封面图
•
2025-11-14
•
PHP
235
0
0
0
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击方式,攻击者通过诱导用户在已登录的Web应用中执行非预期的操作,从而窃取或篡改用户的数据。 --- ## 一、什么是 CSRF 攻击? **简单来说:** - 用户已经登录了某个网站(比如银行、社交平台等); - 用户访问了一个恶意网站(由攻击者控制); - 恶意网站中的代码会向目标网站发送请求(如转账、修改密码等); - 因为用户已经登录过目标网站,浏览器会自动带上 Cookie 或 Session 信息,导致请求被服务器误认为是用户自己发起的。 --- ## 二、CSRF 攻击的原理 举个例子: 1. 用户登录了银行网站,浏览器保存了 Cookie; 2. 用户访问了攻击者的网页(如一个带有隐藏表单的页面); 3. 攻击者网页中的 JavaScript 自动提交一个转账请求到银行网站; 4. 银行网站收到请求后,因为用户已经登录,所以认为这是合法操作,完成转账。 --- ## 三、如何避免 CSRF 攻击? 以下是常见的防御措施: ### 1. **使用 CSRF Token(推荐)** - 在表单中加入一个**一次性随机令牌(Token)**; - 服务器在处理请求时验证该 Token 是否匹配; - 每次请求都生成新的 Token,防止重放攻击。 ```html <form action="/transfer" method="POST"> <input type="hidden" name="csrf_token" value="abc123xyz"> <input type="text" name="amount"> <input type="submit" value="Transfer"> </form> ``` 服务端验证: ```python # Python Flask 示例 def transfer(): token = request.form.get('csrf_token') if token != session['csrf_token']: return "Invalid token", 403 # 处理转账逻辑 ``` --- ### 2. **SameSite Cookie 属性** - 设置 Cookie 的 `SameSite=Strict` 或 `SameSite=Lax`,限制 Cookie 只能在同源请求中发送; - 这可以防止跨站请求携带 Cookie。 ```http Set-Cookie: session_id=abc123; SameSite=Strict ``` --- ### 3. **验证 HTTP Referer 或 Origin** - 检查请求的来源是否来自可信的域名; - 但这种方法不完全可靠,因为 Referer 可以被伪造或被浏览器禁用。 ```python # Python Flask 示例 if request.referrer and not request.referrer.startswith('https://yourdomain.com'): return "Invalid origin", 403 ``` --- ### 4. **使用双重提交 Cookie 方法** - 将 Token 同时作为 Cookie 和请求参数提交; - 服务器比较两者是否一致。 --- ### 5. **对敏感操作使用二次确认** - 对于重要操作(如转账、修改密码),要求用户再次输入密码或进行验证码验证。 --- ## 四、总结 | 防御方法 | 说明 | |------------------|------| | CSRF Token | 推荐,每次请求生成唯一 Token | | SameSite Cookie | 限制 Cookie 跨站发送 | | Referer/Origin | 检查请求来源 | | 二次确认 | 对关键操作增加验证 | | 避免 GET 请求执行敏感操作 | GET 请求容易被伪造,建议使用 POST | --- 如果你是开发人员,建议优先使用 **CSRF Token** 来防御这种攻击。如果你是普通用户,注意不要点击可疑链接,尤其是那些看起来像“钓鱼”的网站。
上一篇:
基于Cookie与不基于Cookie的Session
下一篇:
服务器性能优化的8种常用方法
标题录入,一次不能超过6条
留言
评论