read origin falta example domain cross corb control cabecera allow javascript jquery ajax cross-domain cross-domain-policy

javascript - origin - Compruebe si se aplica la misma política de origen



jquery ajax get (5)

¿Existe una forma "segura" de comprobar si la misma política de origen se aplica a una URL antes de intentar utilizar métodos ajax? Esto es lo que tengo:

function testSameOrigin(url) { var loc = window.location, a = document.createElement(''a''); a.href = url; return a.hostname == loc.hostname && a.port == loc.port && a.protocol == loc.protocol; }

Este tipo de trabajo funciona, pero es una especie de conjetura manual basada en el artículo de wikipedia . ¿Hay una mejor manera de comprobar previamente la asignación de dominios cruzados? jQuery está bien para usar.


¿Existe una forma "segura" de comprobar si la misma política de origen se aplica a una URL antes de intentar utilizar métodos ajax? Esto es lo que tengo:

function testSameOrigin(url) { var loc = window.location, a = document.createElement(''a''); a.href = url; return a.hostname == loc.hostname && a.port == loc.port && a.protocol == loc.protocol; }

Esta es una forma segura y confiable de hacerlo, siempre que esté haciendo (o más bien no haciendo) ciertas cosas.

Este tipo de trabajo funciona, pero es una especie de conjetura manual basada en el artículo de wikipedia.

Esto debería funcionar completamente bajo las circunstancias "normales". Será necesario modificarlo si planea usar secuencias de comandos entre dominios .

Si modifica document.domain en sus scripts, por ejemplo desde "foo.example.com" y "bar.example.com" a "example.com", su función testSameOrigin devolverá false para " http://example.com " , donde en realidad debería devolver la true .

Si planea modificar el document.domain , puede agregar simplemente agregue un cheque para eso en su script.

Si planea utilizar CORS (consulte el enlace anterior) para permitir la comunicación entre dominios, también devolverá un falso negativo. Pero si está utilizando CORS, tendrá una lista de dominios con los que puede comunicarse y también puede agregar esa lista a esta función.

¿Hay una mejor manera de comprobar previamente la asignación de dominios cruzados? jQuery está bien para usar.

Probablemente no, aunque puede valer la pena mencionar que lo que está viendo en la consola por la respuesta de Steve podría ser el "dilema del observador" ... Esos errores parecen ser el resultado de la consola que intenta inspeccionar la otra ventana, no necesariamente desde la secuencia de comandos.

Suponiendo que no esté jugando con document.domain o utilizando CORS, su solución original probablemente sea mejor, ya que no necesita realizar una solicitud adicional para determinar si el servidor está disponible o no. Incluso si está realizando algunas secuencias de comandos de dominios cruzados, modificar la función que tiene ahora para adaptarse es probablemente su mejor opción.


¡Interesante pregunta! Busqué y no pude encontrar nada más que lo que publicaste, pero me encontré con esto cuando estaba jugando con un código de prueba. Si solo desea una forma sencilla de probar una URL sin realizar una solicitud, lo haría de la forma en que lo hace. Si no te importa hacer una solicitud de prueba, puedes intentar esto:

Haga una solicitud simple de ajax a cualquier URL que desee:

var ajaxRequest = $.ajax({ url: ''http://www.google.com'', async: false });

que devuelve un objeto jqXHR , que luego puede verificar:

ajaxRequest.isRejected(); // or... ajaxRequest.isResolved();

Ahora, el único problema con esto es que isRejected() se evaluará como true para cada caso en el que la página no se carga (es decir, 404 No encontrado, etc.), pero puede verificar el código de estado con:

ajaxRequest.status;

Parece que la línea anterior devolverá 0 cuando intente romper la misma política de origen, pero devolverá el código de error apropiado (de nuevo, es decir, 404) en otros casos.

Así que para terminar, tal vez podrías intentar hacer algo como:

function testSameOrigin(testUrl) { var ajaxRequest = $.ajax({ url: testUrl, async: false }); return ajaxRequest.isRejected() && ajaxRequest.status === 0; }

No es una respuesta definitiva de ninguna manera, pero espero que te ayude a descubrir lo que estás buscando.


Otra forma de ejecutar un script de dominio cruzado es utilizando JSON-P . También puedes leer este article . De lo contrario, la misma política de origen no permite las secuencias de comandos entre dominios.


Partiendo de la respuesta de Dagg Nabbit, esto parece un poco más completo:

function sameOrigin(url) { var loc = window.location, a = document.createElement(''a'') a.href = url return a.hostname === loc.hostname && a.port === loc.port && a.protocol === loc.protocol && loc.protocol !== ''file:'' }

Advertencias que se me ocurren


Prueba esta solución también.

function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } function sameOrigin(url) { // test that a given url is a same-origin URL // url could be relative or scheme relative or absolute var host = window.document.location.host; // host + port var protocol = window.document.location.protocol; var srOrigin = ''//'' + host; var origin = protocol + srOrigin; // Allow absolute or scheme relative URLs to same origin return (url === origin || url.slice(0, origin.length + 1) === origin + ''/'') || (url === srOrigin || url.slice(0, srOrigin.length + 1) === srOrigin + ''/'') || // or any other URL that isn''t scheme relative or absolute i.e relative. !(/^(////|http:|https:).*/.test(url)); } // if you want to check before you make a call if (!csrfSafeMethod(data.type) && sameOrigin(data.url)) { // ... } // or if you want to set csrf token $.ajax({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) { xhr.setRequestHeader("X-CSRFToken", getCookie("csrftoken")); } } });