Django,csrf_令牌在重定向后未出现在窗体上
我使用这个中间件将所有页面重定向到登录页:(属于Django,csrf_令牌在重定向后未出现在窗体上,django,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
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',
)
如果url是(例如)/welcome/
,并且没有执行重定向{%csrf_token%}
工作并显示在表单中。如果用户被重定向,则表单中没有显示csrf_token
我做错了什么?来自关于CSRF:
跨站点请求伪造,也称为一键攻击或
会话骑乘[…]是对网站的一种恶意攻击
未经授权的命令由
网站信托
后来,在预防下:
验证请求的标头是否包含X-Requested-With(已使用
通过RubyonRails(v2.0之前的版本)和Django(v1.2.5之前的版本),或者
HTTP引用器标头和/或HTTP源标头
所以,实际上,你的csrf保护工作得很好。因为,虽然我不是100%认为问题具体在于缺少推荐人,但我确实认为这是由于没有使用正确的重定向导致的,这会触发csrf违规
解决方案-使用HttpResponseRedirect
并将信息传递到另一个视图。您可以将其作为GET data传递:
d = {'ru': ru, 'other': 'variables'}
url = '/landing/?%' % '&'.join( map(lambda x: '='.join(x), d.items()) )
return HttpResponseRedirect(url)
您也可以在url中使用正则表达式模式(如果有意义的话),或者在url中有任何敏感内容时使用正则表达式模式。我相信这是csrf提供的保护的一部分(主要问题是跨站点伪造,有人假装是用户,但来自不同的url)。我不知道如何将此转换为解决方案,但可以尝试使用
render
而不是render\u to\u response
。它确保所有上下文处理器都能正常工作,因此这可能会有所帮助。这不是重定向!是重定向。RequestContext(request,{'ru':ru})
包含csrf\u令牌?出于调试目的,您可以将打印请求.META[“csrf\u COOKIE”]
?此外,如何移动到真正的重定向?这将添加正确的引用。“一组模板变量”-使用真正的重定向不会阻止任何操作,正如@danihp所提到的,将添加正确的引用(这很可能是个问题)是的,它很有效。我还设法传递了模板变量。谢谢!