Django CSRF框架有很多失败

时间:2009-11-19 18:59:57

标签: django csrf

我的站点上的CSRF Django中间件(来自SVN中继的版本)出现了很多故障。我得到的唯一错误是:CSRF失败:原因= CSRF令牌丢失或不正确。

我如何诊断这些CSRF错误的来源?我自己不能导致CSRF错误,但是我设置网站只要触发CSRF错误视图就给我发电子邮件,所以我知道它经常发生。

4 个答案:

答案 0 :(得分:15)

我真的很难做到这一点,但最终做到了。这是我的主要问题(Django 1.2测试版):

  1. 根据您使用的Django版本,确保您的中间件正确。这在Django的在线文献中有很好的介绍。
  2. 确保每个表单中都有{%csrf_token%},只需按照表单的开头标记
  3. 这是我的主要问题,请确保所有表单都有一个首页,即不要在表单中执行操作=“”。
  4. 确保您的设置电子邮件都是正确的。我必须做这样的事情:

    EMAIL_HOST = 'mail.my-domain.com' EMAIL_HOST_USER ='我在服务器上的用户名' EMAIL_HOST_PASSWORD = '的passwd' EMAIL_PORT = '26'#在我阅读的许多论坛帖子中,#经常好像是25或26 托管域上的DEFAULT_FROM_EMAIL='noreply@domain.com'#,确保已设置并发送 SERVER_EMAIL ='noreply @ domain.com'#与上述相同的电子邮件

    1. 将request_context添加到render_to_response
    2. 的末尾

      返回render_to_response('contact.htm',{'favicon':r'____。ico',                                    '更多东西':”......”                                    '更多东西':”......”                                    '更多东西':”......”                                       },                        context_instance = RequestContext(request))

      确保您拥有:

      TEMPLATE_CONTEXT_PROCESSORS = (
           "django.contrib.auth.context_processors.csrf",
           .....
         )
      

      在settings.py文件中。

      请注意,这真的不是一个怎样的,这正是我为了让我的工作所做的。现在发布它的原因是我在讨论这个话题的论坛上看到很多人只是关闭了csrf_token。

答案 1 :(得分:2)

当中间件成功阻止跨站点请求伪造攻击时,应该发生CSRF错误。可能是验证检查Web服务器日志的最佳方法,您应该看到与先前请求无关的请求。

答案 2 :(得分:1)

另外,您应该检查MIDDLEWARE_CLASSES文件中settings.py的顺序。应该看起来像这样:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.locale.LocaleMiddleware',
)
最后

LocaleMiddleware。 对我来说,解决方案是RequestContext实例和排序。

答案 3 :(得分:0)

确保您的GET请求的查看功能如下所示:

def login_view():
c = {}
c.update(csrf(request))
request.session.set_expiry(0)
if request.method == 'GET':
  return render_to_response('newform.html',<b>c</b>)

然后检查newform.html的视图来源,它必须有隐藏字段。

<`form action="" method="post" name="loginform"> <`div style='display:none'`><`input type='hidden' name='csrfmiddlewaretoken' value='6f4dee99ab2f5e7201e057cb63' />

此处,操作可以引用同一页action=""