side - php header access control allow origin*);
cómo evitar Access-Control-Allow-Origin? (7)
Estoy haciendo una llamada ajax a mi propio servidor en una plataforma que ellos configuran para evitar estas llamadas ajax (pero necesito que busque 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 a la secuencia de comandos php de mi servidor para permitir su procesamiento. 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 la secuencia de comandos que no me permite hacerlo. (P / SI usó 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 código JSON
equivalente al script ajax anterior? Creo que JSON
está permitido.
Espero que alguien pueda ayudarme.
¿Has intentado realmente agregar el encabezado Access-Control-Allow-Origin a la respuesta enviada desde tu servidor? Me gusta, Access-Control-Allow-Origin: *
?
Es una mala idea usar *
, lo que lo deja completamente abierto para cruzar scripts de sitios. Básicamente, desea su propio dominio todo el tiempo, con alcance a su configuración actual de SSL y, opcionalmente, dominios adicionales. También quiere que todos sean enviados como un encabezado. Lo siguiente siempre autorizará su propio dominio en el mismo alcance de SSL que la página actual, y opcionalmente también puede incluir cualquier cantidad de dominios adicionales. Los enviará a todos como un encabezado, y sobrescribirá los anteriores si hay algo más que los haya enviado para evitar cualquier posibilidad de que el navegador se queje sobre el envío de múltiples encabezados de control de acceso.
class CorsAccessControl
{
private $allowed = array();
/**
* Always adds your own domain with the current ssl settings.
*/
public function __construct()
{
// Add your own domain, with respect to the current SSL settings.
$this->allowed[] = ''http''
. ( ( array_key_exists( ''HTTPS'', $_SERVER )
&& $_SERVER[''HTTPS'']
&& strtolower( $_SERVER[''HTTPS''] ) !== ''off'' )
? ''s''
: null )
. ''://'' . $_SERVER[''HTTP_HOST''];
}
/**
* Optionally add additional domains. Each is only added one time.
*/
public function add($domain)
{
if ( !in_array( $domain, $this->allowed )
{
$this->allowed[] = $domain;
}
/**
* Send ''em all as one header so no browsers grumble about it.
*/
public function send()
{
$domains = implode( '', '', $this->allowed );
header( ''Access-Control-Allow-Origin: '' . $domains, true ); // We want to send them all as one shot, so replace should be true here.
}
}
Uso:
$cors = new CorsAccessControl();
// If you are only authorizing your own domain:
$cors->send();
// If you are authorizing multiple domains:
foreach ($domains as $domain)
{
$cors->add($domain);
}
$cors->send();
Entiendes la idea.
Está bien, pero todos saben que el * es un comodín y permite secuencias de comandos entre sitios de todos los dominios.
¿Por qué no poner en una lista sus propios dominios de confianza (y protocolos)?
header(''Access-Control-Allow-Origin: http://mysite1.com'', false);
header(''Access-Control-Allow-Origin: http://example.com'', false);
header(''Access-Control-Allow-Origin: https://www.mysite2.com'', false);
header(''Access-Control-Allow-Origin: http://www.mysite2.com'', false);
Eso es mucho más seguro. (El 2 ° parámetro "falso" le dice a la función header()
que no sobrescriba la anterior)
¿Por qué es más seguro?
Al permitir el acceso desde otras ubicaciones, su propio sitio de confianza permite el secuestro de sesiones. Voy a ir con un pequeño ejemplo: la imagen de Facebook permite el origen de un comodín; esto significa que puedes crear tu propio sitio web en alguna parte y hacer que active llamadas AJAX (o abrir marcos flotantes) en Facebook. Esto significa que puede obtener la información de inicio de sesión del facebook de un visitante de su sitio web. Lo que es peor, puede POST
solicitudes POST
y publicar datos en el Facebook de alguien, justo mientras navegan en su sitio web.
¡Tenga mucho cuidado al usar los encabezados de ACAO
!
He solucionado este problema al llamar a un controlador MVC3. Yo añadí:
Response.AddHeader("Access-Control-Allow-Origin", "*");
antes de mi
return Json(model, JsonRequestBehavior.AllowGet);
Y también mi $.ajax
se quejaba de que no acepta el encabezado Content-type en mi llamada ajax, así que lo comenté porque sé que su JSON se pasó a la Acción.
Espero que ayude.
lo mejor sería permitir dominios individuales, tenga cuidado con el http: //:
header(''Access-Control-Allow-Origin: http://www.foo.com'', false);
header(''Access-Control-Allow-Origin: http://www.foo2.com'', false));
ponlo encima de retrieve.php
header(''Access-Control-Allow-Origin: *'');
Es importante tener en cuenta que se debe llamar al header()
antes de que se envíe cualquier salida real.
Incorrecto
<html>
<?php
header(''Access-Control-Allow-Origin: *'');
?>
Correcto
<?php
header(''Access-Control-Allow-Origin: *'');
?>
<html>
Advertencia , Chrome (y otros navegadores) se quejarán de que múltiples encabezados de ACAO están configurados si sigue algunas de las otras respuestas.
El error será algo así como XMLHttpRequest cannot load ____. The ''Access-Control-Allow-Origin'' header contains multiple values ''____, ____, ____'', but only one is allowed. Origin ''____'' is therefore not allowed access.
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:
$http_origin = $_SERVER[''HTTP_ORIGIN''];
$allowed_domains = array(
''http://domain1.com'',
''http://domain2.com'',
);
if (in_array($http_origin, $allowed_domains))
{
header("Access-Control-Allow-Origin: $http_origin");
}