A mesma política de origem
Eu queria criar um wiki da comunidade sobre políticas de mesma origem HTML / JS para ajudar a quem procura esse tópico. Este é um dos tópicos mais pesquisados sobre SO e não existe um wiki consolidado, então aqui vou eu :)
A mesma política de origem impede que um documento ou script carregado de uma origem obtenha ou defina propriedades de um documento de outra origem. Essa política remonta ao Netscape Navigator 2.0.
Quais são algumas das suas formas favoritas de adotar políticas de mesma origem?
Por favor, mantenha exemplos detalhados e, de preferência, também vincule suas fontes.
javascript
ajax
same-origin-policy
David Titarenco
fonte
fonte
not constructive
tag parece totalmente insana. Votou para reabrir.Respostas:
O
document.domain
métodoObserve que este é um método iframe que define o valor de document.domain como um sufixo do domínio atual. Se fizer isso, o domínio mais curto será usado para verificações de origem subsequentes. Por exemplo, suponha que um script no documento em
http://store.company.com/dir/other.html
execute a seguinte instrução:Após a execução dessa instrução, a página passaria na verificação de origem com
http://company.com/dir/page.html
. No entanto, pelo mesmo raciocínio, company.com não poderia definirdocument.domain
aothercompany.com
.Com esse método, você poderá executar o javascript de um iframe originado em um subdomínio em uma página originada no domínio principal. Este método não é adequado para recursos entre domínios, pois navegadores como o Firefox não permitem alterar o domínio
document.domain
para um domínio completamente estranho.Fonte: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
O método de compartilhamento de recursos de origem cruzada
O compartilhamento de recursos de origem cruzada (CORS) é um rascunho de trabalho do W3C que define como o navegador e o servidor devem se comunicar ao acessar fontes de origens. A idéia básica por trás do CORS é usar cabeçalhos HTTP personalizados para permitir que o navegador e o servidor saibam o suficiente um sobre o outro para determinar se a solicitação ou resposta deve ter êxito ou falhar.
Para uma solicitação simples, que usa um
GET
ouPOST
sem cabeçalhos personalizados e cujo corpo étext/plain
, a solicitação é enviada com um cabeçalho extra chamadoOrigin
. O cabeçalho Origin contém a origem (protocolo, nome de domínio e porta) da página solicitante, para que o servidor possa determinar facilmente se deve ou não servir uma resposta. UmOrigin
cabeçalho de exemplo pode ser assim:Se o servidor decidir que a solicitação deve ser permitida, ele envia um
Access-Control-Allow-Origin
cabeçalho ecoando a mesma origem que foi enviada ou*
se é um recurso público. Por exemplo:Se esse cabeçalho estiver ausente ou as origens não corresponderem, o navegador não permitirá a solicitação. Se tudo estiver bem, o navegador processará a solicitação. Observe que nem as solicitações nem as respostas incluem informações sobre cookies.
A equipe da Mozilla sugere em seu post sobre o CORS que você deve verificar a existência da
withCredentials
propriedade para determinar se o navegador suporta o CORS via XHR. Você pode associar a existência doXDomainRequest
objeto a todos os navegadores:Observe que, para que o método CORS funcione, você precisa ter acesso a qualquer tipo de mecânico de cabeçalho do servidor e não pode simplesmente acessar qualquer recurso de terceiros.
Fonte: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
O
window.postMessage
métodowindow.postMessage
, quando chamado, faz com que umMessageEvent
seja despachado na janela de destino quando qualquer script pendente que deve ser executado for concluído (por exemplo, os manipuladores de eventos restantes, sewindow.postMessage
for chamado de um manipulador de eventos, tempos limite pendentes definidos anteriormente, etc.). AMessageEvent
tem o tipo de mensagem, umadata
propriedade que está definido para o valor da cadeia do primeiro argumento fornecido parawindow.postMessage
, umaorigin
propriedade que corresponde à origem do documento principal na janela chamandowindow.postMessage
no momentowindow.postMessage
foi chamado, e umasource
propriedade que é a janela de qualwindow.postMessage
é chamado.Para usar
window.postMessage
, um ouvinte de evento deve ser anexado:E uma
receiveMessage
função deve ser declarada:O iframe externo também deve enviar eventos corretamente via
postMessage
:Qualquer janela pode acessar esse método em qualquer outra janela, a qualquer momento, independentemente do local do documento na janela, para enviar uma mensagem. Conseqüentemente, qualquer ouvinte de evento usado para receber mensagens deve primeiro verificar a identidade do remetente da mensagem, usando a origem e possivelmente as propriedades de origem. Isso não pode ser subestimado: a falha em verificar as propriedades
origin
e possivelmentesource
ativa os ataques de script entre sites.Fonte: https://developer.mozilla.org/en/DOM/window.postMessage
fonte
Access-Control-Allow-Origin: http://www.stackoverflow.com/
vez de:Access-Control-Allow-Origin: http://www.stackoverflow.com
(barra no final do URL), ele não funciona no Safari e no FF, mas funciona no Chrome. Obviamente, sem barra funciona bem em todos os navegadores.postMessage
método funciona apenas para navegadores que o suportam, pois é uma adição ao HTML5. Este plugin tenta explicar isso. Apenas mencionando, porque estou aprendendo isso da maneira mais difícil.O método de proxy reverso
A configuração de um proxy reverso simples no servidor permitirá que o navegador use caminhos relativos para as solicitações do Ajax, enquanto o servidor atuaria como proxy para qualquer local remoto.
Se estiver usando mod_proxy no Apache, a diretiva de configuração fundamental para configurar um proxy reverso é a
ProxyPass
. É normalmente usado da seguinte maneira:Nesse caso, o navegador poderia solicitar
/ajax/web_service.xml
como um URL relativo, mas o servidor serviria como um proxy parahttp://other-domain.com/ajax/web_service.xml
.Uma característica interessante desse método é que o proxy reverso pode distribuir facilmente solicitações para vários back-ends, atuando como um balanceador de carga .
fonte
Eu uso JSONP.
Basicamente, você adiciona
na sua página.
some_func () deve ser chamado para que você seja notificado de que os dados estão.
fonte
O AnyOrigin não funcionou bem em alguns sites https, então acabei de escrever uma alternativa de código aberto chamada Whateverorigin.org que parece funcionar bem com https.
Código no github .
fonte
A maneira mais recente de superar a política de mesma origem que eu encontrei é http://anyorigin.com/
O site foi criado para você fornecer apenas um URL e gerar código javascript / jquery para você, permitindo que você obtenha o html / data, independentemente de sua origem. Em outras palavras, torna qualquer URL ou página da Web uma solicitação JSONP.
Eu achei bastante útil :)
Aqui está um exemplo de código javascript de anyorigin:
fonte
Não posso reivindicar crédito por esta imagem, mas ela corresponde a tudo que sei sobre esse assunto e oferece um pouco de humor ao mesmo tempo.
http://www.flickr.com/photos/iluvrhinestones/5889370258/
fonte
O JSONP vem à mente:
fonte
Pessoalmente,
window.postMessage
é a maneira mais confiável que eu encontrei para navegadores modernos. Você precisa fazer um pouco mais de trabalho para se certificar de não se deixar abrir para ataques de XSS, mas é uma troca razoável.Também existem vários plug-ins para os kits de ferramentas Javascript populares,
window.postMessage
que oferecem funcionalidade semelhante aos navegadores mais antigos usando os outros métodos discutidos acima.fonte
Bem, eu usei curl no PHP para contornar isso. Eu tenho um serviço da web em execução na porta 82.
Aqui está o javascript que faz a chamada para o arquivo PHP
Meu HTML é executado no WAMP na porta 80. Então, lá vamos nós, a mesma política de origem foi contornada :-)
fonte
Aqui estão algumas soluções alternativas e explicações sobre a mesma política de origem:
Thiru's Blog - Solução alternativa para a mesma origem do navegador
fonte
Isso analisa praticamente o que está disponível no mercado: http://www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier
Para a solução postMessage, consulte:
https://github.com/chrissrogers/jquery-postmessage/blob/master/jquery.ba-postmessage.js
e uma versão ligeiramente diferente:
https://github.com/thomassturm/ender-postmessage/blob/master/ender-postmessage.js
fonte