Блог от AS3Coder'a о JavaScript, HTML, CSS... и немного о Flash.

вторник, 25 января 2011 г.

Политика безопасности во Flash Player. Наиболее частные столкновения.

Часто вы сталкивались с ситуацией, когда ваш код не работает по непонятным причинам? Вам кажется, что всё уже проверено сотни раз и вы с уверенностью говорите себе, что здесь нет ошибок, и уже готовы биться головой о клавиатуру :) Спешу вас утешить, скорее всего ошибка не в коде.

В чем же дело?

А дело может быть в том, что вы нарушаете политику безопасности Flash Player, сами того не зная. Иногда Flash Player просто промолчит об этом :)

Как это предупредить?

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

В этом посте я хочу рассказать о наиболее частых нарушениях политики безопасности, с которыми мы сталкиваемся.

Загрузка контента с доменов отличных, о того с которого запущена страница с .swf-файлом

*.load();

Практически на весь загружаемый контент с других доменом и даже поддоменов накладываются ограничения на загрузку, отображение или исполнения сценариев (если вы загружаете исполняемый .swf-файл). Например, .swf-файл не выполнит свой сценарий, если вы загрузили его без разрешения.

BitmapData.draw();

Метод не отрисует дисплей объект, если в нем есть загруженный контент с другого домена без разрешения. Это касается дочерних элементов класса Loader, и даже TextField, если в нем есть картинки вставленные посредством HTML-разметки.

Возможно эти ограничения действуют и в других методах, с которыми я не сталкивался. Так что если, что-то упустил - добавляйте в комментариях.

Как получить разрешение?

Домен, с которого вы грузите контент, должен разрешить вам использовать его. Делается это двумя способами в зависимости от типа загружаемого контента.

1. checkPolicyFile

Это файл, где перечислены домены, которым разрешено использовать контент. Называться такой файл должен сrossdomain.xml и лежать в корне сайта. Содержимое должно выглядеть следующим образом:

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="
yoursite.com"/>
</cross-domain-policy>

Когда .swf-файл, запущенный с вашего домена, пытается выполнить запросы на другой домен, Flash Player делает автоматически делает запрос на сrossdomain.xml расположенный на другом домене. Если в нем указано разрешение для вашего домена, то Flash Player разрешит в полной мере выполнять запросы.

2. Security.allowDomain() или Security.allowInsecureDomain()

Этот способ предусмотрен для исполняемых .swf-файлов. Если Flash Player встретит в сценарии метод Security.allowDomain() или Security.allowInsecureDomain() (для https-протокола) с параметром равным доменному имени вашего сайта, то он разрешает исполнение сценариев на вашем сайте.

System.allowDomain("yoursite.com");

Взаимодействие с клиентским окружением

Еще одной из частых и самых болезненых, является ситуация когда не выполняются методы никак не связанные с сетью. Болезнь заключается в том, что Flash Player, просто молчит о нарушениях. Приведу список наиболее частых методов, в которых мы сталкиваемся с этим.

FileReference.browse();

Метод не выполнится, если внутри .swf-файла не было события нажатия клавиши мыши.

SharedObject.flush();

Метод не выполнится если размер .swf-файла встроенного на страницу меньше окна с параметрами Flash Player'a (215 x 128).

LocalConnection.send();

Метод не выполнится если вкладка со страницей, на которой запущен .swf-файл, неактивна.

Stage.displayState = StageDisplayState.FULL_SCREEN;

Метод не выполнится, если внутри .swf-файла не было события нажатия мыши.


...

Если вы сталкивались еще с чем-то подобным, пишите в комментарии я дополню этот список.

Доступ к HTML-окружению на странице

.swf-файл загруженный с другого домена (даже с разрешением) не имеет доступ к HTML-окружению на вашей странице. Для этого ему нужно разрешение. Только на этот раз, вы выдаете его сами.

При вставке .swf-файла на страницу необходимо указать параметр AllowScriptAccess с соответствующим параметром:
  • always - Разрешает доступ всем .swf-файлам
  • sameDomain - Разрешает доступ .swf-файлами, загруженным с того же домена, что и страница
  • never - Запрещает доступ всем .swf-файлам
<embed AllowScriptAccess="always" height="100" src="http://www.foreigndomain.com/example.swf" type="application/x-shockwave-flash" width="100"></embed>

Внимание: Учтите, когда вы открываете доступ к HTML-окружению .swf-файлам с неизвестных вам доменов, вы подвергаете всю безопасность на вашей страницы.

Дополнительный материал для изучения

Для более детального ознакомления со всеми правилами безопасности Flash Player, вы можете заглянуть официальную справку на русском языке в раздел "Безопасность проигрывателя Flash Player".

Также смотрите спецификацию по файлу crossdomain.xml
      

4 комментария:

  1. Переключение в Fullscreen тоже не выполнится без щелчка мышкой

    ОтветитьУдалить
  2. по умолчанию для удобства разработки, компилируемый swf запускается с типом песочницы "локальная" с "установленным доверием". при выкладке на тестовую удаленную площадку - эта же флешка уже запускается с политикой "удаленная" со всеми вытекающими

    ОтветитьУдалить
  3. >>LocalConnection.send();

    >>Метод не выполнится если вкладка со страницей, на которой запущен .swf-файл, неактивна.

    У меня все работает отлично. 10-ть свф файлов общаются между собой прекрасно находясь в разных вкладках.

    Только в флешплеер 10.1 сделали что свф если не активна, frameRate падает, все приостанавливается, что конечно повышает производительность, но localConnection медленно отправляет данные.

    ОтветитьУдалить
  4. С кириллическими доменами все веселее.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например <b>, <i>, <a>

Поиск по блогу

Обо мне



Farid Shamsutdinov (AS3Coder)
Russia, Tatarstan, Kazan
as3coder@gmail.com

Подробнее...

Постоянные читатели

© 2014 Farid Shamsutdinov. При копировании материалов, ссылка на источник обязательна. Технологии Blogger.