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

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 .

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