首页 文章

禁用了cookie的Django CSRF问题

提问于
浏览
3

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

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

提前致谢 .

This question dealt with Django pre-1.2 -- the solution is different if you have an older version.

4 回答

  • 0

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

  • 1

    对于那些遇到同样问题的人:我发现最适合我的解决方案是编写一些显示通用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错误 .

  • 0

    如果表单真的必须没有cookie,我想你只需要禁用CSRF中间件 . 你可能能够使用两个表单输入实现类似的东西,其中一个的值是随机的,另一个是第一个和秘密的哈希值 .

  • 1

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

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

    对不起PHP代码,我不记得如何在Django模板中做到这一点 .

相关问题