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>辅助措施:验证请求来源是否合法(注意: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. 双因素认证敏感操作二次确认:
通过组合上述策略(尤其是CSRF令牌和SameSite Cookie),可显著降低CSRF攻击风险。实际开发中需根据业务场景选择合适方案。