推荐答案
在 Flask 中防止跨站请求伪造 (CSRF) 攻击的推荐方法是使用 Flask-WTF 扩展库。Flask-WTF 提供了内置的 CSRF 保护功能,可以轻松地为表单和 AJAX 请求添加 CSRF 令牌验证。
实现步骤:
安装 Flask-WTF:
pip install Flask-WTF
在 Flask 应用中配置 CSRF 保护:
from flask import Flask from flask_wtf.csrf import CSRFProtect app = Flask(__name__) app.config['SECRET_KEY'] = 'your-secret-key' csrf = CSRFProtect(app)
在表单中添加 CSRF 令牌:
<form method="post"> {{ form.hidden_tag() }} <!-- 其他表单字段 --> <input type="submit" value="Submit"> </form>
对于 AJAX 请求,可以在请求头中添加 CSRF 令牌:
var csrf_token = "{{ csrf_token() }}"; $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) { xhr.setRequestHeader("X-CSRFToken", csrf_token); } } });
本题详细解读
什么是 CSRF?
跨站请求伪造 (CSRF) 是一种攻击方式,攻击者通过伪造用户的请求,诱使用户在不知情的情况下执行某些操作。例如,攻击者可以伪造一个转账请求,诱使用户点击后自动执行转账操作。
为什么需要 CSRF 保护?
CSRF 攻击可能导致用户在不知情的情况下执行敏感操作,如修改账户信息、转账、删除数据等。为了防止这种攻击,需要在服务器端验证请求的合法性,确保请求是来自用户本人。
Flask-WTF 的 CSRF 保护机制
Flask-WTF 通过在表单中嵌入一个 CSRF 令牌来防止 CSRF 攻击。每次提交表单时,服务器会验证该令牌是否有效。如果令牌无效或缺失,请求将被拒绝。
CSRF 令牌的生成与验证
- 生成:Flask-WTF 会在每次渲染表单时生成一个唯一的 CSRF 令牌,并将其嵌入到表单的隐藏字段中。
- 验证:当表单提交时,Flask-WTF 会自动验证 CSRF 令牌的有效性。如果令牌无效,请求将被拒绝。
AJAX 请求中的 CSRF 保护
对于 AJAX 请求,CSRF 令牌可以通过请求头 X-CSRFToken
传递。Flask-WTF 提供了 csrf_token()
函数来生成令牌,开发者需要手动将其添加到请求头中。
注意事项
- SECRET_KEY:Flask-WTF 的 CSRF 保护依赖于
SECRET_KEY
,因此必须确保SECRET_KEY
的安全性,避免泄露。 - HTTPS:为了进一步增强安全性,建议在生产环境中使用 HTTPS 来加密传输的数据,防止 CSRF 令牌被窃取。