2013-12-03 5 views
4

Моя текущая установка - AngularJS + Django 1.5, и я полностью отбросил использование механизма шаблонов Django (то есть, бэкэнд - это в значительной степени сервер API).Без шаблонов Django + AJAX: обновляется ли токен CSRF Django во время сеанса просмотра?

Поскольку я не использую тег шаблона csrf_token, Django, в свою очередь, не устанавливает и не отправляет cookie csrftoken в ответ. Как указано в официальных документах, декоратор ensure_csrf_cookie() должен использоваться, чтобы заставить украшенный вид отправить файл cookie csrftoken.

Я применил декоратор ensure_csrf_cookie() к представлению, которое обслуживает первый запрос GET, который мой веб-клиент вызывает при начальной загрузке. При этом мой веб-клиент получает трюк CSRF и отныне разрешается вызывать небезопасные методы (например, POST) на сервер.

Указанная выше настройка работает нормально, только если токен CSRF остается неизменным до окончания сеанса просмотра.

Вопрос: Обновлен ли токен CSRF от Django во время сеанса просмотра? Если «да», значит ли это, что мне нужно будет применить декоратор ensure_csrf_cookie() ко всем представлениям, которые у меня есть?

+0

1) Скорее всего, но IMHO это деталь реализации, и я советую полагаться на это поведение. 2) Просто напишите базовый класс Mixin или View, украшенный 'sure_csrf_cookie()' и используйте его в качестве базы для вашего представления API (вероятно, есть много шаблонов, которые вы можете переместить там). –

+0

Thx @PauloScardine. Я согласен с тем, что вы сказали. Будут ли какие-либо последствия для безопасности, если cookie-файл-куранд csrf установлен для всех ответов сервера? – tamakisquare

+0

AFAIK нет никаких последствий для безопасности, и такие рамки, как Django-REST-Framework, делают это - на самом деле вы должны рассмотреть его в следующем проекте, так как он покупает вам такие вещи, как разбиение на страницы, дросселирование и систему фантазийных разрешений. –

ответ

5

1) Обновлен ли токен CSRF Django во время сеанса просмотра?

Похоже, что токен CSRF уникален для каждой сессии, но он основан на моих наблюдениях, у меня нет «официального» источника. С Angular.js я использую следующий код без проблем:

angular.module('app', ...) 
    .config(function($httpProvider) { 
    var cookies = document.cookie.split(';'); 
    var csrftoken = _.find(cookies, function(v) { 
         return v.trim().indexOf('csrftoken=') == 0; 
        }); 
    if(csrftoken) { 
     $httpProvider.defaults.headers.common['X-CSRFToken'] = csrftoken.split('=')[1]; 
    } 
    }) 

Поскольку я служу HTML из Джанго, по времени Angular бутстрэпов печенья уже есть.

2) Если «да», значит ли это, что мне нужно применить декоратор обеспечения_csrf_cookie() ко всем представлениям, которые у меня есть?

Вы можете попробовать CORS, если CSRF. Otto Yiu поддерживает пакет django-cors-headers, который, как известно, корректно работает с API-интерфейсами REST.

Некоторой (непроверенная) идеи применить ensure_csrf_cookie():

  • обезьяны патч APIView
  • создать CSRFCookie подмешать и добавить его к вашему мнению
  • применяется ensure_csrf_cookie() к ваших базовых классов
0

Предоставляя поддержку @Paulo Scardine идеи применения ensure_csrf_cookie() (что я считаю действительным и полезным), я хотел бы добавить новую возможность е решение, если у вас обязательно будет ensure_csrf_cookie() во всех ваших взглядах. Вы можете написать обычай middleware и реализовать логику, которая находится внутри ensure_csrf_cookie.Что-то вроде этого:

На вашем app.middleware.py:

from django.middleware.csrf import get_token 


class EnsureCsrfCookie(object): 

    def process_request(self, request): 
     # Forces process_response to send the cookie 
     get_token(request) 

и курсов по файлу settings добавить к промежуточному к MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (
    ., 
    ., 
    ., 
    'app.middleware.EnsureCsrfCookie', 
    ., 
    ., 
    ., 
) 

Это только одна идея больше сталкиваться с этой проблемой , Надеюсь, это может быть полезно кому-то в будущем.

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