前端安全:CSRF攻击与防御

前端安全:CSRF攻击与防御
最新回答
与审美无关△

2020-05-09 23:45:11

CSRF(Cross-Site Request Forgery,跨站请求伪造)攻击是一种允许攻击者通过受害者的身份执行非预期操作的安全威胁。 防御CSRF攻击需要前端和后端协同配合,以下是关键防御策略及代码示例:

1. 令牌验证(CSRF Token)

核心原理:服务器生成唯一令牌,客户端在请求中携带该令牌,后端验证其有效性。

  • 后端实现(Python Flask)

    from flask import Flask, session, render_templateapp = Flask(__name__)@app.route('/login')def login(): session['csrf_token'] = generate_csrf_token() # 生成令牌 return render_template('login.html', csrf_token=session['csrf_token'])@app.route('/protected', methods=['POST'])def protected(): if request.form.get('csrf_token') != session.get('csrf_token'): return "Invalid CSRF token", 403 # 执行安全操作
  • 前端实现

    <!-- 表单嵌入令牌 --><form action="/protected" method="POST"> <input type="hidden" name="csrf_token" value="{{ csrf_token }}"> <!-- 其他字段 --></form><!-- AJAX请求携带令牌 --><script>fetch('/protected', { method: 'POST', headers: { 'X-CSRF-Token': window.csrfToken }, body: formData});</script>
2. 检查Referer头

辅助措施:验证请求来源是否合法(注意:Referer可能被禁用或伪造)。

@app.before_requestdef check_referer(): if request.method in ['POST', 'PUT', 'DELETE']: if not request.referrer or not request.referrer.startswith(app.config['APP_BASE_URL']): return abort(403)3. SameSite Cookie属性

限制跨站Cookie发送

from flask import Flaskfrom flask_session import Sessionapp = Flask(__name__)Session(app)app.session_interface.cookie_samesite = 'Lax' # 或 'Strict'4. 双因素认证

敏感操作二次确认

  • 前端弹窗或短信验证码验证用户意图。
5. 其他防御措施
  • POST-only接口:敏感操作禁用GET请求。
  • CSP(Content Security Policy):限制外部资源加载,间接防御CSRF。// Express中间件示例app.use((req, res, next) => { res.setHeader("Content-Security-Policy", "default-src 'self'"); next();});
  • HSTS(HTTP Strict Transport Security):强制HTTPS通信。@app.after_requestdef apply_hsts(response): response.headers['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains' return response
  • 速率限制:防止暴力攻击。// 前端简单实现let lastRequestTime = 0;function submitAction() { if (Date.now() - lastRequestTime < 60000) { alert("操作过于频繁"); return; } lastRequestTime = Date.now(); // 提交请求}
6. 现代协议集成
  • OAuth 2.0/JWT:利用协议内置的令牌验证机制。
  • WAF(Web应用防火墙):通过规则拦截恶意请求。
关键注意事项
  1. 前后端协同:前端必须正确传递令牌,后端必须严格验证。
  2. 令牌随机性:确保令牌不可预测(如使用加密安全的随机数生成器)。
  3. 避免令牌泄露:禁止将令牌存储在URL或本地存储中。
  4. 定期更新依赖:修复框架或库中的已知漏洞。

通过组合上述策略(尤其是CSRF令牌SameSite Cookie),可显著降低CSRF攻击风险。实际开发中需根据业务场景选择合适方案。