【问题标题】:Django CSRF problems with cookies disabled禁用 cookie 的 Django CSRF 问题
【发布时间】:2009-11-28 18:23:08
【问题描述】:

在测试我用 Django 编写的应用程序时,我发现每次提交表单时都会抛出 HTTP 403 Forbidden 错误。我知道 CSRF 中间件会使用 CSRF 令牌检查 cookie - 但是我应该为禁用 cookie 的用户提供什么方法​​?

我是否需要检查用户是否在我的每个视图中启用了 cookie,或者是否有更有效的方法?

提前致谢。

这个问题涉及 Django pre-1.2 -- 如果你有旧版本,解决方案会有所不同。

【问题讨论】:

    标签: django csrf


    【解决方案1】:

    从 Django 1.2 开始,您可以使用 CSRF_FAILURE_VIEW 覆盖 403 响应。

    【讨论】:

    • 是的,这很好。这个问题是 1.2 之前的问题,但对于现在偶然发现这个问题的人来说,这是一件好事,正如您显然已经遇到的那样。
    【解决方案2】:

    仅适用于遇到相同问题的任何人:我发现最适合我的解决方案是编写一些显示通用 403 错误页面的中间件:

    from django.http import HttpResponseForbidden
    from django.conf import settings
    
    from django.template import RequestContext
    from django.shortcuts import render_to_response
    
    class PermissionErrorMiddleware(object):
        def process_response(self, request, response):
            if isinstance(response, HttpResponseForbidden):
                return render_to_response('403.html', context_instance=RequestContext(request)) 
    
            return response
    

    它告诉用户错误页面最可能的原因是 cookie 被禁用(除其他外),因为我的应用程序并没有真正抛出 403 错误。我一直更喜欢“通过默默无闻的安全”方法,当用户不应该访问特定页面时会抛出 404 错误。

    【讨论】:

      【解决方案3】:

      如果表单真的必须在没有 cookie 的情况下工作,我认为你只需要禁用 CSRF 中间件。您也许可以使用两个表单输入来实现类似的东西,其中一个的值是随机的,另一个是第一个的哈希值和一个秘密。

      【讨论】:

      • 我只是觉得如果用户收到他们没有启用 cookie 的通知而不是丑陋的 403 错误会很好。
      【解决方案4】:

      您是否尝试将 csrf 信息作为隐藏的 POST 变量传递?在我参与的项目中,通常使用隐藏输入来完成:

      <input type="hidden" name="csrf" value="<?=$person->csrf?>" />
      

      对不起,PHP 代码,我不记得在 Django 模板中如何做。

      【讨论】:

      • 在 Django 中,变量由模板标签处理。我担心的是显示的 403 错误页面引用了 CSRF 错误,我根本无法自定义它。我认为解决该问题的最佳方法是在处理任何视图之前以某种方式检查 cookie,但我想出了一个“临时”解决方案。
      猜你喜欢
      • 2014-10-09
      • 2012-05-03
      • 2016-11-26
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多