我正在尝试在我的 Flask 应用程序中使用
csrf
令牌,但我注意到在网站打开一段时间(1 小时)后,除非重新加载,否则它将无法工作,所以我做了一些测试并发现因为 csrf
令牌即将过期,所以我尝试在每个请求中生成一个新的令牌(这就是我想要的,所以人们不能一遍又一遍地使用相同的令牌),
但还是不行。
from flask import Flask, redirect, url_for, render_template_string
from flask_wtf.csrf import CSRFProtect, generate_csrf
from datetime import timedelta
app = Flask(__name__)
app.secret_key = 'key'
csrf = CSRFProtect(app)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(seconds=10)
html= """
<form method="POST" action="{{ url_for('redirect_route') }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<button type="submit">Redirect</button>
</form>
"""
@app.route('/')
def home():
generate_csrf()
return render_template_string(html)
@app.route('/redirect', methods=['POST'])
def redirect_route():
generate_csrf()
return redirect(url_for('home'))
app.run(debug=True)
我有线路
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(seconds=10)
用于测试,所以是的,正如你所看到的,我在两条路线之前都有
generate_csrf()
,但仍然在 10 秒后,我收到错误并需要重新加载网站。
app.config['SESSION_REFRESH_EACH_REQUEST'] = True
这也没有改变任何事情
session.permanent = True
不起作用,在 return 语句中传递新的
csrf
标记也不起作用。
所以我真的不知道该怎么办。我希望每个请求都有自己的
csrf
,这样它就不能再次使用,并且我不想让网站保持打开状态以使其无法工作并在我按下按钮时给出错误,它应该只发出一个新的东西或东西。
显然,CSRF 令牌没有理由过期:https://security.stackexchange.com/q/56467
在您的配置中,设置:
WTF_CSRF_TIME_LIMIT = None
我不太确定
'PERMANENT_SESSION_LIFETIME'
,但我认为你将用户会话与CSRF令牌混为一谈,它们是不同的东西。