Подтвердить что ты не робот

Проигрывает ли Flash Player файлы cookie автоматически?

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

Итак, работает ли Flash Player с файлами сеансов cookie или нет, и если да, то как его настроить?

4b9b3361

Ответ 1

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

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

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

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

Используйте метод ExternalInterface.addCallback для регистрации метода Flash, который может быть вызван из javascript.

Ответ 2

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.

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

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

Ответ 3

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

Я построил компонент, который динамически записывает объекты Flex на страницу, чтобы их можно было использовать в UpdatePanels. Сообщите мне, хотите ли вы их код. Чтобы решить указанную выше проблему на страницах, где необходимо будет отправлять cookie аутентификации по 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;

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