El document.domain
metodo
Tenga en cuenta que este es un método de iframe que establece el valor de document.domain en un sufijo del dominio actual. Si lo hace, el dominio más corto se usa para verificaciones de origen posteriores. Por ejemplo, suponga que una secuencia de comandos en el documento http://store.company.com/dir/other.html
ejecuta la siguiente instrucción:
document.domain = "company.com";
Después de que se ejecuta esa declaración, la página pasaría la verificación de origen con http://company.com/dir/page.html
. Sin embargo, por el mismo razonamiento, company.com no podían establecer document.domain
a othercompany.com
.
Con este método, se le permitirá ejecutar JavaScript desde un iframe de un subdominio en una página del dominio principal. Este método no es adecuado para recursos entre dominios, ya que los navegadores como Firefox no le permitirán cambiarlo document.domain
a un dominio completamente extraño.
Fuente: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
El método de intercambio de recursos de origen cruzado
Cross-Origin Resource Sharing (CORS) es un borrador de trabajo del W3C que define cómo el navegador y el servidor deben comunicarse cuando acceden a las fuentes de todos los orígenes. La idea básica detrás de CORS es usar encabezados HTTP personalizados para permitir que tanto el navegador como el servidor sepan lo suficiente el uno del otro para determinar si la solicitud o la respuesta deben tener éxito o fallar.
Para una solicitud simple, una que usa GET
o POST
sin encabezados personalizados y cuyo cuerpo es text/plain
, la solicitud se envía con un encabezado adicional llamado Origin
. El encabezado Origen contiene el origen (protocolo, nombre de dominio y puerto) de la página solicitante para que el servidor pueda determinar fácilmente si debe responder o no. Un Origin
encabezado de ejemplo podría verse así:
Origin: http://www.stackoverflow.com
Si el servidor decide que se debe permitir la solicitud, envía un Access-Control-Allow-Origin
encabezado que repite el mismo origen que se envió o *
si es un recurso público. Por ejemplo:
Access-Control-Allow-Origin: http://www.stackoverflow.com
Si falta este encabezado o los orígenes no coinciden, el navegador rechaza la solicitud. Si todo está bien, el navegador procesa la solicitud. Tenga en cuenta que ni las solicitudes ni las respuestas incluyen información de cookies.
El equipo de Mozilla sugiere en su publicación sobre CORS que debe verificar la existencia de la withCredentials
propiedad para determinar si el navegador admite CORS a través de XHR. Luego puede acoplar la existencia del XDomainRequest
objeto para cubrir todos los navegadores:
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
request.onload = function() {
// ...
};
request.onreadystatechange = handler;
request.send();
}
Tenga en cuenta que para que el método CORS funcione, debe tener acceso a cualquier tipo de mecánica de encabezado de servidor y no puede simplemente acceder a ningún recurso de terceros.
Fuente: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
El window.postMessage
metodo
window.postMessage
, cuando se llama, hace MessageEvent
que se envíe un a en la ventana de destino cuando se completa cualquier secuencia de comandos pendiente que se debe ejecutar (por ejemplo, controladores de eventos restantes si window.postMessage
se llama desde un controlador de eventos, tiempos de espera pendientes previamente establecidos, etc.). El MessageEvent
tiene el tipo de mensaje, una data
propiedad que se establece en el valor de cadena del primer argumento proporcionado a window.postMessage
, una origin
propiedad que corresponde al origen del documento principal en la ventana llamando window.postMessage
en el momento window.postMessage
fue llamado, y una source
propiedad que es la ventana de que window.postMessage
se llama
Para usar window.postMessage
, se debe adjuntar un detector de eventos:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
Y una receiveMessage
función debe ser declarada:
function receiveMessage(event)
{
// do something with event.data;
}
El iframe fuera del sitio también debe enviar eventos correctamente a través de postMessage
:
<script>window.parent.postMessage('foo','*')</script>
Cualquier ventana puede acceder a este método en cualquier otra ventana, en cualquier momento, independientemente de la ubicación del documento en la ventana, para enviarle un mensaje. En consecuencia, cualquier detector de eventos utilizado para recibir mensajes primero debe verificar la identidad del remitente del mensaje, utilizando el origen y posiblemente las propiedades de origen. Esto no se puede subestimar: si no se verifican las propiedades origin
y posiblemente se source
habilitan los ataques de secuencias de comandos entre sitios.
Fuente: https://developer.mozilla.org/en/DOM/window.postMessage