Tutorial crossdomain.xml; Não deixe o flex complicar!

Tutorial crossdomain.xml; Não deixe o flex complicar!

Bem, quase toda a gente já se deparou com um erro algo parecido como este:

Channel.Security.Error error Error #2048: Violation de la sécurité Sandbox.

Em inglês deverá ser algo como Sandbox Security Violation.

Isto em português mais simples e de programador: Bronca na aplicação. Por vezes não é facil encontrar referencias a este problema.

O flash player (Sandobox) está por si protegido e fechado, não permitindo ao .swf aceder a muitos recursos em outros servidores, e quando este erro acontece é porque simplesmente a nossa aplicação está a tentar aceder a outro servidor/site que não o nosso. Este erro pode até mesmo acontecer no nosso localhost quando estamos a testar qualquer coisa.. (é raro acontecer mas pode acontecer) e o mais estranho de tudo é que pode inclusive acontecer no mesmo servidor… vejam o exemplo:

Tenho um aplicativo (imaginário) em: http://www.msdevstudio.com/teste/teste.swf que tenta aceder ao gateway do amfphp em http://msdevstudio.com/amfphp/gateway.php. E dá o erro em cima… perguntam vocês, mas é o mesmo site/servidor, o porque desse erro ?

Simples, porque o endereço que eu especifiquei para o gateway.php não têm o “www.”

Estranhissimo não é ?? Se retirarem o www do link em cima http://msdevstudio.com/teste/teste.swf já funciona sem qualquer erro…

Há cada coisa estranha neste flash :p Mas eu gosto!

 

Uma das soluções para evitar é verificar sempre os links, mas neste caso em cima é muito comum acontecerem problemas semelhantes.

Este texto todo para explicar que existe uma forma bem facil para ultrapassar estes problemas, e que deve ser estudada porque em muitos casos vai ser necessária (incluindo do flex 4/flash 10), essa forma é um arquivo crossdomain.xml

Este arquivo é um simples .xml que enumera quem pode aceder ao servidor, ou seja, se o flash ler este ficheiro e perceber que o ficheiro permite a todos aceder ao servidor externamente, o flash simplesmente não dará qualquer erro.

Vejam um exemplo: (permite o acesso publico)

<?xml version=”1.0″?>
<cross-domain-policy>
<allow-access-from domain=”*” />
</cross-domain-policy>

ou este: (permite acesso apenas a alguns sites)

<?xml version=”1.0″?>
<cross-domain-policy>
    <allow-access-from domain=”*.example.com” />
    <allow-access-from domain=”www.servidorDoMeuAmigo.com” />
    <allow-access-from domain=”localhost” />
</cross-domain-policy>

Um destes simples pedaços de código vai fazer com que o servidor fique disponivel para o flash aceder a ele de qualquer outro servidor (no primeiro caso), ou apenas a alguns sites (segundo caso). Um exemplo prático; seria muito mais facil se todos os grandes sites que disponibilizam muitas API’s e serviços individuais tivessem este ficheiro no seu servidor. Assim o flash simplesmente não teria qualquer problema a aceder a eles…enquanto isso não acontece continuaremos a usar uma bridge como em php ou outra linguagem server-side que permite ligar a outros servidores.

Devem seguir os seguintes passos, copiar um dos códigos em cima e guardarem-no como crossdomain.xml, e enviem-no para o vosso servidor. tipo: http://www.meuservidor.com/crossdomain.xml

No Flex, façam na vossa tag aplicação:

<mx:Application …. creationComplete=”init()”>

e coloquem este função:

