如果你正在开发应用程序并希望保护它免受CSRF攻击,以下是一些常见的防护措施:
在每个表单提交中包含一个唯一的CSRF令牌,并在服务器端验证该令牌。
from flask import Flask, request, session, render_template_string
import os
import secrets
app = Flask(__name__)
app.secret_key = os.urandom(24)
@app.before_request
def csrf_protect():
if request.method == "POST":
token = session.pop('_csrf_token', None)
if not token or token != request.form.get('_csrf_token'):
abort(403)
def generate_csrf_token():
if '_csrf_token' not in session:
session['_csrf_token'] = secrets.token_hex(16)
return session['_csrf_token']
app.jinja_env.globals['csrf_token'] = generate_csrf_token
@app.route('/form', methods=['GET', 'POST'])
def form():
if request.method == 'POST':
# 处理表单提交
return 'Form submitted!'
return render_template_string('''
<form method="post">
<input type="hidden" name="_csrf_token" value="{{ csrf_token() }}">
<input type="text" name="data">
<input type="submit" value="Submit">
</form>
''')
if __name__ == '__main__':
app.run()
使用自定义HTTP头来传递CSRF令牌,并在服务器端进行验证。
fetch('/api/endpoint', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken // 从页面或cookie中获取CSRF令牌
},
body: JSON.stringify({ data: 'example' })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
验证请求的来源是否可信,例如检查Origin
或Referer
头。
const express = require('express');
const app = express();
app.use(express.json());
app.post('/api/endpoint', (req, res) => {
const origin = req.get('Origin');
if (origin !== 'https://your-trusted-domain.com') {
return res.status(403).send('Forbidden');
}
// 处理请求
res.send('Request processed');
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
确保Cookie设置为HttpOnly
和Secure
,并使用SameSite
属性来防止跨站请求。
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
许多现代Web框架都内置了CSRF保护功能,确保在应用中启用这些功能。
Django框架默认启用了CSRF保护,只需在模板中使用{% csrf_token %}
标签。
<form method="post">
{% csrf_token %}
<input type="text" name="data">
<input type="submit" value="Submit">
</form>
领取专属 10元无门槛券
手把手带您无忧上云