Flash + Pyamf + Django Session Security Security
-
30-09-2019 - |
Вопрос
Во-первых, если есть истинный, официальный способ наличие Flash / Flex's NetConnection
S USURP Сеанс / Cookie State из окружающей веб-страницы, так что если пользователь уже вошел в систему, им не нужно предоставлять учетные данные еще раз, просто чтобы настроить связь AMF, пожалуйста, оставьте меня сейчас и опубликуйте официальный ответ.
За исключением того, что я предполагаю, что нет, как я искал, и кажется, не существует. Я придумал средство для этого, но хочу, чтобы некоторые отзывы были ли он безопасны.
- Доступ к спутниковой странице для флэш-объекта всегда будет закрепить HTTPS из-за промежуточного программного обеспечения Django
- Когда вид на странице загружается в Django, он создает объект «псевдонима сеанса» с уникальным ключом, который указывает на текущую сессию в пьесе (в котором кто-то якобы вошел в систему)
- Эта модель смещения сеанса сохраняется, и этот ключ помещен в печенье, ключ которого является еще одной случайной строкой, вызовите его RandomCookie
- Это имя ключа RandomCookie передается как переменная контекста и записана в HTML в качестве Flashvar для SWF
- SWF также загружен только через HTTPS
- Флэш-приложение использует
ExternalInterface
позвонить в Java, чтобы схватить значение в этом местоположении RandomCookie, а также удаляет cookie - Тогда это создает
NetConnection
в безопасном сервере HTTPS местоположение, передавая этот RandomCookie в качестве аргумента (данные, не в URL) к RPC входа в систему - На стороне шлюза Pyamf смотрит на псевдоним сеанса и получает сеанс, который указывает на его, и входит в систему пользователем на основе этого (и удаляет псевдоним, так что его нельзя повторно использовать)
- (И запрос шлюза также может настроить сеанс cookie и Session.session_key к известному идентификатору сеанса, но я мог бы позволить ему сделать целый новый сеанс ключ ... Я предполагаю, что это должно правильно повлиять на ответ, чтобы это Содержит правильный ключ сеанса)
- На данный момент возвращенные значения файла cookie на стороне Flash должны придерживаться
NetConnection
Так что дальнейшие вызовы аутентифицированы (если соединение аутентифицируется с помощью имени пользователя и пароля нормальным способом, это определенно работает, поэтому я думаю, что это безопасная ставка, тестирование скоро докажет или опровергает это)
Итак, это небезопасно, или эта работа будет должным образом? Насколько я знаю, поскольку HTML-страница гарантированно будет через SSL, ключ и данные cookie должны быть зашифрованы и не в состоянии воровать. Затем информация в нем должна быть безопасна, чтобы использовать одноразовые, что и в основном временный пароль, снова отправляемый через SSL, потому что шлюз также является HTTPS. После этого он использует нормальную систему Pyamf через HTTPS и не делать ничего из обычного.
Решение
Нет никаких ответов на это до сих пор, поэтому лучшее, что я могу сделать, это подтвердить, что это на самом деле физически работают. Подробнее о том, как настроить Flex Builder, чтобы написать HTML-обертки, которые общаются с шаблонами Django Pages, см. Мой другой пост. Отказ Вышеуказанное было достигнуто с использованием комбинации вышеупомянутых, плюс:
Сделать 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 )
В Flex 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
Является ли правильно аутентифицированный пользователь, который вошел в веб-страницу в первую очередь.
Опять обратите внимание, что настройки Run / Debug для Flex должны использовать HTTPS, а также настройки шлюза для NetConnection
. Отказ А при выпуске этого я должен убедиться, что аутентифицированные пользователи остаются на HTTPS.
Любая дополнительная информация от людей будет оценена, особенно если есть настоящие отзывы о аспектах безопасности этого ...
Другие советы
Т.е. не дает доступа к файлам cookie в локальном развитии, но если вы публикуете SWF и поместите на домен, он должен забрать сеанс, как всегда другой браузер. Используйте Firefox 3.6, чтобы построить ваши приложения Flex локально.
Испытано в IE8 Firefox с использованием шлюза Pyamf на Flex 3 с NetConnection. Функция шлюза была украшена @Login_required