Cross-scripting

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

Se dois arquivos escritos com o ActionScript 3.0 , ou dois arquivos HTML executados no AIR, forem servidos no mesmo domínio, por exemplo, se a URL de um arquivo SWF for http://www.example.com/swfA.swf e a URL do outro for http://www.example.com/swfB.swf, o código definido em um arquivo poderá examinar e modificar variáveis, objetos, propriedades, métodos e assim por diante na ordem e vice-versa. Isso é chamado de cross-scripting .

Se dois arquivos forem servidos em domínios diferentes, por exemplo, http://siteA.com/swfA.swf e http://siteB.com/siteB.swf, por padrão, o Flash Player e o AIR não permitirão que o swfA.swf execute script do swfB.swf nem que o swfB.swf execute script do swfA.swf. O arquivo SWF dá permissão a arquivos SWF de outros domínios chamando Security.allowDomain() . Com a chamada de Security.allowDomain("siteA.com") , o swfB.swf concede aos arquivos SWF do siteA.swf permissão para executar script nele.

O cross-scripting não é suportado entre arquivos SWF AVM1 e SWF AVM2. Um arquivo SWF AVM1 é criado usando o ActionScript 1.0 ou o ActionScript 2.0. (AVM1 e AVM2 se referem a ActionScript Virtual Machine.) No entanto é possível usar a classe LocalConnection para enviar dados entre o AVM1 e o AVM2.

Em qualquer situação entre domínios, é importante que as duas partes envolvidas sejam bem-definidas. Para fins desta discussão, o lado que executa o cross-scripting é chamado de parte de acesso (normalmente o SWF que faz o acesso) e o outro lado é chamado de a parte que está sendo acessada (normalmente o SWF que está sendo acessado). Quando o siteA.swf executa script no siteB.swf, o siteA.swf é a parte que acessa e o siteB.swf é a parte que está sendo acessada, conforme mostrado na ilustração a seguir:

Permissões entre domínios estabelecidas com o método Security.allowDomain() são assimétricas. No exemplo anterior, o siteA.swf pode executar script no siteB.swf, mas o siteB.swf não pode executar script no siteA.swf, pois o siteA.swf não chamou o método Security.allowDomain() para conceder permissão aos arquivos SWF no siteB.com para executar script nele. É possível configurar permissões simétricas fazendo com que os dois arquivos SWF chamem o método Security.allowDomain() .

Além de proteger arquivos SWF contra a execução de script entre domínios originadas por outros arquivos SWF, o Flash Player protege arquivos SWF conta a execução de script entre domínios originadas por arquivos HTML. A execução de script de HTML para SWF pode ocorrer com retornos de chamada estabelecidos por meio do método ExternalInterface.addCallback() . Quando a execução de script de HTML para SWF cruza domínios, o arquivo SWF que está sendo acessado deve chamar o método Security.allowDomain() exatamente como quando a parte que faz o acesso é um arquivo SWF ou haverá falha na operação. Para obter mais informações, consulte Controles de autor (desenvolvedor) .

Além disso, o Flash Player fornece controles de segurança para execução de script de SWF para HTML. Para obter mais informações, consulte Controle do acesso à URL de saída .

segurança de Palco

Algumas propriedades e métodos do objeto Stage estão disponíveis para qualquer entidade gráfica ou clipe de filme na lista de exibição.

No entanto o objeto Stage é considerado como tendo um proprietário: o primeiro arquivo SWF carregado. Por padrão, as seguintes propriedades e métodos do objeto Stage estão disponíveis apenas para arquivos SWF na mesma caixa de proteção de segurança que o proprietário do Palco:

Propriedades

Métodos

alinhar

addChild()

displayState

addChildAt()

frameRate

addEventListener()

height

dispatchEvent()

mouseChildren

hasEventListener()

numChildren

setChildIndex()

quality

willTrigger()

scaleMode

showDefaultContextMenu

stageFocusRect

stageHeight

stageWidth

tabChildren

textSnapshot

width

Para que um arquivo SWF em uma caixa de proteção diferente daquela do proprietário do Palco acesse essas propriedades e métodos, o arquivo SWF do proprietário do Palco deve chamar o método Security.allowDomain() para permitir o domínio da caixa de proteção externa. Para obter mais informações, consulte Controles de autor (desenvolvedor) .

A propriedade frameRate é um caso especial, qualquer arquivo SWF pode ler a propriedade frameRate . No entanto, apenas aqueles que estão na caixa de proteção de segurança do proprietário do Palco (ou aqueles que receberam permissão por uma chamada para o método Security.allowDomain() ) podem alterar a propriedade.

Também há restrições nos métodos removeChildAt() e swapChildrenAt() do objeto Stage, mas essas são diferentes das outras restrições. E vez de ser necessário estar no mesmo domínio que o proprietário do Palco para chamar esses métodos, o código deve estar no mesmo domínio que o proprietário dos objetos filho afetados ou os objetos filho podem chamar o método Security.allowDomain() .

Como percorrer a lista de exibição

A capacidade de um arquivo SWF acessar objetos de exibição carregados de outras caixas de proteção é restrita. Para que um arquivo SWF acesse um objeto de exibição criado por outro arquivo SWF em uma caixa de proteção diferente, o arquivo SWF que está sendo acessado deve chamar o método Security.allowDomain() para permitir acesso pelo domínio do arquivo SWF que está acessando. Para obter mais informações, consulte Controles de autor (desenvolvedor) .

Para acessar um objeto Bitmap que foi carregado por um objeto Loader, um arquivo de política de URL deve existir no servidor de origem do arquivo de imagem, e esse arquivo de política deve conceder permissão ao domínio do arquivo SWF que está tentando acessar o objeto Bitmap (consulte Controles de site (arquivos de política) ).

O objeto LoaderInfo que corresponde a um arquivo carregado (e ao objeto Loader) inclui as três seguintes propriedades que definem o relacionamento entre o objeto carregado e o objeto Loader: childAllowsParent , parentAllowsChild e sameDomain .

Segurança de eventos

Eventos relacionados à lista de exibição têm limitações de acesso de segurança com base na caixa de proteção do objeto de exibição está despachando o evento. Um evento na lista de exibição tem fases de bolhas e de captura (descritas em Manipulação de eventos ). Durante as fases de bolhas e de captura, um evento migra do objeto de exibição de origem por meio de objetos de exibição pai na lista de exibição. Se um objeto pai estiver em uma caixa de proteção de segurança diferente do objeto de exibição de origem, a fase de captura e de bubble parará abaixo daquele objeto pai, a menos que haja confiança mútua entre o proprietário do objeto pai e o proprietário do objeto de origem. Essa confiança mútua pode ser obtida pelo seguinte:

  1. O arquivo SWF que possui o objeto pai deve chamar o método Security.allowDomain() para confiar no domínio do arquivo SWF que possui o objeto de origem.

  2. O arquivo SWF que possui o objeto de origem deve chamar o método Security.allowDomain() para confiar no domínio do arquivo SWF que possui o objeto pai.

O objeto LoaderInfo que corresponde a um arquivo carregado (e ao objeto Loader) inclui as duas seguintes propriedades que definem o relacionamento entre o objeto carregado e o objeto Loader: childAllowsParent e parentAllowsChild .

Para eventos despachados de objetos que não são objetos de exibição, não há verificações de segurança ou implicações relacionadas à segurança.