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

时间:2017-04-08 15:51:54

标签: django csrf django-1.10

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

如何避免此行为?

分步示例:

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

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

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

      

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

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

      

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

         

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

1 个答案:

答案 0 :(得分: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

很抱歉收到的回复太晚。 迟到总比没有希望好。