欢迎访问宙启技术站
智能推送

Flask中实现CSRF保护的 实践

发布时间:2024-01-12 01:38:33

在Flask中实现CSRF(Cross-Site Request Forgery)保护是十分重要的,可以防止恶意网站伪造用户请求并执行非授权的操作。下面是Flask中实现CSRF保护的 实践以及一个使用例子。

一、使用Flask-WTF扩展

Flask-WTF是一个方便的第三方扩展,可以帮助我们轻松地实现CSRF保护。首先,我们需要在Flask应用中安装Flask-WTF扩展。

pip install flask-wtf

然后,在应用中导入扩展并配置一个密钥,用于生成和校验CSRF令牌。

from flask_wtf.csrf import CSRFProtect

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'

csrf = CSRFProtect(app)

二、在表单中插入CSRF令牌

使用Flask-WTF可以方便地在表单中插入CSRF令牌。只需在表单类中导入CSRF令牌字段并将其添加到表单中即可。

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.csrf.session import SessionCSRF
from flask_wtf.csrf import generate_csrf

class MyForm(FlaskForm):
    username = StringField('Username')
    password = StringField('Password')
    submit = SubmitField('Submit')
    
    csrf_token = StringField('CSRF Token')

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.csrf_token.data = generate_csrf()

在表单中加入CSRF令牌字段后,我们需要修改表单的HTML模板,并在其中添加CSRF令牌的字段。

<form method="POST">
    {{ form.csrf_token }}
    {{ form.username.label }}
    {{ form.username }}
    {{ form.password.label }}
    {{ form.password }}
    {{ form.submit }}
</form>

三、在表单提交时验证CSRF令牌

最后,在包含敏感操作的视图函数中,我们需要验证通过表单提交的CSRF令牌是否有效。我们可以使用csrf.protect()装饰器来保护视图函数。

from flask import Flask, render_template, request
from flask_wtf.csrf import CSRFProtect

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'

csrf = CSRFProtect(app)

@app.route('/login', methods=['GET', 'POST'])
@csrf.protect()
def login():
    if request.method == 'POST':
        # 表单提交时验证CSRF令牌的有效性
        if request.form['csrf_token'] != csrf_token:
            return 'Invalid CSRF Token'

        # 其他登录逻辑

    return render_template('login.html', form=form)

在这个例子中,csrf.protect()装饰器保护了login()视图函数,确保只有有效的CSRF令牌才能执行登录逻辑。

通过上述 实践,我们可以在Flask中实现简单且有效的CSRF保护。请注意,实际实现中还有其他安全措施和 实践需要考虑,例如将CSRF令牌存储在会话中进行校验等。为了确保系统的安全性,请参考Flask和Flask-WTF文档中的进一步说明。