在Web开发中,跨站请求伪造(CSRF)攻击是一种常见的网络安全威胁。它允许攻击者冒充其他用户执行恶意操作。为了防止这种攻击,开发者需要采取一系列的措施。以下是一些代码示例,帮助你轻松入门防范CSRF攻击。
1. 使用CSRF令牌
1.1 创建CSRF令牌
在用户登录后,服务器生成一个CSRF令牌,并将其存储在用户的会话中。以下是一个使用Python Flask框架生成CSRF令牌的示例:
from flask import Flask, session, request, redirect, url_for
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['csrf_token'] = 'random_token'
# 登录逻辑...
return redirect(url_for('home'))
return '''
<form method="post">
CSRF Token: {{ csrf_token() }}
Username: <input type="text" name="username"><br>
Password: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
'''
@app.route('/home')
def home():
# 用户主页逻辑...
pass
if __name__ == '__main__':
app.run()
1.2 验证CSRF令牌
在处理POST请求时,检查请求中携带的CSRF令牌是否与存储在会话中的令牌匹配。以下是一个示例:
from flask import Flask, session, request, redirect, url_for, abort
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
if request.form['csrf_token'] != session.get('csrf_token'):
abort(400)
# 登录逻辑...
return redirect(url_for('home'))
return '''
<form method="post">
CSRF Token: {{ csrf_token() }}
Username: <input type="text" name="username"><br>
Password: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
'''
@app.route('/home')
def home():
# 用户主页逻辑...
pass
if __name__ == '__main__':
app.run()
2. 使用HTTP-only Cookies
设置HTTP-only Cookies可以防止JavaScript读取Cookie中的敏感信息,从而降低CSRF攻击的风险。以下是一个设置HTTP-only Cookie的示例:
from flask import Flask, session, request, redirect, url_for
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['user_id'] = '123456'
session.permanent = True
response = make_response(redirect(url_for('home')))
response.set_cookie('user_id', '123456', httponly=True)
return response
return '''
<form method="post">
Username: <input type="text" name="username"><br>
Password: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
'''
@app.route('/home')
def home():
# 用户主页逻辑...
pass
if __name__ == '__main__':
app.run()
3. 使用第三方库
一些第三方库可以帮助你轻松防范CSRF攻击,例如Flask-WTF和Flask-SeaSurf。以下是一个使用Flask-WTF防范CSRF攻击的示例:
from flask import Flask, render_template, request, redirect, url_for
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
app.secret_key = 'your_secret_key'
csrf = CSRFProtect(app)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
if csrf.validate_csrf(request.form['csrf_token']):
# 登录逻辑...
return redirect(url_for('home'))
else:
return 'CSRF token is invalid'
return render_template('login.html')
@app.route('/home')
def home():
# 用户主页逻辑...
pass
if __name__ == '__main__':
app.run()
通过以上代码示例,你可以轻松入门防范CSRF攻击。在实际开发中,请根据具体需求选择合适的防范措施。
