重定向后,Django,csrf_token不会出现在表单上

时间:2014-02-06 07:45:41

标签: django

我正在使用此中间件将所有网页重定向到目标网页:( AuthRequiredMiddleware类的一部分。

def process_request(self, request):
    assert hasattr(request, 'user') 
    if not request.user.is_authenticated():
        path = request.path_info.lstrip('/')
        if path not in ['ipn/', 'pp_cancel/', 'pp_success/', 'sitemap/', 'welcome/']:
            lang = request.GET.get('lang', 'en')
            ru = request.GET.get('ru', '')
            return render_to_response('landing_en.html', RequestContext(request, {'ru': ru}))

这是我的settings.py

MIDDLEWARE_CLASSES = (                                                                                                                                                                                   
     'django.middleware.cache.UpdateCacheMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.locale.LocaleMiddleware',
     'main.common.SessionBasedLocaleMiddleware.SessionBasedLocaleMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.cache.FetchFromCacheMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'main.common.tz_middleware.TimezoneMiddleware',
     'main.common.sslMiddleware.SSLRedirect',
     'main.common.RedirectAllMiddleware.AuthRequiredMiddleware',
)

如果网址是(例如)/welcome/并且没有执行重定向{% csrf_token %}正常工作并在表单中显示。如果重定向用户,则表单中不显示csrf_token。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

来自wiki page关于CSRF:

  

跨站点请求伪造,也称为一键攻击或   会话骑行[...]是一种对网站的恶意利用   从而用户发送未经授权的命令   网站信任。

以后,在预防中:

  

验证请求的标头是否包含X-Requested-With(已使用   通过Ruby on Rails之前的v2.0和Django之前的v1.2.5),或者检查   HTTP Referer标头和/或HTTP Origin标头。

实际上,你的csrf保护工作正常。因为,虽然我不是100%认为问题是特别缺失的推荐人,但我确实认为这是因为没有使用适当的重定向来触发csrf违规。

解决方案 - 使用HttpResponseRedirect并将信息传递给其他视图。您可以将其作为GET数据传递:

 d = {'ru': ru, 'other': 'variables'}
 url = '/landing/?%' % '&'.join( map(lambda x: '='.join(x), d.items()) )
 return HttpResponseRedirect(url)

你也可以在网址中使用正则表达式模式(如果有意义的话)或使用sessions,如果有敏感的话。