Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
禁用Cookie的Django CSRF问题_Django_Csrf - Fatal编程技术网

禁用Cookie的Django CSRF问题

禁用Cookie的Django CSRF问题,django,csrf,Django,Csrf,在测试我用Django编写的应用程序时,我发现每次提交表单时都会出现HTTP 403禁止的错误。我知道CSRF中间件会检查带有CSRF令牌的cookie,但是对于禁用了cookie的用户,我的方法应该是什么呢 我是否需要检查用户是否在我的每个视图中启用了cookie,或者是否有更有效的方法 提前谢谢 这个问题涉及Django pre-1.2——如果您使用的是旧版本,那么解决方案就不同了。如果表单确实必须在没有cookie的情况下工作,我认为您只需禁用CSRF中间件即可。您可能可以使用两个表单输入

在测试我用Django编写的应用程序时,我发现每次提交表单时都会出现HTTP 403禁止的错误。我知道CSRF中间件会检查带有CSRF令牌的cookie,但是对于禁用了cookie的用户,我的方法应该是什么呢

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

提前谢谢


这个问题涉及Django pre-1.2——如果您使用的是旧版本,那么解决方案就不同了。

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

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

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

仅适用于有相同问题的人:我发现最适合我的解决方案是编写一些中间件,其中显示一个通用的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

它指示用户错误页面最可能的原因是cookies被禁用(除其他外),因为我的应用程序实际上不会抛出403个错误。我一直倾向于“默默无闻的安全”方法,当用户不应该访问特定页面时,抛出404错误。

从Django 1.2开始,您可以使用重写403响应。

我只是想,如果用户收到一个通知,说明他们没有启用cookie,而不是一个丑陋的403错误,那将是一件好事。在Django中,变量是用模板标记处理的。我担心显示的403错误页面引用了CSRF错误,我根本无法对其进行自定义。我认为解决这个问题的最佳方法是在处理任何视图之前检查cookies,但我提出了一个“凑合”的解决方案。是的,这是一个很好的观点。这个问题是在1.2之前提出的,但是对于那些现在偶然发现这个问题的人来说,这是一个很好的提示,正如你所看到的。