Política de mesma origem — JavaScript chamando PHP
-
26-09-2019 - |
Pergunta
Eu sei que este é um tópico popular, mas eu ainda tenho que encontrar uma resposta que é completamente abrangente.
Eu estou tentando criar uma maneira simples para os nossos 'clientes' para colocar um Mapa do Google no seu site, que apresenta a posição de nossos clientes (ou um subconjunto dele) no mapa.Os clientes estão em um banco de dados MySQL, que é transformada em XML on-the-fly através de um script PHP (como por exemplo do Google).Isso funciona bem no meu site, mas quando eu tento-em outro site o xmlHTTPRequest não é permitido olhar para o PHP como em outro domínio.
Eu posso contornar esta escrevendo outro arquivo PHP no outro domínio que simplesmente lê o arquivo PHP no domínio original.Mas não a todos os nossos clientes terão o PHP rodando em seus servidores.Existe alguma maneira que eu possa retornar o XML resultados do nosso banco de dados usando JavaScript?
Um par de pontos:
O JavaScript que faz com que o xmlHTTPRequest ainda se senta em nossa servidor -- nossos clientes link de uma tag de script.Eu pensei que poderia ser suficiente, mas a 'origem' (de acordo com o google Chrome, pelo menos) é ainda visto como domínio#2
Isso é ótimo:se eu usar uma referência absoluta no xmlHTTPRequest (e.g.pedido.abrir('GET', 'http://mydomain.com/api/foo.php', true)), em seguida, ele irá falhar com o IE, mas se eu usar uma referência relativa ('/api/foo.php') isso vai funcionar.
Eu não sei o suficiente sobre isso, mas eu poderia usar o JSON?Eu vi:'script src="http://..../someData.js?callback=some_func"' mas não sei como, eu faria 'someData.js' olha como JSON?(Eu estou pensando muito em termos de funções, o que provavelmente está incorreta?).
Eu tentei adicionar:cabeçalho("Access-Control-Allow-Origin:*");para a parte superior do PHP que gera o XML, mas não é realmente fazer muita coisa que eu posso dizer!
Se eu usar um wrapper PHP no servidor do cliente, qual é a vantagem de usar uma solicitação cURL, ao invés de simples file_get_contents ou fopen?
Desculpe, muitas perguntas, mas nenhuma orientação seria muito apreciada.
Enorme obrigado,
Tapete
Solução
Uma maneira fácil de contornar isso é deixar seu script PHP retornar algo como:
callback_function(YOUR_DATA);
Então, no script JS incluído no site dos clientes, você insira dinamicamente um <script>
que tem src
Apontando para o seu script PHP:
(function() {
var scriptElement = document.createElement('script');
scriptElement.type = 'text/javascript';
scriptElement.async = true;
scriptElement.src = 'http://example.org/yourScript.php?data=...';
var container = document.getElementsByTagName('script')[0];
container.parentNode.insertBefore(scriptElement, container);
})();
Esta técnica é chamada JSONP e deve fazer exatamente o que você quer;)
Outra maneira de contornar o problema seria permitir o domínio cruzado xmlHttPrequest na política de segurança de conteúdo. Mas acho que apenas o Firefox 4 apóia isso agora.
Outras dicas
Você pode usar o JSON ao invés de XML?Se assim for, sua opção 3) é provavelmente vai ser a sua melhor aposta.Existem riscos de segurança com esta abordagem, e ele deve ser usado apenas para fontes conhecidas e confiáveis.
Mais leituras: http://www.codeproject.com/KB/aspnet/JSONToJSONP.aspx
O JavaScript é do lado do cliente, mas o banco de dados não é. O JavaScript não pode extrair diretamente de um banco de dados MySQL.