private function init().void {

Security.allowDomain(“http://www.meuservidor.com“);

Security.loadPolicyFile(“http://www.meusvidor.com/crossdomain.xml“);
}

Dependendo dos casos o Security.allowDomain() poderá ser suficiente, mas o exemplo em cima será o mais indicado.

Devem ter em especial atenção questões de segurança (não que existam muitos riscos) mas por causa da possibilidade de qualquer aplicativo usar o vosso servidor abusivamente.

 

Espero que seja util e que acima de tudo tenha desmistificado a confusão que se encontra na net quando se procura sobre o crossdomain.xml.

Abraço.


22 comments

add yours
  • Ved November 26, 2008

    Procurei no Google e achei a solução aqui :D

    Ved

  • Mário Santos November 27, 2008

    hehehe :) Funcionou?

  • ronaldiño March 6, 2009

    Hola como estan hace ya varios dias estoy intentando trabajar con xmlsocket pero cuando tratode conectarme me sale un error :2048 ya coloque el archivo crossdomain y me sigue saliendo estoy desesperado no se que mas hacer si alguien me puede colaborar estaria muy agradecido

  • Mário Santos March 10, 2009

    Hola,
    Estás haciendo como lo hice en el ejemplo anterior, poner lo crossdomain.xml en el servidor y cargarlo en flex?

    Qual es la dirección de su servidor y la dirección de destino del socket??

  • Roberto Lima April 3, 2009

    Mário, estou a utilizar o crossdomain.xml em minha aplicação mas mesmo assim não funciona. Coloco o crossdomain.xml na raiz do meu site http://www.meudominio.com, configurei da forma que você explicou e minha aplicação continua aberta para qualquer dominio. Estou a utilizar o Flex 3 + Flash Player 10.

  • Mário Santos April 6, 2009

    O flash player 10 mudou alguns pontos no que diz respeito ao crossdomain, mas deveria funcionar na mesma… qual o dominio que está a tentar aceder? e em que dominio esta a sua aplicação??

  • David Marques April 22, 2009

    Olá.
    Desde já o obrigado pelo artigo, ajudou-me bastante mas deparei-me com outro problema. Tenho uma situação em que a máquina local que acede ao dominio online tem um servidor instalado onde leva o crossdomain com a permissão de acesso de um domínio online. A minha dúvida é, no php como é que eu referencio o endereço da máquina que esta a aceder? Por exemplo, http://127.0.0.1…. isto não está a funcionar.

    Desde já o meu obrigado

  • Mário Santos April 22, 2009

    Oi David,
    Não entendi bem a duvida, esse php está no servidor?
    Você quer saber o ip do computador que acede a um script .php ? é isso? É que qualquer pc que aceda via web a qualquer endereço web nunca leva o endereço 127.0.0.1 mas sempre o endereço IP que o ISP lhe atribuiu…. Tente explicar melhor a sua duvida.

    Cumps.

  • João Carlos September 26, 2009

    Saudações a todos, David quero dar os parabéns pela tutorial, Mas preciso de uma ajuda, para que você entenda melhor o problema vou explicar a situação, trabalho com uma ferramenta de mailing que fornece um script em HTML para inserção de cadastro de usuários online, mas como trabalho com flash 10 ‘AS3′ quis passar via ‘post’ as variáveis quando testo o swf em localhost funciona o cadastro é inserido na ferramenta Mailing mas quando executo no Servidor esbarro com o problema de segurança, mesmo colocando o crossdomain.xml e add script em meu Classe o erro persiste, gostaria de alguma sugestão para solução do problema, cloquei o

    Security.allowDomain(”http://www.meuservidor.com“);

    Security.loadPolicyFile(”http://www.meusvidor.com/crossdomain.xml“);

    em minha Classe Main e o xml em minha pasta raiz.
    Desde ja agradeço.

  • Thi January 14, 2010

    Valeu cara, valeu msm.
    Estava procurando por exatamente isso!

  • Alessandro Garcia July 3, 2010

    Estou com um problema parecido com o do Joao Carlos, porem utilizo Flex 4 + Flash 10. Quando rodo a aplicação no servidor esbarro no problema de segurança. Como posso contornar este problema sem colocar tudo no mesmo domínio?

  • Guto Kraft July 8, 2010

    Cara, muito obrigado.

    Estava com um problema bem sério ao inserir um flash no wordpress, primeiro ele não encontrava o flash se não definisse as urls absolutas. Consegui resolver esse problema, mas ele começou a não rodar os funções externas do flash com as ditar urls.
    Quebrei a cabeça por um tempo mas seu artigo resolveu meus problemas.

    Muito, muito thanks brow!!

  • Fausto Sampaio July 30, 2010

    Estava quase desistindo sobre o assunto,
    mas com esse tutorial esclareceu tudo e consegui colocar
    minha aplicação para rodar no Servidor Linux com XAMP..

    Valeu.. Mesmo…

    Parabéns Marcio Santos …

  • Douglas September 4, 2010

    Boa tarde Mario!
    Em primeiro lugar parabens pelo seu trabalho aqui no blog!
    Tem ajudado muito!
    Me deparei com um erro de segurança e estou tentado aplicar sua solução mas não esta funcionando! para explicar melhor, estou utilizando o codigo de leitor de feeds que vc desenvolveu e disponibilizou no link: http://blog.msdevstudio.net/2008/06/02/tutorial-package-flex-leitor-rss/

    Se não coloco nenhuma regra de aceeso a outro dominio, localhost ele acessa os sites normalmente porem quando hospedo o sistema, não funciona!…Quando coloco as regras de acesso com a classe crossdomain.xml, nem localhost nem hospedado ele carrega os feeds!

    O que fazer?!

  • Oswaldo September 23, 2010

    Dae brother!
    Estou com uma dúvida, acho que pode me ajudar!
    Eu tenho um “site-A”, que esta chamando um banner que esta hospedade em um “site-B”. Até então ele exibe o banner normalmente, porém o link que contem neste banner não está funcionando.
    Coloquei em ambos servidores o “crossdomain.xml”, e no ActionScript do meu flash:

    Security.allowDomain(“http://www.site-A.com“);
    Security.loadPolicyFile(“http://www.site-A.com/crossdomain.xml“);

    Mas mesmo assim o link não funciona!
    Lembrando que o swf esta hospedade no site-B, mas sendo exibido no site-A. Os link do swf vão para o proprio site-A.

    Aguardo uma ajuda!

  • leonardo September 23, 2010

    Parabén ao amigo, show de bola!!!!

  • Mário Santos September 29, 2010

    Oswaldo, coloque no html da publicação do seu SWF o parametro:
    param name=”AllowScriptAccess” value=”always”

    Deve resolver seu problema…

  • cassio October 8, 2010

    Parabéns,,, me salvou,, já estava indo para o terceiro dia de garimpagem na net em busca de solução.
    muito obrigado !

  • Leonardo November 27, 2010

    Muito bom, resolveu meu problema 100%. Parabéns e obrigado pela dica.

  • Rádio ProTuga FM October 9, 2011

    Obrigação pela informação excelente tutorial :)

  • Luis Carlos July 29, 2012

    Fiz tudo certinho, mas continua dando erro do Sendbox, o que pode ser?

  • Mário Santos July 30, 2012

    O erro que aparece continua sendo o mesmo?

Leave a Comment

Post