La misma política de origen.
Quería hacer un wiki comunitario con respecto a las políticas HTML / JS del mismo origen para ayudar a cualquiera que busque este tema. Este es uno de los temas más buscados en SO y no hay un wiki consolidado para él, así que aquí voy :)
La misma política de origen evita que un documento o script cargado desde un origen obtenga o establezca propiedades de un documento desde otro origen. Esta política se remonta a Netscape Navigator 2.0.
¿Cuáles son algunas de sus formas favoritas de evitar las políticas del mismo origen?
Mantenga ejemplos detallados y preferiblemente también vincule sus fuentes.
javascript
ajax
same-origin-policy
David Titarenco
fuente
fuente
not constructive
etiqueta parece completamente inútil. Votado para reabrir.Respuestas:
El
document.domain
metodoTenga 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: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 establecerdocument.domain
aothercompany.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
oPOST
sin encabezados personalizados y cuyo cuerpo estext/plain
, la solicitud se envía con un encabezado adicional llamadoOrigin
. 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. UnOrigin
encabezado de ejemplo podría verse así: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: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 delXDomainRequest
objeto para cubrir todos los navegadores: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
metodowindow.postMessage
, cuando se llama, haceMessageEvent
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 siwindow.postMessage
se llama desde un controlador de eventos, tiempos de espera pendientes previamente establecidos, etc.). ElMessageEvent
tiene el tipo de mensaje, unadata
propiedad que se establece en el valor de cadena del primer argumento proporcionado awindow.postMessage
, unaorigin
propiedad que corresponde al origen del documento principal en la ventana llamandowindow.postMessage
en el momentowindow.postMessage
fue llamado, y unasource
propiedad que es la ventana de quewindow.postMessage
se llamaPara usar
window.postMessage
, se debe adjuntar un detector de eventos:Y una
receiveMessage
función debe ser declarada:El iframe fuera del sitio también debe enviar eventos correctamente a través de
postMessage
: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 sesource
habilitan los ataques de secuencias de comandos entre sitios.Fuente: https://developer.mozilla.org/en/DOM/window.postMessage
fuente
Access-Control-Allow-Origin: http://www.stackoverflow.com/
lugar de:Access-Control-Allow-Origin: http://www.stackoverflow.com
(barra al final de la URL), no funciona en Safari y FF, pero funciona en Chrome. Por supuesto, sin barra oblicua funciona bien en todos los navegadores.postMessage
método solo funciona para los navegadores que lo admiten, ya que es una adición de HTML5. Este complemento intenta dar cuenta de eso. Solo lo menciono porque estoy aprendiendo esto de la manera difícil.El método de proxy inverso
La configuración de un proxy inverso simple en el servidor permitirá que el navegador use rutas relativas para las solicitudes de Ajax, mientras que el servidor actuaría como un proxy para cualquier ubicación remota.
Si usa mod_proxy en Apache, la directiva de configuración fundamental para configurar un proxy inverso es
ProxyPass
. Por lo general, se usa de la siguiente manera:En este caso, el navegador podrá solicitar
/ajax/web_service.xml
como una URL relativa, pero el servidor lo servirá actuando como un proxy parahttp://other-domain.com/ajax/web_service.xml
.Una característica interesante de este método es que el proxy inverso puede distribuir fácilmente las solicitudes hacia múltiples back-end, actuando así como un equilibrador de carga .
fuente
Yo uso JSONP.
Básicamente, agregas
en tu pagina.
Se debe llamar a some_func () para que se le notifique que los datos están en.
fuente
AnyOrigin no funcionó bien con algunos sitios https, por lo que acabo de escribir una alternativa de código abierto llamada whateverorigin.org que parece funcionar bien con https.
Código en github .
fuente
La forma más reciente de superar la política del mismo origen que he encontrado es http://anyorigin.com/
El sitio está hecho para que solo le des cualquier URL y genera un código javascript / jquery que te permite obtener el html / data, independientemente de su origen. En otras palabras, convierte cualquier url o página web en una solicitud JSONP.
Lo he encontrado bastante útil :)
Aquí hay un ejemplo de código JavaScript de anyorigin:
fuente
No puedo reclamar crédito por esta imagen, pero coincide con todo lo que sé sobre este tema y ofrece un poco de humor al mismo tiempo.
http://www.flickr.com/photos/iluvrhinestones/5889370258/
fuente
El JSONP viene a la mente:
fuente
Personalmente,
window.postMessage
es la forma más confiable que he encontrado para los navegadores modernos. Tienes que hacer un poco más de trabajo para asegurarte de no dejarte abierto a ataques XSS, pero es una compensación razonable.También hay varios complementos para los populares kits de herramientas de Javascript
window.postMessage
que ofrecen una funcionalidad similar a los navegadores más antiguos que utilizan los otros métodos mencionados anteriormente.fuente
Bueno, usé curl en PHP para sortear esto. Tengo un servicio web ejecutándose en el puerto 82.
Aquí está el javascript que hace la llamada al archivo PHP
Mi HTML se ejecuta en WAMP en el puerto 80. Así que ahí vamos, se ha eludido la misma política de origen :-)
fuente
Estas son algunas soluciones y explicaciones de la política del mismo origen: Blog de Thiru : solución alternativa de la misma política
del navegador
fuente
Esto analiza más o menos lo que está disponible: http://www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier
Para la solución postMessage, eche un vistazo a:
https://github.com/chrissrogers/jquery-postmessage/blob/master/jquery.ba-postmessage.js
y una versión ligeramente diferente:
https://github.com/thomassturm/ender-postmessage/blob/master/ender-postmessage.js
fuente