我正在使用此中间件将所有网页重定向到目标网页:( 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。
我做错了什么?
答案 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,如果有敏感的话。