Compruebe si mismo origen se aplica la política de

Existe un «seguro» para comprobar si el origen mismo de la política se aplica a una dirección URL antes de tratar de utilizar métodos ajax? Aquí 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 obras, pero es una especie de manual suposición basada en la artículo de la wikipedia. Existe una mejor forma de pre-comprobación de la cruz de dominio subsidio? jQuery es ACEPTAR a utilizar.

  • Si vas a hacer una cruz solicitud de dominio se producirá con readystate=4 y statuscode=0, que es similar a una anulado el pedido. Dado que usted necesita para protegerse contra abortado solicitudes de todos modos ¿por qué usted necesita este cheque? Siento que esta medida de seguridad impuesta desde fuera, usted no tiene ningún control sobre él, por lo que cualquier comprobar desde dentro el ambiente es, por definición, mal. Así que no creo que usted nunca debe comprobar para ello, simplemente deje la petición fallar.

5 Kommentare

  1. 8

    Pregunta interesante! Busqué por los alrededores, y no podía encontrar otra cosa que lo que has publicado, pero me ha llegado a través de esta cuando yo jugueteaba con algo de código de prueba. Si lo que desea es una forma sencilla de probar una URL sin hacer una petición, me gustaría hacerlo de la manera que lo estás haciendo. Si usted no se preocupan por realizar una solicitud a la prueba, puede probar con este:

    Hacer una simple petición ajax a cualquier URL que desea:

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

    que devuelve un jqXHR objeto, que se puede consultar a:

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

    Ahora, el único problema con esto es que isRejected() evaluará a true para cada uno de los casos en que la página no se carga (es decir, 404 No Encontrado, etc.), pero usted puede comprobar el código de estado:

    ajaxRequest.status;

    Parece que la línea anterior devolverá 0 cuando se intenta romper el origen mismo de la política, pero se le devolverá el código de error correspondiente (de nuevo, es decir, 404) en los demás casos.

    Así que para concluir, tal vez usted podría tratar de hacer algo como:

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

    No una respuesta definitiva, por cualquier medio, pero espero que le ayuda a averiguar lo que usted está buscando!

    • Sí, ese es un planteamiento interesante. En mi caso original, quería deshacerse del desagradables de la consola de errores se obtiene al hacer la rechazó llamada ajax tratando de «validar» la URL. También he descubierto recientemente que haciendo un peticiones ajax a un archivo local (el protocolo file:) también falla cada vez. Así que es otro caso para comprobar…
    • Usted puede utilizar ajax para archivos locales mediante el establecimiento de la isLocal bandera a true api.jquery.com/jQuery.ajax/#jQuery-ajax-settings
  2. 15

    Existe un «seguro» para comprobar si el origen mismo de la política se aplica a una dirección URL antes de tratar de utilizar métodos ajax? Aquí 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 manera segura y fiable de hacerlo, a condición de que usted está haciendo (o no hacer) ciertas cosas.

    Este tipo de obras, pero es una especie de manual suposición basada en el artículo de la wikipedia.

    Esto debería funcionar completamente bajo el «normal» de las circunstancias. Tendrá que ser modificado si usted está planeando utilizar cruz-dominio de secuencias de comandos.

    Si modifica document.domain en los scripts, por ejemplo, de «foo.example.com» y «bar.example.com» a «example.com» su testSameOrigin función devolvería false para «http://example.com«, cuando en realidad debería de volver true.

    Si usted está planeando en la modificación de document.domain, usted puede agregar simplemente agregar una comprobación de que en la secuencia de comandos.

    Si usted está planeando sobre el uso de CORS (ver el enlace de arriba) para permitir la comunicación del dominio, también regresará un falso negativo. Pero si usted está usando CORS, usted tendrá una lista de dominios a los que usted se puede comunicar con, y usted puede agregar la lista para esta función.

    Existe una mejor manera de pre-comprobación de la cruz de dominio subsidio? jQuery es ACEPTAR a utilizar.

    Probablemente no, aunque puede ser vale la pena mencionar que lo que estamos viendo en la consola de Steve respuesta podría ser el «observador del prisionero» … Los errores parecen que son el resultado de la consola tratando de inspeccionar la otra ventana, no necesariamente a partir de la secuencia de comandos.

    Suponiendo que no estás jugando con document.domain o el uso de CORS, su solución original es probablemente mejor, ya que no se necesitan para hacer un extra de solicitud para determinar si el servidor está disponible o no. Incluso si estás haciendo algún cruz-dominio de secuencias de comandos, la modificación de la función que tiene ahora para dar cabida a la que es probablemente su mejor apuesta.

    • si bien esta es una buena manera de comprobar CORS las solicitudes se rompe en IE7, mientras que el ancla generado no devuelve ninguna información sobre el enlace así, por ejemplo, la evaluación de un vínculo <a href='main.html'></a> en IE7 volverá a.href => "main.html" a.hostname => "" etc. Todavía estoy tratando de averiguar cómo lidiar con esto en IE7 tho. pero no podía encontrar ninguna buena solución. ya que nunca crear el href.
    • ¿Qué documento.verificación de dominio se puede añadir? Simplemente la sustitución de loc.hostname con document.domain ser correcto?
    • todavía sería «foo.example.com» y document.domain sería sólo «example.com». Tendría que ser un caso especial de verificación, es decir, si usted sabe que están reescribiendo tanto document.domains a «example.com», el nombre de host de verificación sería algo así como a.hostname == loc.hostname || a.hostname == "foo.example.com"
    • Me he encontrado con un caso en el que a.port != loc.port porque el primero llega hasta el 80 y el segundo como en blanco.
  3. 2

    De probar esta solución así.

    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"));
        }
      }
    });
  4. 0

    Otra forma de ejecutar la cruz de dominio script utiliza JSON-P.
    También puede leer este artículo.
    De lo contrario, la cruz de dominio de secuencias de comandos no está permitido por el origen mismo de la política.

    • No estoy seguro de por qué todas las respuestas acerca de cómo hacer o no hacer de la cruz-los navegadores peticiones ajax, que no es en absoluto lo que yo estoy pidiendo… ¿tengo que ser más claro?
  5. 0

    Edificio de Dagg Nabbit la respuesta, esto parece un poco más completa:

    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 puedo pensar:

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea