当前位置: 首页 > 面试题库 >

表单验证因缺少CSRF而失败

钱华晖
2023-03-14
问题内容

我重置了本地flask环境,但是没有通过捕获它的依赖项,pip freeze然后再将其删除。因此,我不得不重新安装整个堆栈的最新版本。

现在,我突然无法使用表单进行验证了。Flask声称CSRF将丢失。

def register():
    form = RegisterForm()
    if form.validate_on_submit():
       ...
    return make_response("register.html", form=form, error=form.errors)

第一次发送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">

我从没有接触过工作模板,但是仍然将其张贴在这里:

{% 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) }}
            {{ render_field(form.password) }}
            {{ render_field(form.confirm) }}
            <dd><input type=submit value=Register class='btn btn-primary'>
        </dl>
    </form>
</div>
{% endblock %}

这是一个新错误吗?

更新:

我已经重新安装了一切,问题仍然存在。

正如Martijn建议的那样,我正在调试以下方法flask_wtf

def validate_csrf_token(self, field):
        if not self.csrf_enabled:
            return True
        if hasattr(request, 'csrf_valid') and request.csrf_valid:
            # this is validated by CsrfProtect
            return True
        if not validate_csrf(field.data, self.SECRET_KEY, self.TIME_LIMIT):
            raise ValidationError(field.gettext('CSRF token missing'))

最后一个条件是引发验证错误。

field.data = "1391296243.8##1b02e325eb0cd0c15436d0384f981f06c06147ec"
self.SECRET_KEY = None (? Is this the problem)
self.TIME_LIMIT = 3600

你是对的,HMAC比较失败。…两个值每次都不同。

return hmac_compare == hmac_csrf

我在配置中同时定义了SECRET_KEY和CSRF_SESSION_KEY。


问题答案:

在以下情况下,Flask-WTF CSRF基础结构将拒绝令牌:

  • 令牌丢失。此处不是这种情况,你可以在表格中看到令牌。

  • 它太旧了(默认到期时间设置为3600秒或一个小时)。TIME_LIMIT在表单上设置属性以覆盖此属性。这里可能不是这样。

  • 如果'csrf_token'在当前会话中找不到密钥。你显然可以看到会话令牌,所以也可以看到。

如果HMAC签名不匹配;签名基于会话中在'csrf_token'密钥下设置的随机值,服务器端机密以及令牌中的到期时间戳记。

消除了前三种可能性后,你需要验证第四步失败的原因。你可以flask_wtf/csrf.pyvalidate_csrf()函数中的文件中调试验证。

对于你的设置,你需要验证会话设置是否正确(尤其是如果你不使用默认会话配置),以及你使用的是正确的服务器端密码。表单本身可以SECRET_KEY设置属性,但在请求之间不稳定,或者应用程序WTF_CSRF_SECRET_KEY密钥已更改(后者默认为app.secret_keyvalue)。

在0.9.0版中添加了CSRF支持,如果升级了,请查阅特定的CSRF保护文档。标准的Flask-WTF Form类包括 CSRF令牌作为隐藏字段,呈现隐藏字段足以包含它:

{{ form.hidden_tag() }}


 类似资料:
  • 问题内容: 尝试从教程中制作简单表格时,我收到CSRF验证失败的消息。我对CSRF验证实际上是什么进行了一些研究,据我所知,要使用CSRF验证,你需要在html中使用其中的csrf_token标记之一,但是我没有 这是我的模板: 相当简单,位于contact.html 这是我的urlconf:从 应用程序名称为testapp1。当我键入URL(http:// localhost:8000 / te

  • 问题内容: 我使用Spring 4.3.3.RELEASE,Hibernate 5.2.2.Final,数据库是MySQL。我想尝试一下 strategy = GenerationType.TABLE 。正如我对 GenerationType.SEQUENCE 所知, 我需要数据库中的序列来生成ID。 这是我的实体。 Spring注解配置 Spring xml配置 当我运行我的应用程序时,我得到

  • 问题内容: 我要求在通用api模块(多模块项目)中,我不能使用任何形式的hibernate的验证注释,因此我确实使用了javax.validation中的一个可接受的注释。 当我要验证包含NotBlank批注的域对象(我使用vaadin)时,问题就开始了。我得到以下异常 验证通过调用进行 相同的代码与hibernate的NotBlank完美配合 javax的@Size @NotNull也可以正常工

  • 我得到了以下错误无法构建Hibernate SessionFactory;嵌套异常是org.hibernate.tool.schema.spi.模式管理异常:模式验证:缺少表[my.table] 这有版本问题吗?大多数示例都不使用模式,即使是官方的?https://github.com/spring-projects/spring-boot/tree/main/spring-boot-tests/

  • 我对CakePHP(v3.7)比较陌生。我有一个应用程序,其中出现了“缺少Csrf令牌Cookie”错误。 在pplication.php,我有: 表单页面有一个隐藏的表单元素,其中包含_csrfToken。我不明白为什么没有在邮件上找到它? 深入研究后,我发现在CsrfProttionMiddleware.php中,下面的_validateToken()函数的行为如下: $cookie为空(没有

  • 问题内容: 我尝试建立一个非常简单的网站,在该网站中可以将数据添加到sqlite3数据库中。我有两个文本输入的POST表单。 index.html: forms.py: views.py: 但是,当我单击“提交”按钮时,出现403错误: 我已经包含{% csrf_token %}在index.html中。但是,如果这是一个RequestContext问题,我真的不知道在哪里以及如何使用它。我希望所