Flash + pyAMF + безопасность файлов cookie сеанса Django - PullRequest
0 голосов
/ 24 августа 2010

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

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

  1. Доступ к странице-оболочке для флэш-объекта всегда приводит к безопасному https из-за промежуточного программного обеспечения django
  2. Когда представление страницы загружается в Django, оно создает объект «псевдоним сеанса» с уникальным ключом, который указывает на текущий сеанс в игре (в который кто-то якобы вошел)
  3. Эта модель псевдонима сеанса сохраняется, и этот ключ помещается в файл cookie, ключом которого является другая случайная строка, назовите ее randomcookie
  4. Это имя ключа randomcookie передается как переменная контекста и записывается в html как flashvar в swf
  5. SWF также загружается только через https
  6. Флэш-приложение использует ExternalInterface для вызова java, чтобы получить значение в этом месте randomcookie, а также удаляет 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 и ничего не делает необычным.

Ответы [ 2 ]

0 голосов
/ 04 июня 2011

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

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

0 голосов
/ 26 августа 2010

Пока нет ответов на этот вопрос, поэтому лучшее, что я могу сделать, это подтвердить, что он действительно работает физически.Для получения подробной информации о том, как настроить 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 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.

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

...