Si vuelvo a visitar un sitio web malicioso, quiero estar seguro de que:
- No puede leer mis datos personales de otros sitios web que uso. Think Attacker.com leyendo gmail.com
- No puede realizar acciones en mi nombre en otros sitios web que utilizo. Piensa en attacker.com transfiriendo fondos desde mi cuenta en bank.com
La política Same Origin resuelve el primer problema. El segundo problema se llama falsificación de solicitudes entre sitios, y no se puede resolver con las restricciones de dominio cruzado actualmente vigentes.
La política del mismo origen es, en general, en consonancia con las siguientes reglas -
- Regla 1: No deje de leer cualquier cosa, desde un dominio diferente
- Regla 2: Permite escribir lo que quieras un dominio diferente, pero la regla n. ° 1 no le permitirá leer la respuesta.
- Regla 3: Usted puede hacer libremente peticiones GET entre dominios y las peticiones POST, pero no se puede controlar las cabeceras HTTP
vamos a ver cómo las diferentes cosas que usted ha enumerado los conductos hasta que las reglas anteriores:
<img>
etiquetas le permiten hacer una solicitud de HTTP, pero no hay forma de leer el contenido de la imagen más que simplemente mostrarla. Por ejemplo, si hago esto <img src="http://bank.com/get/latest/funds"/>
, la solicitud se procesará (regla 2). Pero no hay forma de que el atacante vea mi saldo (regla 1).
<script>
etiquetas funcionan principalmente como <img>
. Si haces algo como <script src="http://bank.com/get/latest/funds">
, la solicitud se procesará. El navegador también intentará analizar la respuesta como JavaScript y fallará.
Existe un conocido abuso de las etiquetas <script>
llamadas JSONP, donde se pone en colusión con el servidor de dominios cruzados para que pueda 'leer' entre dominios. Pero sin la participación explícita del servidor de dominios cruzados, no se puede leer la respuesta a través de la etiqueta <script>
<link>
de hojas de estilo en su mayoría trabajan como <script>
etiquetas, salvo la respuesta se evalúa como CSS. En general, no puede leer la respuesta, a menos que la respuesta de alguna manera sea CSS bien formada.
es esencialmente una nueva ventana del navegador. No puede leer el HTML de un iframe entre dominios. Por cierto, puede cambiar la URL de un iframe entre dominios, pero no puede leer la URL. Observe cómo sigue las dos reglas que mencioné anteriormente.
XMLHttpRequest
es el método más versátil para realizar solicitudes HTTP. Esto está completamente en el control de los desarrolladores; el navegador no hace nada con la respuesta. Por ejemplo, en el caso de <img>
, <script>
o <link>
, el navegador asume un formato particular y en general lo validará adecuadamente. Pero en XHR, no hay un formato de respuesta prescrito. Por lo tanto, los navegadores aplican la misma política de origen e impiden que lea la respuesta a menos que el sitio web de dominio cruzado lo permita explícitamente.
Las fuentes a través de font-face
son una anomalía. AFAIK, solo Firefox requiere el comportamiento opt-in; otros navegadores te permiten usar fuentes como si usaras imágenes.
En resumen, la misma política de origen es coherente. Si encuentra una forma de hacer una solicitud entre dominios y, lea la respuesta sin el permiso explícito del sitio web multidominio: usted será noticia en todo el mundo.
EDIT: ¿Por qué no puedo evitar todo esto con un proxy del lado del servidor?
Para que gmail muestre datos personalizados, necesita las cookies de su navegador. Algunos sitios usan autenticación básica HTTP, en la que las credenciales se almacenan en el navegador.
Un proxy del lado del servidor no puede obtener acceso a las cookies ni a las credenciales de autenticación básicas. Y así, aunque puede hacer una solicitud, el servidor no devolverá datos específicos del usuario.
Hmm ... Estoy empezando a conectar los puntos. Esta es definitivamente la respuesta más útil hasta ahora. Pero, ¿podría ampliar por qué el código del cliente que emite una solicitud 'GET' a gmail.com es peor que el código del servidor? Creo que entiendo por qué, pero para que esta sea una respuesta completa, es importante abordar la pregunta "¿por qué no puedo evitar todo esto con un proxy del lado del servidor?". – Domenic
@Domenic - Ver mis actualizaciones. Cuando el código del lado del cliente realiza una solicitud, las cookies se transfieren implícitamente. Estas cookies permiten que el servidor de dominio cruzado identifique al usuario y, por lo tanto, devuelva datos personalizados. Un proxy del lado del servidor no tendrá acceso a estas cookies, por lo que no puede leer datos personales. –
Excelente, ¡gracias! Es especialmente útil que indique explícitamente las cookies y las credenciales de autenticación básicas; Solo había pensado en las cookies. – Domenic