Ver índice de contenidos del libro

7.7. Seguridad

La ejecución de aplicaciones JavaScript puede suponer un riesgo para el usuario que permite su ejecución. Por este motivo, los navegadores restringen la ejecución de todo código JavaScript a un entorno de ejecución limitado y prácticamente sin recursos ni permisos para realizar tareas básicas.

Las aplicaciones JavaScript no pueden leer ni escribir ningún archivo del sistema en el que se ejecutan. Tampoco pueden establecer conexiones de red con dominios distintos al dominio en el que se aloja la aplicación JavaScript. Además, un script sólo puede cerrar aquellas ventanas de navegador que ha abierto ese script.

La restricción del acceso a diferentes dominios es más restrictiva de lo que en principio puede parecer. El problema es que los navegadores emplean un método demasiado simple para diferenciar entre dos dominios ya que no permiten ni subdominios ni otros protocolos ni otros puertos.

Por ejemplo, si el código JavaScript se descarga desde la siguiente URL: http://www.ejemplo.com/scripts/codigo.js, las funciones y métodos incluidos en ese código no pueden acceder a los recursos contenidos en los siguientes archivos:

  • http://www.ejemplo.com:8080/scripts/codigo2.js
  • https://www.ejemplo.com/scripts/codigo2.js
  • http://192.168.0.1/scripts/codigo2.js
  • http://scripts.ejemplo.com/codigo2.js

Afortunadamente, existe una forma de solucionar parcialmente el problema del acceso a recursos no originados exactamente en el mismo dominio. La solución se basa en establecer el valor de la propiedad document.domain

Así, si el código alojado en http://www.ejemplo.com/scritps/codigo1.js establece la variable document.domain = "ejemplo.com"; y por otra parte, el código alojado en http://scripts.ejemplo.com/codigo2.js establece la variable document.domain = "ejemplo.com"; los recursos de ambos códigos pueden interactuar entre sí.

La propiedad document.domain se emplea para permitir el acceso entre subdominios del dominio principal de la aplicación. Evidentemente, los navegadores no permiten establecer cualquier valor en esa propiedad, por lo que sólo se puede indicar un valor que corresponda a una parte del subdominio completo donde se encuentra el script.