Проигрыватель Flash Player передает файлы cookie сеанса автоматически? - PullRequest
16 голосов
/ 29 января 2010

Нет доступа к HTTP-куки из Flash-фильма, но я неоднократно читал, что Flash Player должен автоматически обрабатывать куки-файлы сессии. Однако я не смог найти никакой документации по этому поводу, и она точно не работала с моим клиентом Flex, работающим на бэкэнде Struts с использованием файла cookie JSESSIONID по умолчанию.

Итак, Flash Player обрабатывает сеансовые куки или нет, и если да, как мне их настроить?

Ответы [ 3 ]

6 голосов
/ 29 января 2010

HTTP-запросы от Flash отправляются через браузер - так что да, куки-файлы передаются автоматически. Фактически, я в настоящее время делаю сайт, который обрабатывает вход (и, следовательно, устанавливает cookie-файл сеанса) на странице HTML, а затем перенаправляет пользователя на страницу только для Flash (). Флэш-страница отправляет на сервер множество запросов, используя URLLoader & URLRequest, и я могу проверить куки-файл сеанса для каждого из них.

Тем не менее, вы можете получить доступ к HTTP-куки из Flash, используя ExternalInterface.call () . Убедитесь, что для allowScriptAccess в коде встраивания SWF установлено соответствующее значение.

var cookies:String = ExternalInterface.call("function()
    {
        return document.cookie;
    }()");

Обновление: я не пробовал это (вход в систему во Flash), но вы можете быть правы - Flash может игнорировать Set-Cookie (или все) заголовки ответа. И, к сожалению, Flash не позволяет нам получать доступ к заголовкам ответов. Но поскольку можно получить доступ к заголовкам ответа в ответе AJAX (используя xhr.getResponseHeader), вы можете использовать ExternalInterface и outsource часть входа в AJAX. Возьмите заголовки в ответе AJAX и установите cookie, используя javascript (в соответствии с этой веткой SO , браузер сделает это автоматически). После установки последующие запросы, отправленные с флэш-памяти, будут включать в себя файл cookie сеанса.

Используйте метод ExternalInterface.addCallback, чтобы зарегистрировать метод flash, который будет вызываться из JavaScript.

3 голосов
/ 15 июня 2010

Flash Player обычно подключается к сети через браузер, и в этом случае настройка и получение файлов cookie полностью обрабатываются браузером.

Если сайт отправляет Set-Cookie, это должно сработать.

Вы не можете получить доступ к заголовкам ответов из содержимого Flash, так же как вы не можете получить к ним доступ из JavaScript; Есть фундаментальные причины безопасности, почему это так. Однако возможно, что когда-нибудь Flash Player позволит вам читать файлы cookie через API cookie, как это делает JavaScript. Тем временем ExternalInterface позволит вам позвонить в JS, чтобы прочитать файлы cookie.

В одном случае Flash Player не отправляет файлы cookie или может даже отправлять неправильные файлы cookie. Это когда вы используете FileReference.upload (). Это известная ошибка Flash Player, хотя Adobe и очень ее трудно решить из-за зависимостей NPAPI.

Кстати, JSESSIONID считается небезопасным на данный момент. Он уязвим для атак CSRF, потому что браузер отправит его вслепую, независимо от того, чей документ делает запрос. В большинстве современных систем входа в систему используется скрытое поле формы или другие средства обеспечения доступа к одноразовому имени для входа только для страниц вашего домена.

Хотел бы я сказать, почему ваше приложение не отправляет куки. Вы пытались сравнить его с полностью HTML-версией? Вы наблюдали за обоими сетевыми потоками с помощью анализатора пакетов?

0 голосов
/ 09 июля 2010

Я уверен, что этот поток уже мертв, но недавно я столкнулся с подобной проблемой, используя ASP.NET и FileUpload, и нашел обходной путь, основанный на некоторых работах здесь .

Я создал компонент, который динамически записывает объекты Flex на страницу, чтобы их можно было использовать в UpdatePanels. Напишите мне, если вы хотите, чтобы они код. Чтобы решить вышеупомянутую проблему на страницах, где URLRequest нужно будет отправлять куки аутентификации, я добавляю значения в качестве flashVars.

Этот код работает только в моем объекте, но вы поняли

Dictionary<string, string> flashVars = new Dictionary<string, string>();     
flashVars.Add("auth", Request.Cookies["LOOKINGGLASSFORMSAUTH"].Value);
flashVars.Add("sess", Request.Cookies["ASP.NET_SessionId"].Value);
myFlexObject.SetFlashVars(flashVars);

Затем в объекте Flex проверьте параметры

if (Application.application.parameters.sess != null)
    sendVars.sess= Application.application.parameters.sess;
if (Application.application.parameters.auth != null)
    sendVars.au= Application.application.parameters.auth;

request.data = sendVars;
request.url = url;
request.method = URLRequestMethod.POST;

Наконец, добавьте куки в global.asax BeginRequest

if (Request.RequestType=="POST" && Request.Path.EndsWith("upload.aspx"))
{
    try
    {
        string session_param_name = "sess";
        string session_cookie_name = "ASP.NET_SESSIONID";
        string session_value = Request.Form[session_param_name]; // ?? Request.QueryString[session_param_name];
        if (session_value != null) { UpdateCookie(session_cookie_name, session_value); }
    }
    catch (Exception) { }

    try
    {
        string auth_param_name = "au";
        string auth_cookie_name = FormsAuthentication.FormsCookieName;
        string auth_value = Request.Form[auth_param_name];// ?? Request.QueryString[auth_param_name];

        if (auth_value != null) { UpdateCookie(auth_cookie_name, auth_value); }
    }
    catch (Exception) { }   

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...