Flask-WTF设置CSRF令牌的时间限制

时间:2018-02-06 10:22:34

标签: python flask csrf flask-wtforms

我目前正在使用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我发现validate_csrf_token的{​​{1}}实际上从未被调用过。

方法_FlaskFormCSRF在方法validate_csrf内调用,在这种情况下,从不考虑元参数。

我不明白这是否是包的错误或者我错过了什么。

更新:

示例代码:

app.py

protect()

模板/ test_form.html

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())

requirements.txt

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

项目结构

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

我还在this line上设置了调试断点来检查FLASK_APP=app.py flask run 的实际值,值始终为time_limit

1 个答案:

答案 0 :(得分:0)

在您的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的值,以解决无法为每个表单设置过期时间的问题。