【问题标题】:Flask-WTF set time limit on CSRF tokenFlask-WTF 对 CSRF 令牌设置时间限制
【发布时间】:2018-07-16 09:02:13
【问题描述】:

我目前正在使用 Flask-WTF v0.13.1,我的网站上有一些表格,所有表格都包括 CSRF 令牌。

由于某些原因,我必须在每个表单上设置不同的过期时间,到目前为止,我可以在创建 csrf 令牌时手动设置 time_limit 值。

我想更新到 v0.14,根据 changelog time_limit 已经消失,文档中没有关于如何更改它的参考。 查看源代码,我看到表单有一个csrf_time_limit 元参数。

我试图在我的表单上设置该参数:

from flask_wtf import FlaskForm

class myForm(FlaskForm):
    class Meta:
        csrf_time_limit = 7200

    content = TextAreaField('content')

虽然调试 csrf.py module 我看到 _FlaskFormCSRFvalidate_csrf_token 实际上从未被调用过。

方法validate_csrf 在方法protect() 中被调用,在这种情况下元参数从不考虑。

我不明白这是软件包的错误还是我遗漏了什么。

更新:

示例代码:

app.py

from flask import Flask, render_template, request
from flask_wtf.csrf import CSRFProtect
from flask_wtf import FlaskForm
from wtforms import IntegerField

csrf = CSRFProtect()
app = Flask(__name__)
app.config.update(dict(
    SECRET_KEY="super secret key"
))

csrf.init_app(app)

class MyForm(FlaskForm):
    class Meta:
        csrf_time_limit = 1

    id = IntegerField('id')

@app.route("/", methods=['GET', 'POST'])
def test_form_csrf():
    if request.method == 'POST':
        myForm = MyForm(request.form)
        print(myForm.id.data)

    return render_template('test_form.html', myForm= MyForm())

模板/test_form.html

<form method="post" action="/">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
    {{ myForm.id }}
    <input type="submit" value="test" />
</form>

requirements.txt

click==6.7
Flask==0.12.2
Flask-WTF==0.14.2
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
Werkzeug==0.14.1
WTForms==2.1

项目结构

app.py
templates
|
--- test_form.html

要运行代码,

FLASK_APP=app.py flask run

我还在this line上放了一个调试断点来检查time_limit的实际值,该值始终是3600

【问题讨论】:

    标签: python flask csrf flask-wtforms


    【解决方案1】:

    按照您的changelog 链接,我查看了提交并找到了these lines

    if time_limit is None:
        time_limit = current_app.config.get('WTF_CSRF_TIME_LIMIT', 3600)
    

    app.config['WTF_CSRF_TIME_LIMIT'] 设置为更短的值似乎可行。我已使用app.config['WTF_CSRF_TIME_LIMIT'] = 30 将其设置为 30 秒,并且表单在该时间后过期,但我没有尝试过比默认值更长的值。

    我不确定您是否可以即时更改 app.config 值,以解决无法为每个表单设置过期的问题。

    【讨论】:

    • 我可以确认在配置对象中设置WTF_CSRF_TIME_LIMIT 在使用Flask-WTF==0.14.2WTForms==2.2.1 时仍然有效。我可以看到此时最初的问题是 1.5 岁,所以我认为将这个快速更新留在此处是个好主意。
    猜你喜欢
    • 2017-01-08
    • 2018-03-11
    • 2017-09-27
    • 2016-11-08
    • 2017-05-24
    • 2022-12-21
    • 2013-08-28
    • 2020-07-15
    • 2020-02-10
    相关资源
    最近更新 更多