2014-02-06 1 views
1

Я использую это промежуточное программное обеспечение для перенаправления всех страниц на целевую страницу:. (Часть AuthRequiredMiddleware классаДжанго, csrf_token не отображается на форме после перенаправления

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 отображается в форме.

Что я делаю неправильно?

+0

Я считаю, что это часть защиты csrf обеспечивает (основная проблема - подделка кросс-сайта, кто-то притворяется пользователем, но исходит из другого URL-адреса). Я не уверен, как перевести это решение, но попробуйте, возможно, использовать 'render' вместо' render_to_response'. Это гарантирует, что все процессоры контекста будут работать правильно, возможно, это поможет – yuvi

+3

Это не перенаправление! [HttpResponseRedirect] (https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpResponseRedirect) является перенаправлением. – danihp

+0

'' RequestContext (запрос, {'ru': ru}) '' содержит csrf_token? – erthalion

ответ

1

С wiki page о CSRF:

запроса Cross-сайта подлог, также известный как один-клик атаки или сеанс катания [...] является типом вредоносного эксплуатируют веб-сайта посредством несанкционированные команды передаются от пользователя, которому доверяет веб-сайт .

, а затем, при профилактике:

Проверка, что заголовок в запрос содержит в X-Requested-With (используется на Ruby On Rails до версии v2.0 и Django до v1.2.5), или проверка заголовка HTTP Referer и/или заголовка HTTP-заголовка.

На самом деле, ваша защита csrf работает хорошо. Потому что, хотя я не на 100%, что проблема в частности является недостающим реферером, я думаю, что это вызвано не использованием надлежащей перенаправления, которая вызывает нарушение csrf.

Решение - используйте HttpResponseRedirect и передайте информацию другому виду. Вы можете передать его в качестве данных GET:

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

Вы также можете использовать регулярные выражения в URL-адресах (если это имеет смысл) или использовать sessions если есть что-нибудь чувствительные там.

+0

Да, это работает. Мне также удалось передать шаблонные переменные. Благодаря! – xpanta

Смежные вопросы