这是一篇讲解如何在 Flask 框架中实现 CSRF 保护的完整攻略。
什么是 CSRF?
CSRF(Cross-site request forgery)是一种攻击技术,攻击者通过伪造一个请求,让用户在未意识到的情况下执行某些操作,比如更改密码、删除数据等。这种攻击方式常常被用于钓鱼、盗取用户信息等恶意行为。
如何在 Flask 中进行 CSRF 保护?
在 Flask 中,可以通过 Flask-WTF 模块来实现 CSRF 保护,具体步骤如下:
- 安装 Flask-WTF
可以通过 pip 工具来安装 Flask-WTF:
pip install Flask-WTF
- 导入 Flask-WTF 模块并配置 csrf_token
在 Flask 中,要使用 Flask-WTF 模块,需要导入 FlaskForm
和 CSRFProtect
两个类。然后在应用程序中调用 CSRFProtect()
函数,并且将 app 实例作为参数传入。最后,还需要在表单中添加 csrf_token,用来防止 CSRF 攻击:
```python
from flask_wtf import FlaskForm
from flask_wtf.csrf import CSRFProtect
from wtforms import StringField, SubmitField
app = Flask(name)
app.config['SECRET_KEY'] = 'my_secret_key'
csrf = CSRFProtect(app)
class MyForm(FlaskForm):
name = StringField('Name')
submit = SubmitField('Submit')
@app.route('/', methods=['GET', 'POST'])
def index():
form = MyForm()
if form.validate_on_submit():
name = form.name.data
return 'Hello, {}!'.format(name)
return render_template('index.html', form=form)
```
在上述代码中,CSRFProtect(app)
表示将应用程序加入 Flask-WTF 中,即启用 CSRF 保护功能。app.config['SECRET_KEY'] = 'my_secret_key'
用来设置应用程序的 Secret Key,用于保证应用程序的安全性。
- 在表单中添加 csrf_token
在 Flask-WTF 中,可以通过 {{ form.csrf_token() }}
来添加 csrf_token。在模板文件中可以这样使用:
```html
```
在上述代码中,{{ form.csrf_token() }}
表示在表单中添加 csrf_token。
至此,通过 Flask-WTF 中的 CSRFProtect
和 {{ form.csrf_token() }}
两个功能,我们就可以在 Flask 中实现 CSRF 保护了。
示例说明
以上为基础实现 CSRF 保护的方法,以下提供两个示例进行说明:
示例一:使用 Flask-Login 实现 CSRF 保护
在 Flask 中使用 Flask-Login 实现 CSRF 保护,主要是结合 login_manager.token_loader
和 login_required
两个功能实现。在 login_manager.token_loader
函数中,将生成的 token 进行保存,在 login_required
函数中,判断 request 中的 csrf_token 和生成的 token 是否一致,如果不一致,则返回 400 错误。
from flask_login import LoginManager, login_user, login_required, current_user
from flask_wtf import FlaskForm
from flask_wtf.csrf import CSRFProtect
from wtforms import StringField, SubmitField
app = Flask(__name__)
app.config['SECRET_KEY'] = 'my_secret_key'
csrf = CSRFProtect(app)
login_manager = LoginManager(app)
@login_manager.token_loader
def csrf_protect():
if 'csrf_token' in session:
return session['csrf_token']
else:
token = uuid.uuid4().hex
session['csrf_token'] = token
return token
@login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm(request.form)
if request.method == 'POST':
if form.validate_on_submit():
username = form.username.data
password = form.password.data
user = User.query.filter_by(username=username).first()
if user is not None and user.verify_password(password):
login_user(user, form.remember_me.data)
return redirect(request.args.get('next') or url_for('index'))
flash('Invalid username or password.')
return render_template('login.html', form=form)
@app.route('/', methods=['GET', 'POST'])
@login_required
def index():
token = csrf_protect()
session.pop('csrf_token', None)
if request.method == 'POST':
if token != request.form.get('csrf_token'):
abort(400)
name = form.name.data
return 'Hello, {}!'.format(name)
return render_template('index.html', token=token)
示例二:使用 Flask-CORS 实现 CSRF 保护
在使用 Flask-CORS 的应用程序中,可以使用 @cross_origin(send_wildcard=True)
装饰器来保证 CSRF 的安全性。@cross_origin(send_wildcard=True)
装饰器表示允许所有的跨域请求,在发送跨域请求时需要带上 X-Requested-With
头信息。
from flask_cors import CORS, cross_origin
app = Flask(__name__)
app.config['SECRET_KEY'] = 'my_secret_key'
csrf = CSRFProtect(app)
cors = CORS(app)
@csrf.exempt
@cross_origin(send_wildcard=True)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
name = form.name.data
return 'Hello, {}!'.format(name)
return render_template('index.html')
在上述代码中,使用了 csrf.exempt
来使路由对 csrf 保护豁免,使用 cross_origin
来允许跨域请求,并设置了 send_wildcard 为 True。
总结
通过上述的介绍和示例说明,我们可以清楚地了解在 Flask 中如何使用 Flask-WTF 进行 CSRF 保护,并且在结合其他插件(如 Flask-Login、Flask-CORS)的情况下,如何进行相关操作。这对于开发安全性较高的 Web 应用程序极为重要,可以有效预防一些恶意攻击。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask框架 CSRF 保护实现方法详解 - Python技术站