Есть ли доступное решение для обеспечения поддержки xsrf / csrf для механизма приложений Google? - PullRequest
17 голосов
/ 05 декабря 2011

Подделка межсайтовых запросов обычно используется в Интернете уже несколько дней.Я сталкиваюсь с этим на своем собственном сайте, развернутом на движке Google App.Я узнал об этом, изучив журналы доступа.Есть ли какая-либо библиотека XSRF / CSRF или другое решение, доступное для механизма приложений, которое я могу использовать.И какую нагрузку он добавит на мой сайт?

Ответы [ 3 ]

10 голосов
/ 17 декабря 2011

Я использую этот код, вызываемый из функции запроса инициализации basehandler

def init_csrf(self):
    """Issue and handle CSRF token as necessary"""

    self.csrf_token = self.request.cookies.get('c')
    if not self.csrf_token:
        self.csrf_token = str(uuid4())[:8]
        self.set_cookie('c', self.csrf_token)
    if self.request.method == 'POST' and self.csrf_protect \
        and self.csrf_token != self.request.get('_csrf_token'):
        raise CsrfException('Missing or invalid CSRF token.')

Я взял его из Пример приложения Facebook на холсте содержит код для обработки crsf. Я практически не тестировал его, но я включил его в свой проект, так как у меня есть приложение Canvas для Facebook, которое работает в FB как iframe. Это позволяет каждому обработчику запроса иметь переменную экземпляра, которую вы можете установить в false, если он генерирует исключение для обычных случаев.

Я еще не проверил его полностью, но у меня есть материал о токенах CRSF для Google App Engine на python. Если вы хотите точно узнать подробности того, как я учусь использовать его в эти дни, вы можете клонировать мой репозиторий .

6 голосов
/ 20 декабря 2011

Может быть, вы можете попробовать использовать промежуточное программное обеспечение защиты Django contrib csrf .Не уверен, что он будет работать "из коробки" в AppEngine, но стоит попробовать.

5 голосов
/ 05 декабря 2013

Я сделал декоратор:

def csrf_protected(handler):
    def inner(self, *args, **kwargs):
        token = self.request.params.get('token')
        if token and self.session.get('csrf') == token:
            self.session['csrf'] = uuid.uuid1().hex
            handler(self, *args, **kwargs)
        else:
            self.abort(400)
    return inner

Есть токен в шаблоне и сеансе

...