几天前,我已经重置了我的本地烧瓶环境,而没有pip freeze在删除它之前通过a捕获了依赖关系.因此我不得不重新安装整个堆栈的最新版本.
现在突然之间,我无法再使用表单进行验证.Flask声称CSRF将丢失.
def register():
form = RegisterForm()
if form.validate_on_submit():
...
return make_response("register.html", form=form, error=form.errors)
Run Code Online (Sandbox Code Playgroud)
我第一次发送一个Get我form.errors按预期检索一个空.现在我填写表格并提交并form.errors显示:{'csrf_token': [u'CSRF token missing']}
这太奇怪了.我想知道Flask-WTF是否已经改变,我错误地使用它.
我可以清楚地看到form.CSRF_token存在,为什么它声称它丢失了?
CSRFTokenField: <input id="csrf_token" name="csrf_token" type="hidden" value="1391278044.35##3f90ec8062a9e91707e70c2edb919f7e8236ddb5">
Run Code Online (Sandbox Code Playgroud)
我从未触及过工作模板,但我在这里发布了它:
{% from "_formhelpers.html" import render_field %}
{% extends "base.html" %}
{% block body %}
<div class="center simpleform">
<h2>Register</h2>
{% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
<form class="form-signin" action="{{ url_for('register') }}" method=post>
{{form.hidden_tag()}}
<dl>
{{ render_field(form.name) }}
{{ render_field(form.email) …Run Code Online (Sandbox Code Playgroud) 我习惯Flask-WTF将其 CSRF 安全功能用于我的 API。正如标题所示,我从 API 获得的响应显示“CSRF 会话令牌丢失”。但是,在检查开发人员工具中的网络选项卡后,最初访问 API 返回的会话出现在 cookie 部分中。此外,CSRF 令牌存在于请求标头中。下面是一些图片来说明我的意思:
请求失败
请求成功
过程
例子
前端是用React开发的,后端是用Python(Flask)开发的。两者均由Heroku托管。域名注册商位于GoDaddy,我使用Cloudflare作为我的 DNS 来重新路由流量并设置正确的域名。
示例请求如下所示:
const headers = {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken
};
...
const handleFormSubmission = async e => {
e.preventDefault();
await axios.post('https://backend.com/add-results', { tokenId: tokenId }, { withCredentials: true, headers: headers })
}
Run Code Online (Sandbox Code Playgroud)
并且后端有以下设置:
...
CORS(app, origins=["https://www.example.com"], expose_headers=["Content-Type", "X-CSRFToken"], …Run Code Online (Sandbox Code Playgroud)