Django y cross-origin

A muchos programadores web os sonará, otros quizá no os habréis topado con él.

El problema que voy a tratar en esta entrada es el de cross-domain o cross-origin (dominio cruzado u origen cruzado resp.) y su solución en Django. Para empezar debería hacer una introducción en que casos se puede dar este problema y las políticas que nos restringen poder hacerlo.

 

Supongamos que tenemos nuestra web alojada en http://mydomain.com y que desde https://mydomain.com/login queremos hacer una carga por AJAX de cualquier contenido o información que nos puede ser necesaria, nos topamos con que los navegadores (sobre todo los más modernos) nos impiden dicha petición argumentando algo similar a Access-Control-Allow-Origin not allowed

Esto ocurre porque los protocolos (en este caso https para el que hace la petición y http destino de la petición) no coinciden, pero no sólo eso, ocurrirá si los dominios o incluso los puertos no coinciden (las rutas son indiferentes), digamos que los navegadores implementan una política de restricciones especificada por la W3C mediante la cual nos impiden que podamos cargar algo desde una página que no nos pertenece.

Imaginad que esto se pudiese, podríamos construir una página con trozos de otras, cargando contenidos aquí y allí según nos interesara… y no sólo esto, esto se podría utilizar para atacar páginas con peticiones desde cualquier cliente que entrase en una página malintencionada…

 

En nuestro caso, puesto que nosotros somos los desarrolladores de nuestro sitio esto lo podemos controlar y decidir quien puede hacer una petición a nuestra página, en este caso en concreto (y creo que en la mayoría) se tratará de una petición del tipo Cross-Origin Request with Preflight (para más info consultar el enlace de la especificación) que basicamente trata de hacer una petición previa a la URL destino para consultar si tiene permitida la entrada.

Lo curioso de esto es que dicha petición de consulta no es del tipo de los archiconocidos POST o GET si no es del tipo OPTIONS (y sí, existen más métodos aunque poco extendidos, para más info http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html).

Esta petición en Django se trata como una petición normal y nos traerá en las cabeceras los parámetros Access-Control-Request-Headers, Access-Control-Request-Method, Origin que serán las cabeceras con las que va a hacer la petición a autorizar, el método a utilizar en dicha petición y el origen (host) de la petición respectivamente.

Nosotros tenemos que responder afirmativamente o negativamente con otras cabeceras que serán la respuesta a ellas, basicamente, en una vista Django quedaría:

 

def view(request):
 
    if request.method == 'OPTIONS':
        resp = HttpResponse() # respuesta vacia
        resp["Access-Control-Allow-Origin"] = "*" # permitimos todos los dominios
        resp["Access-Control-Allow-Methods"] = "GET, OPTIONS" # metodos permitidos
        resp["Access-Control-Allow-Headers"] = "X-Requested-With" # importante para ajax
        return resp
 
    # vista normal
 
    return render_to_response(...)

 

Claro que si queremos que sólo este permitido desde nuestros dominios podemos cambiar el origen:

resp[“Access-Control-Allow-Origin”] = “https://mydomain.com,http://www.mydomain.com”

 

Y bueno esto puede dar mucho juego, se puede implementar en un middleware, en fin, cada uno a su gusto 🙂

A modo de curiosidad, con esta técnica podemos impedir la entrada para que embeban nuestra página como iframe, simplemente añadiendo a las respuestas de las vistas:

resp[“Access-Control-Allow-Origin”] = “null”
 

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea de investigación sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablar por teléfono de numerosas drogas existe. Kamagra es un remedio usado para tratar de varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.

  • Los enlaces estan cerrados
  • Comentarios (0)
  1. Aun no hay comentarios.

Los comentarios estan cerrados.