Перекрестное выполнение сценариев

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Если два SWF-файла, написанные на ActionScript 3.0, или два HTML-файла, выполняемых в AIR, размещены на одном домене (например, URL-адрес одного SWF-файла — http://www.example.com/swfA.swf, а другого http://www.example.com/swfB.swf), то код, определенный в одном файле может анализировать и изменять переменные, объекты, свойства, методы и прочее другого файла и наоборот. Это называется перекрестным выполнением сценариев.

Если два файла находятся в разных доменах, например http://siteA.com/swfA.swf и http://siteB.com/swfB.swf, то по умолчанию Flash Player или AIR не позволяет swfA.swf выполнять сценарии, связанные с swfB.swf, и наоборот. SWF-файл предоставляет доступ к SWF-файлам из других доменов путем вызова Security.allowDomain(). Вызывая метод Security.allowDomain("siteA.com"), файл swfB.swf дает разрешение на выполнение сценариев SWF-файлам с домена siteA.com.

Перекрестное выполнение сценариев не поддерживается между SWF-файлами версии AVM1 и SWF-файлами версии AVM2. SWF-файлы версии AVM1 созданы с использованием ActionScript 1.0 или ActionScript 2.0. (AVM1 и AVM2 — это сокращения от ActionScript Virtual Machine (виртуальная машина ActionScript). Тем не менее, для обмена данными между файлами версий AVM1 и AVM2 можно использовать класс LocalConnection.

В любой ситуации междоменного выполнения сценариев важно иметь четкое представление о двух участвующих в нем сторонах. В рамках данного обсуждения сторона, выполняющая перекрестный сценарий, называется вызывающей стороной (обычно это вызывающий SWF-файл), а вторая сторона называется вызываемой стороной (обычно это вызываемый SWF-файл). Когда файл siteA.swf выполняет сценарий для siteB.swf, siteA.swf является вызывающей стороной, а siteB.swf — вызываемой, как показано на следующей схеме.

Междоменные разрешения, получаемые с помощью метода Security.allowDomain(), не являются симметричными. В предыдущем примере файл siteA.swf может выполнять сценарии для файла siteB.swf, но файл siteB.swf не может выполнять сценарии для файла siteA.swf, так как файл siteA.swf не вызвал метод Security.allowDomain(), чтобы разрешить выполнение сценариев SWF-файлами из домена siteB.com. Чтобы настроить симметричные разрешения, метод Security.allowDomain() должны вызвать оба SWF-файла.

Проигрыватель Flash Player защищает SWF-файлы от перекрестного выполнения сценариев не только с другими SWF-файлами, но и с HTML-файлами. Выполнение сценариев HTML-файла для SWF-файла может происходить при установке обратного вызова с помощью метода ExternalInterface.addCallback(). Когда HTML-файл выполняет сценарии для SWF-файла в другом домене, вызываемый SWF-файл должен вызвать метод Security.allowDomain(), как и в том случае, когда вызывающей стороной является SWF-файл, иначе операция завершится ошибкой. Дополнительные сведения см. в разделе «Элементы управления автора (разработчика)».

Кроме того, в проигрывателе Flash Player предусмотрены элементы управления безопасностью при выполнении сценариев SWF-файлом для HTML-файла. Дополнительные сведения см. в разделе «Управление доступом к внешним URL-адресам.

Безопасность рабочей области

Некоторые свойства и методы объекта Stage доступны для всех спрайтов или фрагментов ролика, добавленных в список отображения.

Однако объект Stage имеет владельца, которым является первый загруженный SWF-файл. Следующие свойства и методы объекта Stage по умолчанию доступны только тем SWF-файлам, которые находятся в той же изолированной программной среде, что и владелец рабочей области.

Свойства

Методы

align

addChild()

displayState

addChildAt()

frameRate

addEventListener()

height

dispatchEvent()

mouseChildren

hasEventListener()

numChildren

setChildIndex()

quality

willTrigger()

scaleMode

 

showDefaultContextMenu

 

stageFocusRect

 

stageHeight

 

stageWidth

 

tabChildren

 

textSnapshot

 

width

 

Чтобы SWF-файл из другой изолированной программной среды мог получить доступ к этим свойствам и методам, SWF-файл, являющийся владельцем рабочей области, должен вызвать метод Security.allowDomain(), чтобы разрешить доступ для домена из внешней изолированной программной среды. Дополнительные сведения см. в разделе «Элементы управления автора (разработчика)».

Свойство frameRate является исключением. Значение frameRate может считывать любой SWF-файл. Однако изменить это свойство могут только файлы, находящиеся в той же изолированной программной среде, что и владелец рабочей области (или те, которые получили доступ благодаря вызову метода Security.allowDomain()).

Также существуют ограничения по использованию методов removeChildAt() и swapChildrenAt() объекта Stage, но они отличаются от остальных ограничений. В данном случае, чтобы получить возможность вызывать эти методы, код должен находиться в одном домене с владельцем не рабочей области, а затрагиваемых дочерних объектов, либо эти дочерние объекты должны вызвать метод Security.allowDomain().

Обход списка отображения

Доступ SWF-файла к экранным объектам, загруженным из других изолированных программных сред, ограничен. Чтобы SWF-файл мог получить доступ к экранному объекту, созданному SWF-файлом из другой изолированной программной среды, вызываемый SWF-файл должен разрешить доступ домену вызывающего SWF-файла с помощью метода Security.allowDomain(). Дополнительные сведения см. в разделе «Элементы управления автора (разработчика)».

Чтобы можно было получить доступ к объекту Bitmap, загруженному объектом Loader, на исходном сервере графического файла должен быть файл политики для URL, разрешающий домен SWF-файла, который пытается получить объект Bitmap (см. раздел Элементы управления веб-сайта (файлы политики)).

Объект LoaderInfo, соответствующий загруженному файлу (и объекту Loader), имеет следующие три свойства, определяющие отношения между загруженным объектом и объектом Loader: childAllowsParent, parentAllowsChild и sameDomain.

Безопасность событий

В целях безопасности доступ к событиям, связанным со списком отображения, ограничен в зависимости от того, в какой изолированной программной среде находится экранный объект, отправляющий событие. События в списке отображения проходят стадии восходящей маршрутизации и захвата (см. описание в разделе Обработка событий). Проходя фазы восходящей маршрутизации и захвата, событие проходит путь от исходного экранного объекта вверх по цепочке родительских экранных объектов в списке отображения. Если родительский объект и исходный экранный объект находятся в разных изолированных программных средах, фазы восходящей маршрутизации и захвата завершаются, не доходя до родительского объекта, если между владельцами родительского и исходного объектов не установлены доверительные отношения. Взаимное доверие можно установить, выполнив следующие действия.

  1. SWF-файл, который является владельцем родительского объекта, должен вызвать метод Security.allowDomain(), чтобы указать в качестве доверенного домен SWF-файла, который является владельцем исходного объекта.

  2. SWF-файл, который является владельцем исходного объекта, должен вызвать метод Security.allowDomain(), чтобы указать в качестве доверенного домен SWF-файла, который является владельцем родительского объекта.

Объект LoaderInfo, соответствующий загруженному файлу (и объекту Loader), имеет следующие два свойства, определяющие отношения между загруженным объектом и объектом Loader: childAllowsParent и parentAllowsChild.

Для событий, отправляемых не экранными объектами, нет таких ограничений по безопасности.