打开新的浏览器选项卡会使Django的CSRF令牌无效,从而阻止表单提交

问题描述 投票:2回答:1

在第二个浏览器选项卡中打开Django 1.10应用程序刷新CSRF令牌。这会破坏第一个选项卡中的所有表单 - 即,之前打开的表单无法再提交,因为旧的CSRF令牌现在无效。

我该如何避免这种行为?

分步示例:

  1. 用户正在查看选项卡A中的表单。
  2. 用户在标签B中打开应用程序。
  3. 用户返回选项卡A并尝试提交表单。
  4. 错误:禁止(403)。 CSRF验证失败。请求中止。

一些细节:

我真的想在应用程序中允许多标签浏览。

Django 1.10 release notes记录了CSRF机制的变化:

为了防止BREACH攻击,CSRF保护机制现在更改每个请求上的表单标记值(同时保留可用于验证不同标记的不变秘密)。

Django的1.9 CSRF documentation对可用性问题有很好的描述。此段落已在1.10 CSRF documentation中删除,但它似乎描述了我遇到的确切问题:

为什么不为每个请求使用新令牌?

从UI角度来看,为每个请求生成新令牌是有问题的,因为它会使所有以前的表单无效。大多数用户会很不高兴地发现,您的网站上打开一个新的标签已无效,他们刚刚花时间在另一个选项卡或他们通过后退按钮访问不能填写表格填写表格。

django csrf django-1.10
1个回答
0
投票

如果您在视图中使用@csrf_protect装饰器,请尝试使用@csrf_exempt装饰器。

在views.py之前:

    from django.views.decorators.csrf import csrf_protect

    @csrf_protect
    def view(request):
         # Render Something

在views.py之后:

    from django.views.decorators.csrf import csrf_exempt

    @csrf_exempt
    def view(request):
         # Render Something

这么晚才回复很抱歉。迟到总比我希望的要好。

© www.soinside.com 2019 - 2024. All rights reserved.