--- title: Política Same-origin slug: Web/Security/Same-origin_policy tags: - CORS - JavaScript - Mismo-Origen - Política Same-Origin - Seguridad translation_of: Web/Security/Same-origin_policy original_slug: Web/Security/Same-origin_politica ---

La política same-origin (mismo-origen) restringe cómo un documento o script cargado desde un origen puede interactuar con un recurso de otro origen. Es un mecanismo de seguridad crítico para aislar documentos potencialmente maliciosos.

Definición de origen

Dos páginas tienen el mismo origen si el {{Glossary("protocol","protocolo")}}, {{Glossary("port","puerto")}} (si es especificado) y {{Glossary("host","anfitrión")}} son los mismos para ambas páginas. Verá esto a veces referido como la "tupla esquema/anfitrión/puerto" (donde una "tupla" es un conjunto de componentes que juntos forman un todo).

La siguiente tabla muestra ejemplos de comparaciones de origenes para la URL http://store.company.com/dir/page.html:

URL Resultado Razón
http://store.company.com/dir2/other.html Mismo origen Solo la ruta difiere
http://store.company.com/dir/inner/another.html Mismo origen Solo la ruta difiere
https://store.company.com/secure.html Fallo Diferente protocolo
http://store.company.com:81/dir/etc.html Fallo Diferente puerto
http://news.company.com/dir/other.html Fallo Diferente host

Ver también definición de origen para file: URLs, puesto que su comparación es más complicada.

Orígenes heredados

Los scripts ejecutados desde páginas con una URL about:blank o javascript: heredan el origen del documento que contiene esa URL, puesto que esos tipos de URLs no contienen información sobre un servidor de origen.

Por ejemplo, about:blank a menudo se usa como URL de nuevas ventanas popup en las que el script padre escribe contenido (por ejemplo mediante el mecanismo {{domxref("Window.open()")}}). Si este popup además contiene JavaScript, ese escript heredará el mismo origen que el script que lo ha creado.

data: URLs obtienen un nuevo, vacío, contexto de seguridad.

Excepciones en Internet Explorer

Internet Explorer tiene dos excepciones mayores en lo que se refiere a la política same-origin

Estas excepciones no son estándar y no están soportadas en otro navegador pero son útiles cuando se desarrolla una app para Windows RT (o) basada en IE.

Cambiando el origen

Una página puede cambiar su propio origen con algunas limitaciones. Un script puede asignar el valor de {{domxref("document.domain")}} al dominio actual o a un superdominio del dominio actual. Si se asigna a un superdominio del dominio actual, el dominio más corto es usado para las posteriores comprobaciones de origen. Por ejemplo, sea un script en http://store.company.com/dir/other.html que ejecuta lo siguiente:

document.domain = "company.com";

Tras su ejecución, la página puede pasar la comprobación de origen con http://company.com/dir/page.html (asumiendo que http://company.com/dir/page.html asigna su document.domain a "company.com" para indicar que desea hacerlo - ver {{domxref("document.domain")}} para más información). Sin embargo, company.com no podría asignar document.domain a othercompany.com ya que no es un superdominio de company.com.

El número de puerto es guardado de forma separada por el navegador. Cualquier llamada al setter, incluyendo document.domain = document.domain causa que el número del puerto sea sobrescrito con null. Por lo tanto no se puede hacer que company.com:8080 hable con  company.com solo asignando document.domain = "company.com" en el primero. Tiene que ser asignado en ambos para que los números de puerto sean null.

Nota: Cuando se use document.domain para permitir a un subdominio acceder a su padre de forma segura, necesitas asignar document.domain al mismo valor tanto en el padre como en el subdominio. Esto es necesario incluso si solo se asigna el dominio padre a su valor original. Un fallo al hacer esto puede resultar en errores de permisos.

Acceso de red de origen cruzado

La política de mismo origen controla las interacciones entre dos orígenes diferentes, como cuando se usa {{domxref("XMLHttpRequest")}} o un elemento {{htmlelement("img")}}. Estas interacciones habitualmente se ubican en tres categorías:

Aquí hay algunos ejemplos de recursos que pueden ser orígen cruzado incrustado:

Cómo permitir el acceso de origen cruzado

Usa CORS para permitir el acceso de origen cruzado.

Cómo bloquear el acceso de origen cruzado

Acceso script API de Origen Cruzado

Las APIs de JavaScript APIs tales como iframe.contentWindow, {{domxref("window.parent")}}, {{domxref("window.open")}} y {{domxref("window.opener")}} permiten a los documentos referenciarse directamente entre ellos. Cuando dos documentos no tienen el mismo origen, estas referencias proveen un acceso muy limitado a los objetos Window y Location, como se describe en las siguientes dos secciones.

Para una mayor comunicación entre documentos de origenes diferentes, usar {{domxref("window.postMessage")}}.

Window

Especificación:  http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#security-window.

Los siguientes accesos de origen-cruzado a las propiedades de Window están permitidos:

Métodos
{{domxref("window.blur")}}
{{domxref("window.close")}}
{{domxref("window.focus")}}
{{domxref("window.postMessage")}}
Atributos
{{domxref("window.closed")}} Solo lectura.
{{domxref("window.frames")}} Solo lectura.
{{domxref("window.length")}} Read only.
{{domxref("window.location")}} Solo lectura.
{{domxref("window.opener")}} Solo lectura.
{{domxref("window.parent")}} Solo lectura.
{{domxref("window.self")}} Solo lectura.
{{domxref("window.top")}} Solo lectura.
{{domxref("window.window")}} Solo lectura.

Algunos navegadores permiten el acceso a más propiedades de las que permite la especificación.

Location

Especificación:  http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#security-location.

Los siguientes accesos de origen cruzado a las propiedades de Location están permitidos:

Métodos
{{domxref("location.replace")}}
Atributos
{{domxref("URLUtils.href")}} Solo escritura.

Algunos navegadores permiten el acceso a más propiedades de las que permite la especificación.

Acceso de almacenamiento de datos de origen cruzado

El acceso a datos almacenados en el navegador tales como localStorage y IndexedDB son separados por origen. Cada origen obtiene su propio almacenamiento separado, y JavaScript en un origen no puede leer desde o escribir al almacenamiento perteneciente a otro origen.

Las cookies usan una definición separada de orígenes. Una página puede asignar una cookie para su propio dominio o cualquier dominio padre, siempre que el dominio padre no sea un sufijo público. Firefox y Chrome usan la Lista de Sufijos Públicos para determinar si un dominio es un sufijo público. Internet Explorer usa su propio método interno para determinar si un dominio es un sufijo públicio. El navegador hará disponible una cookie para el dominio dado incluyendo cualquier subdominio, no importa qué protocolo (HTTP/HTTPS) o puerto sea usado. Cuando asignas una cookie, puedes limitar su disponibilidad usando los flags Domain, Path, Secure y Http-Only. Cuando lees una cookie, no puedes ver desde dónde fue asignada. Incluso si sólo usas conexiones HTTPS, cualquier cookie que veas puede haber sido asignada usando una conexión insegura.

Ver también

Información de Documento Original

{{QuickLinksWithSubpages("/en-US/docs/Web/Security")}}