El desarrollo web a menudo requiere enfrentar problemas de dominio cruzado. La causa raíz de los problemas de dominio cruzado es la estrategia del mismo origen en la seguridad del navegador. Por ejemplo, para http://www.a.com/1.html:
1. Http://www.a.com/2.html es homólogo;
2. Https://www.a.com/2.html es de diferentes fuentes, porque el protocolo es diferente;
3. Http://www.a.com:8080/2.html proviene de diferentes fuentes, porque los puertos son diferentes;
4. Http://sub.a.com/2.html es de diferentes fuentes porque los hosts son diferentes.
En el navegador, las etiquetas <script>, <img>, <iframe> y <ink> pueden cargar recursos de dominio cruzado (no homólogos), y el método de carga es realmente equivalente a una solicitud GET ordinaria. La única diferencia es que en aras de la seguridad, el navegador no permite operaciones de lectura y escritura en los recursos cargados de esta manera, pero solo puede usar las capacidades que la etiqueta misma debe tener (como la ejecución de script, la aplicación de estilo, etc.).
El problema más común de dominio cruzado es el problema de acceso de dominio cruzado de AJAX. Por defecto, no se puede acceder a URL de dominio cruzado a través de AJAX. Aquí grabo lo que he aprendido sobre los métodos de dominio cruzado:
1. Proxy del lado del servidor , no hay nada que decir. La desventaja es que, por defecto, el servidor que recibe solicitudes AJAX no puede obtener la IP y UA del cliente.
2. Iframe , usar iframe es realmente equivalente a abrir una nueva página web. El método de dominio cruzado específico es más o menos la página principal abierta por el dominio A anida un iframe apuntando al dominio B, y luego envía los datos. Después de la finalización, el servidor de B puede:
● Devuelva una respuesta de redirección 302 y apunte el resultado al dominio A;
● Nesta un iframe apuntando al dominio A dentro de este iframe.
Ambos finalmente implementan llamadas de dominio cruzado. Este método es más funcionalmente más fuerte que el JSONP que se introduce a continuación, porque después de la finalización del dominio cruzado, no hay problema con las operaciones DOM y las llamadas de JavaScript entre sí, pero hay algunas restricciones, como el resultado que se pasa en los parámetros de URL, lo que significa que cuando los datos del resultado son grandes, debe aprobarse en la segmentación, lo que es muy problemático; Hay otro problema causado por el mismo iframe, y la interacción entre la página principal y el mismo iframe tiene restricciones de seguridad.
3. Use etiquetas de script para dominar , este método también es muy común. Las etiquetas de script pueden cargar JavaScript extranjero y ejecutarlas. La función de devolución de llamada preestablecida puede realizar una interacción con la página principal. Tiene un gran nombre llamado JSONP Cross-Dominio, que es una abreviatura de JSON con relleno. Es un protocolo no oficial, que obviamente es un guión de carga, entonces, ¿por qué está relacionado con JSON? Resulta que es esta función de devolución de llamada. Hay una forma típica de usarlo, que es pasar los parámetros a través de JSON, es decir, llenar los datos de JSON en la función de devolución de llamada. Este es el significado de JSON+Padding de JSONP.
Hay muchos servicios de JSONP en Internet para proporcionar datos. En esencia, son solicitudes de dominio cruzado y especifican devoluciones de llamada en la URL de solicitud, como la devolución de llamada = resultado. Después de obtener estos datos, la función de resultado se llamará automáticamente y los datos se pasarán en forma de JSON, por ejemplo (buscar "fútbol"):
http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=football&callback=result
Use jQuery para llamarlo y escribirlo como:
La copia del código es la siguiente:
$ .getjson ("http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=football&callback=?", function (data) {
// ...
});
En general, la limitación del enfoque de dominio cruzado de JSONP es que solo puede usar las solicitudes GET y no puede resolver el problema de cómo hacer llamadas de JavaScript entre dos páginas en diferentes dominios.
4. Flash Cross Dominio:
Accederá al archivo CrossDomain.xml en el directorio raíz del sitio web de destino, y determinará si permitirá este acceso de dominio cruzado en función del contenido en el archivo:
La copia del código es la siguiente:
<Cross-Domain-Policy>
<Illow-ACcess-from domain = "xxx.xxx.com" />
</Cross-Domain-Policy>
5. La etiqueta IMG también se puede usar , que también es un método muy común. Tiene una función más débil y solo puede enviar una solicitud GET sin ninguna devolución de llamada. Así es como se determina el recuento de clics de Google.
6. Window.PostMessage, que es un mecanismo recientemente agregado para la comunicación de dominio cruzado, solo es compatible con las versiones Firefox 3, Safari 4, IE8 y posteriores. La llamada para usarlo para enviar mensajes a otros Windows es el siguiente:
La copia del código es la siguiente:
Otrowindow.PostMessage (mensaje, TargetOrigin);
En la ventana receptora, se debe configurar un controlador de eventos para recibir los mensajes enviados:
La copia del código es la siguiente:
Window.AdDeventListener ("Mensaje", ReceptMessage, False);
function recibeMessage (evento) {
if (event.orgin! == "http://example.org:8080")
devolver;
}
Tenga en cuenta que los atributos de origen y fuente del mensaje deben usarse para verificar la identidad del remitente, de lo contrario causará vulnerabilidades de XSS.
7. Control de acceso
Algunos navegadores admiten encabezados de respuesta como access-control-aligina-origen, como:
La copia del código es la siguiente:
Encabezado ("Access-Control-Alow-origin: http://www.a.com");
Esto especifica que se permite el acceso de dominio cruzado a www.a.com.
8. Ventana. Nombre
Esta cosa se usó en realidad como un medio para hackear XSS. La esencia es que cuando cambia la ubicación de la ventana, la página se volverá a cargar, pero curiosamente, el nombre de ventana no cambia, por lo que puede usarla para pasar el valor. Con el nombre de iframe, cambie el objeto de la ventana del iframe varias veces, y se completa la transferencia práctica de datos de dominio cruzado.
9. Documento. Domain
Este método es adecuado para la comunicación de dominio cruzado como A.example.com y B.example.com, porque los dos tienen un dominio común llamado Ejemplo.com. Simplemente establezca document.domain en ejemplo.com, pero si desea comunicarse entre A.example1.com y B.example2.com, no tiene otra opción.
10. Mensajes identificadores de fragmentos (FIM)
Este método es muy interesante y requiere la cooperación de iframes. El identificador de fragmentos es la parte que a menudo se usa para el posicionamiento de anclaje después de la marca de libra de la URL (#). Los cambios en esta parte no causarán actualización de página. La ventana femenina puede acceder a la URL del iframe a voluntad, y el iframe también puede acceder a la URL de la ventana femenina. Entonces la comunicación se puede lograr cambiando el identificador de fragmentos. La desventaja es que los cambios en el identificador de fragmentos generarán historia innecesaria y tendrán restricciones de longitud; Además, algunos navegadores no admiten el evento Onhashchange.
11. Marco cruzado (CF)
Este método es una variante del método FIM anterior. La esencia de CF y FIM en realidad se introduce en mi artículo "GWT First Experience" (solo se usa para implementar la historia y las funciones atrasadas). Creará dinámicamente un iframe invisible, señalando un dominio extranjero. Después del procesamiento, el identificador de fragmentos en la URL de este iframe contiene los resultados de procesamiento para que la página principal acceda, mientras que la URL del navegador no tiene cambios.
12. GOONE+P3P Protocolo
Usar las características de las cookies de acceso a intermedios cruzados bajo el protocolo P3P para lograr el acceso al dominio cruzado también es un truco extraño. P3P es un estándar de recomendación de protección de la privacidad publicado por W3C, con el objetivo de proporcionar protección de privacidad para los usuarios de Internet que navegan por Internet. Establezca el camino de la cookie en "/", es decir, no hay restricción de dominio. En este momento, algunos navegadores permiten que se lean páginas de otras URL, mientras que otros no. En este caso, el encabezado P3P debe configurarse en el cabezal de la respuesta de la página principal:
La copia del código es la siguiente:
P3P: cp = "Cura ADMA Deva PSAO PSDO Our Bus Uni Pur Int Dem Sta Pre Com Nav OTC NOI DSP COR"