Estou fazendo uma chamada ajax para meu próprio servidor em uma plataforma que eles definem para impedir essas chamadas ajax (mas preciso que ele busque os dados do meu servidor para exibir os dados recuperados do banco de dados do meu servidor). Meu script ajax está funcionando, ele pode enviar os dados para o script php do meu servidor para permitir o processamento. No entanto, ele não pode recuperar os dados processados, pois são bloqueados pelo"Access-Control-Allow-Origin"
Não tenho acesso à fonte / núcleo dessa plataforma. então não consigo remover o script que não me permite fazer isso. (A P / SI usou o Console do Google Chrome e descobriu este erro)
O código Ajax, como mostrado abaixo:
$.ajax({
type: "GET",
url: "http://example.com/retrieve.php",
data: "id=" + id + "&url=" + url,
dataType: 'json',
cache: false,
success: function(data)
{
var friend = data[1];
var blog = data[2];
$('#user').html("<b>Friends: </b>"+friend+"<b><br> Blogs: </b>"+blog);
}
});
ou existe um JSON
código equivalente ao script ajax acima? Eu acho que JSON
é permitido.
Espero que alguém possa me ajudar.
Respostas:
Coloque isso em cima de retrieve.php:
Observe que isso desativa efetivamente a proteção CORS e deixa seus usuários expostos a ataques. Se você não tiver certeza absoluta de que precisa permitir todas as origens, troque isso para uma origem mais específica:
Consulte a resposta da pilha a seguir para entender melhor
Access-Control-Allow-Origin
https://stackoverflow.com/a/10636765/413670
fonte
Ok, mas todos sabem que o * é um curinga e permite scripts entre sites de todos os domínios?
Você gostaria de enviar vários
Access-Control-Allow-Origin
cabeçalhos para todos os sites autorizados - mas infelizmente não é oficialmente suportado o envio de váriosAccess-Control-Allow-Origin
cabeçalhos ou a inserção de várias origens.Você pode resolver isso verificando a origem e enviando de volta aquela no cabeçalho, se for permitido:
Isso é muito mais seguro. Você pode editar a correspondência e alterá-la para uma função manual com alguma expressão regular ou algo parecido. Pelo menos isso enviará de volta apenas 1 cabeçalho e você terá certeza de que é o local de origem da solicitação. Observe que todos os cabeçalhos HTTP podem ser falsificados, mas esse cabeçalho é para a proteção do cliente. Não proteja seus próprios dados com esses valores. Se você quiser saber mais, leia um pouco sobre CORS e CSRF.
Por que é mais seguro?
Permitindo acesso a partir de outros locais, seu site confiável permite o aumento do número de sessões. Vou dar um pequeno exemplo - a imagem do Facebook permite uma origem curinga - isso significa que você pode criar seu próprio site em algum lugar e acionar chamadas AJAX (ou abrir iframes) para o facebook. Isso significa que você pode pegar as informações de login do facebook de um visitante do seu site. Pior ainda - você pode escrever
POST
criar solicitações de e publicar dados no facebook de alguém - apenas enquanto eles navegam no seu site.Seja muito cauteloso ao usar os
ACAO
cabeçalhos!fonte
header()
substitui o cabeçalho anterior do mesmo tipo. Então, na verdade, tudo o que você está fazendo é definir o último cabeçalho. A entrada manual afirma que você pode definir um segundo parâmetrofalse
para impedir que o cabeçalho anterior seja substituído.Aviso , o Chrome (e outros navegadores) reclamarão que vários cabeçalhos da ACAO estão definidos se você seguir algumas das outras respostas.
O erro será algo como
XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access.
Tente o seguinte:
fonte
Corrigi esse problema ao chamar um Controlador MVC3. Eu adicionei:
antes do meu
E também
$.ajax
estava reclamando que ele não aceita o cabeçalho do tipo Content na minha chamada ajax, então comentei porque sei que seu JSON estava sendo passado para a ação.Espero que ajude.
fonte
É uma péssima ideia usar
*
, o que deixa você aberto a scripts entre sites. Você basicamente quer seu próprio domínio o tempo todo, com escopo definido nas configurações SSL atuais e, opcionalmente, em domínios adicionais. Você também deseja que todos sejam enviados como um cabeçalho. O seguinte sempre autorizará seu próprio domínio no mesmo escopo SSL da página atual e, opcionalmente, também poderá incluir qualquer número de domínios adicionais. Ele os enviará todos como um cabeçalho e substituirá o (s) anterior (es), se outra coisa já os tiver enviado para evitar qualquer chance do navegador reclamar sobre o envio de vários cabeçalhos de controle de acesso.Uso:
Você entendeu a ideia.
fonte
Você já tentou adicionar o cabeçalho Access-Control-Allow-Origin à resposta enviada do seu servidor? Como
Access-Control-Allow-Origin: *
?fonte