Estoy haciendo una llamada ajax a mi propio servidor en una plataforma que configuraron para evitar estas llamadas ajax (pero necesito que recupere los datos de mi servidor para mostrar los datos recuperados de la base de datos de mi servidor). Mi script ajax está funcionando, puede enviar los datos al script php de mi servidor para permitir que se procese. Sin embargo, no puede recuperar los datos procesados ya que está bloqueado por"Access-Control-Allow-Origin"
No tengo acceso a la fuente / núcleo de esa plataforma. así que no puedo eliminar el script que me impide hacerlo. (P / SI utilizó la consola de Google Chrome y descubrió este error)
El código Ajax como se muestra a continuación:
$.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);
}
});
o hay un JSON
código equivalente al script ajax anterior? Creo que JSON
está permitido
Espero que alguien pueda ayudarme.
Respuestas:
Pon esto encima de retrieve.php:
Tenga en cuenta que esto deshabilita efectivamente la protección CORS y deja a sus usuarios expuestos a ataques. Si no está completamente seguro de que necesita permitir todos los orígenes, debe bloquear esto a un origen más específico:
Consulte la siguiente respuesta de la pila para comprender mejor
Access-Control-Allow-Origin
https://stackoverflow.com/a/10636765/413670
fuente
De acuerdo, ¿pero todos ustedes saben que el * es un comodín y permite la creación de secuencias de comandos en todos los dominios?
Le gustaría enviar múltiples
Access-Control-Allow-Origin
encabezados para cada sitio que está permitido, pero desafortunadamente oficialmente no es compatible para enviar múltiplesAccess-Control-Allow-Origin
encabezados o para poner en múltiples orígenes.Puede resolver esto comprobando el origen y devolviendo el que está en el encabezado, si está permitido:
Eso es mucho más seguro. Es posible que desee editar la coincidencia y cambiarla a una función manual con alguna expresión regular, o algo así. Al menos esto solo devolverá 1 encabezado, y estará seguro de que es de donde proviene la solicitud. Tenga en cuenta que todos los encabezados HTTP pueden ser falsificados, pero este encabezado es para la protección del cliente. No proteja sus propios datos con esos valores. Si quieres saber más, lee un poco sobre CORS y CSRF.
¿Por qué es más seguro?
Permitir el acceso desde otras ubicaciones y luego su propio sitio de confianza permite el secuestro de sesiones. Voy a ir con un pequeño ejemplo: la imagen de Facebook permite un origen comodín; esto significa que puede crear su propio sitio web en algún lugar y hacer que active llamadas AJAX (o abra iframes) a Facebook. Esto significa que puede obtener la información de inicio de sesión del facebook de un visitante de su sitio web. Peor aún: puede realizar
POST
solicitudes de script y publicar datos en el facebook de alguien, solo mientras navega por su sitio web.¡Ten mucho cuidado al usar los
ACAO
encabezados!fuente
header()
reemplaza el encabezado anterior del mismo tipo. Entonces, realmente todo lo que está haciendo es configurar el último encabezado. La entrada manual indica que puede establecer un segundo parámetrofalse
para evitar que se sobrescriba el encabezado anterior.Advertencia , Chrome (y otros navegadores) se quejarán de que se configuran múltiples encabezados ACAO si sigue algunas de las otras respuestas.
El error 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.
Prueba esto:
fuente
He solucionado este problema al llamar a un controlador MVC3. Yo añadí:
antes de mi
Y también me
$.ajax
quejé de que no acepta el encabezado Content-type en mi llamada ajax, así que lo comenté porque sé que su JSON se pasa a la Acción.Espero que ayude.
fuente
Es una idea realmente mala de usar
*
, lo que te deja completamente abierto a las secuencias de comandos de sitios cruzados. Básicamente, desea tener su propio dominio todo el tiempo, con un alcance de su configuración SSL actual y, opcionalmente, dominios adicionales. También desea que todos se envíen como un encabezado. Lo siguiente siempre autorizará su propio dominio en el mismo alcance SSL que la página actual, y opcionalmente también puede incluir cualquier número de dominios adicionales. Los enviará a todos como un encabezado y sobrescribirá los anteriores si algo más ya los envió para evitar cualquier posibilidad de que el navegador se queje de que se envíen múltiples encabezados de control de acceso.Uso:
Tienes la idea.
fuente
¿Has intentado realmente agregar el encabezado Access-Control-Allow-Origin a la respuesta enviada desde tu servidor? Como
Access-Control-Allow-Origin: *
?fuente