Безопасность файлов cookie сеанса Flash + pyAMF + Django

Во-первых, если существует настоящий, официальный способ заставить NetConnections flash/flex узурпировать состояние сеанса/cookie окружающей веб-страницы, так что, если пользователь уже вошел в систему, ему не нужно снова вводить учетные данные только для того, чтобы настройте соединение AMF, пожалуйста, остановите меня сейчас и опубликуйте официальный ответ.

За исключением этого, я предполагаю, что его нет, поскольку я искал, и, похоже, его не существует. Я придумал способ сделать это, но хочу получить отзыв о том, безопасно ли это.

  1. Доступ к странице-оболочке для объекта flash всегда будет осуществляться через безопасный https из-за промежуточного программного обеспечения django.
  2. Когда просмотр страницы загружается в Django, он создает объект «псевдоним сеанса» с уникальным ключом, который указывает на текущий сеанс в игре (в котором кто-то якобы вошел в систему)
  3. Эта модель псевдонима сеанса сохраняется, и этот ключ помещается в файл cookie, ключ которого представляет собой другую случайную строку, назовем ее randomcookie.
  4. Это имя ключа randomcookie передается как контекстная переменная и записывается в html как flashvar для swf.
  5. swf тоже грузится только через https
  6. Флэш-приложение использует ExternalInterface для вызова java для получения значения в этом месте случайного файла cookie, а также удаляет файл cookie.
  7. Затем он создает NetConnection для безопасного местоположения https сервера, передавая этот randomcookie в качестве аргумента (данные, а не в URL-адресе) в rpc с использованием файла cookie.
  8. На стороне шлюза pyamf просматривает псевдоним сеанса и получает сеанс, на который он указывает, и регистрирует пользователя на основе этого (и удаляет псевдоним, поэтому его нельзя использовать повторно)
  9. (И запрос шлюза также может установить cookie сеанса и session.session_key на известный идентификатор сеанса, но я мог бы позволить ему создать совершенно новый ключ сеанса... Я предполагаю, что это должно должным образом повлиять на ответ, чтобы он содержит правильный сеансовый ключ)
  10. На этом этапе возвращаемые значения cookie на стороне флэш-памяти должны придерживаться NetConnection, чтобы дальнейшие вызовы аутентифицировались (если соединение аутентифицируется с использованием имени пользователя и пароля обычным способом, это определенно работает, поэтому я думаю, что это безопасная ставка, тестирование скоро подтвердит или опровергнет это)

Итак, это небезопасно, или это будет работать правильно? Насколько я знаю, поскольку html-страница гарантированно работает через ssl, ключ и данные cookie должны быть зашифрованы и не могут быть украдены. Затем информация в нем должна быть безопасной для одноразового использования в качестве временного пароля, повторно отправленного через ssl, потому что шлюз также является https. После этого он использует обычную систему pyAMF через https и не делает ничего необычного.


person eruciform    schedule 24.08.2010    source источник


Ответы (2)


Пока нет ответов на этот вопрос, поэтому лучшее, что я могу сделать, это подтвердить, что это действительно работает физически. Подробнее о том, как настроить Flex Builder для написания html-оболочек, взаимодействующих с шаблонами страниц Django, см. в разделе другая моя запись. Вышеупомянутое было достигнуто с использованием комбинации вышеупомянутого плюс:

Сделал SessionAlias модель:

class SessionAlias(models.Model):
  alias   = models.CharField( max_length=40, primary_key=True )
  session = models.ForeignKey( Session )
  created = models.DateTimeField( auto_now_add=True )

Flex указывает на страницу Django, которая загружается через представление, содержащее:

s = SessionAlias()
s.alias = SessionStore().session_key // generates new 40-char random
s.session = Session.objects.get( session_key=request.session.session_key )
s.save();
randomcookie = SessionStore().session_key // generates new 40-char random
kwargs['extra_context']['randomcookie'] = randomcookie
response = direct_to_template( request, **kwargs )
response.set_cookie( randomcookie, value=alias )

В гибкой html-оболочке, где randomcookie — это место для поиска псевдонима:

<param name="flashVars" value="randomcookie={{randomcookie}}" />

В applicationComplete, где мы получаем randomcookie и находим псевдоним, и входим в систему, используя это:

var randomcookie:String = this.parameters["randomcookie"];
// randomcookie is something like "abc123"
var js:String = "function get_cookie(){return document.cookie;}";
var cookies:String = ExternalInterface.call(js).toString();
// cookies looks like "abc123=def456; sessionid=ghi789; ..."
var alias:String = // strip out the "def456"
mynetconnection.call( "loginByAlias", alias, successFunc, failureFunc );

Которые, в свою очередь, получают доступ к этому pyamf gateway rpc:

from django.contrib.auth import SESSION_KEY, load_backend
from django.contrib.auth.models import User
from django.contrib import auth
from django.conf import settings
def loginByAlias( request, alias ):
  a = SessionAlias.objects.get( alias=alias )
  session_engine = __import__( settings.SESSION_ENGINE, {}, {}, [''] )
  session_wrapper = session_engine.SessionStore( a.session.session_key )
  user_id = session_wrapper.get( SESSION_KEY )
  user = User.objects.get( id=user_id )
  user.backend='django.contrib.auth.backends.ModelBackend'
  auth.login( request, user )
  a.delete()
  return whateverToFlash

И в этот момент, на стороне flash/flex, этот конкретный mynetconnection сохраняет состояние файла cookie сеанса, которое может выполнять будущие вызовы, так что внутри шлюза request.user является должным образом аутентифицированным пользователем, который в первую очередь вошел на веб-страницу.

Еще раз обратите внимание, что настройки запуска/отладки для flex должны использовать https, а также настройки шлюза для NetConnection. И при выпуске этого я должен убедиться, что аутентифицированные пользователи остаются на https.

Будем признательны за любую дополнительную информацию от людей, особенно если есть реальные отзывы об аспектах безопасности этого...

person eruciform    schedule 25.08.2010

IE не предоставляет доступ к файлам cookie при локальной разработке, но если вы публикуете SWF и устанавливаете домен, он должен получать сеанс, как и любой другой браузер. Используйте Firefox 3.6 для локальной сборки гибких приложений.

Протестировано в IE8, Firefox с использованием шлюза pyamf на Flex 3 с NetConnection. Функция шлюза была украшена @login_required

person Plahcinski    schedule 03.06.2011