CSRF(跨站请求伪造)是一种网络攻击,攻击者通过伪造用户的请求来执行一些操作。为了防止CSRF攻击,可以采取以下措施:验证HTTP Referer字段、使用CSRF token、自定义HTTP头验证、利用Web框架的防护机制(如Django的{% csrf_token %}
)、Ajax请求时添加token、设置安全会话cookie及教育用户提高安全意识 。
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络攻击手段,攻击者通过伪造用户的请求,使得用户在不知情的情况下执行非本人操作,为了防止CSRF攻击,各种网站和应用都采用了相应的防护策略,本文将介绍一些常见的CSRF防护策略及其实践。
1、基于Token的防护策略
这种策略的核心思想是在表单中添加一个隐藏字段,用于存储一个随机生成的令牌(Token),当用户提交表单时,需要将该令牌一同提交,服务器端会验证令牌是否与当前会话关联,如果关联则认为是合法请求,否则拒绝请求。
实现方法:
(1) 在HTML表单中添加一个隐藏字段,用于存储令牌,可以使用JavaScript动态生成令牌。
<form action="/submit" method="post"> <!-- 其他表单字段 --> <input type="hidden" name="_csrf" value="${token}" /> <input type="submit" value="提交" /> </form>
(2) 使用后端框架处理令牌验证,以Python的Flask框架为例:
from flask import Flask, request, render_template_string import secrets app = Flask(__name__) @app.route('/submit', methods=['POST']) def submit(): csrf_token = request.form.get('_csrf') if not csrf_token or secrets.compare_digest(csrf_token, request.session['csrf_token']) != 0: return "CSRF验证失败", 403 # 处理表单数据,执行业务逻辑 return "表单提交成功", 200
2、基于Cookie的防护策略
这种策略的核心思想是在用户登录成功后,服务器生成一个包含用户信息的cookie,并将其发送给客户端,客户端在后续的请求中都会携带这个cookie,服务器通过验证cookie中的信息来判断请求是否合法。
实现方法:
(1) 用户登录成功后,服务器生成包含用户信息的cookie,可以使用第三方库如Flask-Session来管理session。
from flask import Flask, session, redirect, url_for, request from flask_session import Session import secrets app = Flask(__name__) app.config['SESSION_TYPE'] = 'filesystem' Session(app) @app.route('/login', methods=['POST']) def login(): username = request.form['username'] password = request.form['password'] # 验证用户名和密码,登录成功后设置session变量 session['user_id'] = user_id session['username'] = username session['csrf_token'] = secrets.token_hex(16) return redirect(url_for('index'))
(2) 在客户端请求中携带cookie,可以使用JavaScript自动发送带有cookie的请求头。
function sendRequest() { var xhr = new XMLHttpRequest(); xhr.open('GET', '/api/data', true); xhr.setRequestHeader('Cookie', document.cookie); // 将cookie添加到请求头中 xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(); }
3、结合Token和Cookie的防护策略
这种策略结合了前两种策略的优点,既可以确保请求的合法性,又可以方便地携带用户信息,在用户登录成功后,服务器生成一个包含用户信息的token,并将其存储在Cookie中,当客户端发起请求时,同时携带Token和Cookie,服务器根据Token和Cookie中的信息进行验证,这种策略可以有效地防止CSRF攻击,同时保持了Cookie的使用便利性。