Herramientas para desarrolladores : Cursos, manuales y guías de referencia : Cursos : JavaScript avanzado :

La seguridad en JavaScript

  1. Acceso bloqueado a recursos externos
  2. Acceso limitado a objetos potencialmente peligrosos
  3. Confirmación del usuario antes de realizar ciertas acciones
  4. Acceso bloqueado a elementos descargados de otros servidores
  5. Scripts relacionados

1. Acceso bloqueado a recursos externos

JavaScript fue diseñado para cumplir ciertas normas básicas de seguridad, dirigidas fundamentalmente a proteger la integridad del sistema del usuario. Hay que observar que, tras cargar una página HTML, el navegador ejecuta el código que ésta continee, sin que el usuario tenga por qué saber que esto está sucediendo.

La primera norma autoimpuesta por los diseñadores de JavaScript es la imposiblidad de acceder a elementos externos a la página web. De este modo, JavaScript no puede abrir o leer ficheros del PC del usuario, ni ejecutar programas externos. Tampoco es posbile mediante JavaScript realizar conexiones con servidores externos desde el PC del usuario (actualmente existe una tecnología para hacer esto, AJAX, que utiliza JavaScript como lenguaje de programación, pero esto es ya otra cosa).

La única excepción a la regla anterior son las cookies. Un script JavaScript puede establecer cookies en el PC del usuario. Normalmente se guardan como ficheros especiales, aunque esto depende del navegador. De igual modo, JavaScript permite que un script lea las cookies que se correspondan con el mismo dominio desde el que se descargó la página que contiene el script.

Los navegadores de Microsoft incorporan formas de eluduir estas restricciones usando controles ActiveX, por lo que la recomendación general es no utilizar el Internet Explorer, ya que es por diseño un navegador inseguro (a pesar de incorporar medidas de seguridad específicas para evitar que estas funciones extra supongan un riesgo).

2. Acceso limitado a objetos potencialmente peligrosos

Si el mundo exterior queda fuera del alcance de un script JavaScript, algunos elementos de la propia página HTML también han sido protegidos por los diseñadores de JavaScript.

Para empezar, el objeto history, que contiene el historial de navegación del usuario, no puede leerse desde JavaScript. Es un error común intentar leer algún elemento de este objeto. Se puede ir al elemento siguiente de la lista (history.forward()), o al anterior (history.back()), pero no concer su valor.

Tampoco es posible establecer el valor de un campo de formulario de tipo file. Estos campos se usan para realizar descargas de ficheros de la máquina local al servidor (uploads), y resultaría peligroso que se puediera establecer un valor mediante JavaScript para el nombre del fichero a descargar.

3. Confirmación del usuario antes de realizar ciertas acciones

Finalmente, la definición de JavaScript especifica la necesidad de que el navegador pida la confirmación del usuario antes de realizar ciertas acciones. Entre ellas, cerrar cualquier ventana que no haya sido abierta desde un script JavaScrpt (es decir, que no haya abierto un comando window.open()), y enviar un mensaje de correo.

Otras lmitaciones incluidas en el estándar (aunque no siempre impelementadas en los naveagdores) son la imposiblidad de abrir ventanas con JavaScript de tamaño inferior a ciertos parámetros que las hagan no visibles (100 por 100 pixels es el límite), o fuera de las coordenadas de la pantalla (es decir, fuera del área de visión del usuario).

4. Acceso bloqueado a elementos descargados de otros servidores

JavaScript tiene un mecanismo de seguridad por el cual ningún script puede acceder a las propiedades de documentos que procedan de un servidor distinto. Se basa en el concepto del mismo origen, según el cual cuando se carga un documento de un determinado origen, un script cargado de otro origen (y en otra ventana o marco) no puede obtener ni establecer propiedades de objetos del primer documento.

El origen en este contexto queda definido como la parte de la URL que contiene el protocolo, el nombre de la máquina, el dominio y el puerto. La política de seguridad por defecto, en todas las versiones de JavaScript, sigue la regla del mismo origen. No obstante, las versiones 1.1 y 1.2 de JavaScript introdujeron variaciones sobre este modelo:

  • JavaScript 1.1 introduce el marcado de datos, que sólo está disponible en esta versión. El marcado de datos otorgaba al desarrollador la potestad de decidir qué objetos de la página podían violar la norma del mismo origen, marcándolos con la función taint(), y su contraria untaint(). Cuando un objeto estaba marcado un script de otra ventana o marco podía acceder a sus propiedades. Para que esto fuera posible, el marcado de datos debía estar habilitado en el navegador, lo cual sólo podía hacerse en el Netscape Navigator, estableciendo el valor de la variable de entorno NS_ENABLE_TAINT a 1.
  • La versión 1.2 de JavaScript eliminó el marcado de datos, sustituyéndolo por el firmado de scripts, basado en el modelo de seguridad de Java para objetos firmados. Para firmar un script se utilizaba la herramienta Netscape Signing Tool. Mediante esta aplicación se podían asociar firmas digitales a scripts de una página HTML, a manejadores de eventos, a entidades JavaScript o a scripts en ficheros independientes. La firma digital y un identificador del script se almacenaban en ficheros .JAR. No obstante, el firmado de scripts JavaScript no ha alcanzado gran difusión.

5. Scripts relacionados

Proteger las imágenes de un documento (mejorado): Evita que las imágenes de una página se puedan guardar pulsando el botón derecho del ratón (con la opción de guardar como), pero permite sin embargo abrir un enlace en ventana nueva con el botón derecho.

Protección de una imagen mediante CSS: Impide la copia de una imagen con el "Guardar como..." del botón derecho del ratón mediante la colocación de una imagen transparente delante de ella.

Ocultar el código fuente de la página con control de dominio: Formulario que permite cifrar el código fuente de una página HTML para que no pueda ser copiada, añadiendo un script para impedir que se cargue desde un dominio que no sea el suyo.

 

Tutorial de JavaScript