相关疑难解决方法(0)

由于缺少CSRF,表单验证失败

几天前,我已经重置了我的本地烧瓶环境,而没有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)

我第一次发送一个Getform.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)

python forms flask flask-wtforms

22
推荐指数
3
解决办法
3万
查看次数

当请求中存在 CSRF 令牌时,“CSRF 会话令牌丢失”

我习惯Flask-WTF将其 CSRF 安全功能用于我的 API。正如标题所示,我从 API 获得的响应显示“CSRF 会话令牌丢失”。但是,在检查开发人员工具中的网络选项卡后,最初访问 API 返回的会话出现在 cookie 部分中。此外,CSRF 令牌存在于请求标头中。下面是一些图片来说明我的意思:

请求失败

在此输入图像描述

请求成功

在此输入图像描述


过程

  1. 客户端向 API 发出初始请求
  2. API 创建会话,在浏览器中设置 cookie,并在响应标头中返回 CSRF 令牌
  3. 客户端在每个后续请求中附加 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)

python flask reactjs

7
推荐指数
1
解决办法
7346
查看次数

标签 统计

flask ×2

python ×2

flask-wtforms ×1

forms ×1

reactjs ×1