相关疑难解决方法(0)

如何解决错误KeyError:'使用CSRF需要密钥.' 在烧瓶应用中使用wtform时?

我一直在尝试使用flask和wtforms以及firebase数据库构建一个Web应用程序,但我不断收到错误消息"KeyError:'使用CSRF需要一个密钥.'"我不知道如何解决它.这是我的代码:

from flask import Flask, render_template, request
from firebase import firebase
from flask_wtf import FlaskForm
from flask_wtf.csrf import CSRFProtect, CSRFError
from wtforms import DateField, StringField, TextAreaField
from wtforms.validators import DataRequired
from wtforms_components import TimeField



app = Flask(__name__)

csrf = CSRFProtect(app)


firebase = firebase.FirebaseApplication("https://uhungry-f9563.firebaseio.com", None)

class myForm(FlaskForm):
        event = StringField("event", validators=[DataRequired()])
        location = StringField("location", validators=[DataRequired()])
        startDay = DateField("startDay", validators=[DataRequired()])
        startTime = TimeField("startTime", validators=[DataRequired()])
        endDay = DateField("endDay", validators=[DataRequired()])
        endTime = TimeField("endTime", validators=[DataRequired()])
        details = TextAreaField("details", validators=[DataRequired()])


count = 0

@app.route('/', methods=['GET' , …
Run Code Online (Sandbox Code Playgroud)

python csrf flask-wtforms firebase-realtime-database

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

Flask-WTF:缺少 CSRF 令牌

一个看似简单的错误——由于“CSRF 令牌丢失”错误而无法通过的表单提交——已经变成了令人费解的一天。我已经阅读了所有与 Flask 或 Flask-WTF 相关的 SO 文章,并且缺少 CSRF 令牌,但似乎没有任何帮助。

以下是详细信息:

遵循Martijin对先前问题的指导方针

如果出现以下情况,Flask-WTF CSRF 基础设施将拒绝令牌:

1)令牌丢失。不是这里的情况,您可以在表单中看到令牌。

令牌肯定存在于我的表单中,并且已成功发布

2)它太旧了(默认过期时间设置为 3600 秒,或一个小时)。在表单上设置 TIME_LIMIT 属性以覆盖它。可能不是这里的情况。

对我来说也可以 - 令牌完全在默认到期时间内

3) 如果在当前会话中没有找到 'csrf_token' 密钥。您显然可以看到会话令牌,所以这也是。

就我而言, session['csrf_token'] 已正确设置并被 Flask 看到

4)如果HMAC签名不匹配;签名基于会话中在“csrf_token”密钥下设置的随机值、服务器端机密和令牌中的到期时间戳。

这是我的问题。提交表单的 CSRF 和会话 CSRF 之间的 HMAC 比较失败。然而我不知道如何解决它。我已经非常绝望(就像其他提问者一样)深入研究 Flask-WTF 代码并设置调试消息以找出发生了什么。据我所知,它是这样工作的:

1)generate_csrf_token()在“form.py”(Flask-WTF)中想要生成一个CSRF令牌。所以它调用:

2)generate_csrf()在“csrf.py”中。如果不存在,该函数会生成一个新的 session['csrf_token']。 在我的情况下,这总是发生- 尽管其他会话变量似乎在请求之间持续存在,但我的调试显示在请求开始时我的会话中从未有“csrf_token”。这是正常的吗?

3)当我在模板上呈现隐藏字段时,生成的令牌被返回并可能合并到表单变量中。(再次,调试显示此令牌存在于表单中并正确提交和接收)

4) 接下来,提交表单。

5) 现在,validate_csrf在 csrf.py 中被调用。但是由于发生了另一个请求,并且 generate_csrf() 生成了一个新的会话 CSRF 令牌,这两个令牌(在会话中和来自表单中)的两个时间戳将不匹配。由于 CSRF 部分由到期日期组成,因此验证失败。

我怀疑问题出在步骤 #2 中,其中为每个请求生成一个新令牌。但是我不知道为什么我的会话中的其他 …

python session flask wtforms flask-wtforms

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

当请求中存在 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-WTF CSRFProtect 给出“400 CSRF 令牌丢失”错误

我正在尝试使用 Flask-WTF 的扩展添加 CSRF 令牌保护CSRFProtect。除了此 CSRF 保护之外,该应用程序不使用 WTForms。

我遵循了文档,但收到“400 Bad Request The CSRF token is Missing”。

from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)
Run Code Online (Sandbox Code Playgroud)

我将以下内容放入模板中(带表单或不带表单),但出现相同的错误。

from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)
Run Code Online (Sandbox Code Playgroud)

python flask flask-wtforms

6
推荐指数
1
解决办法
2万
查看次数