2009-11-28 80 views
3

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

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

在此先感谢。

Django 1.2之前的这个问题 - 如果你有一个老版本的解决方案是不同的。

回答

1

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

+0

是的,这是一个很好的观点。这个问题在1.2之前,但对于那些现在偶然发现的人来说,这很好,正如你显然拥有的那样。 – Rubix 2011-03-08 18:58:55

0

如果表单真的必须没有cookies,我认为你只需要禁用CSRF中间件。您可以使用两个表单输入来实现类似的事情,其中​​一个的值是随机的,另一个是第一个和一个秘密的散列。

+0

我刚才发现,如果用户收到一条通知,表示他们没有启用cookie而不是一个丑陋的403错误,那就太好了。 – Rubix 2009-12-02 09:30:56

0

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

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

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

+0

在Django中,变量是通过模板标签处理的。我担心的是显示的403错误页面引用了CSRF错误,我根本无法自定义它。我认为解决这个问题的最佳方法是在处理任何视图之前检查cookie,但我已经提出了一个“make-do”解决方案。 – Rubix 2009-12-06 11:34:14

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 

它指示用户认为最有可能的原因因为错误页面是cookies被禁用(等等),因为我的应用程序不会真的抛出403错误,否则。我一直倾向于“安全通过隐藏”方法,并且在用户不应访问特定页面时抛出404错误。