Esta es una traducción de la página original en inglés.

La trampa de JavaScript

Hay dos clases de daños morales que una página puede hacer. Esta página se ocupa del perjuicio de enviar programas no libres para que se ejecuten en el ordenador del usuario. Existe también el perjuicio que llamamos SaaSS,«Servicio sustitutivo del software», cuando la página le invita a enviar sus datos a fin de que se procesen en el servidor, un procesamiento que es injusto debido a que el usuario no tiene control sobre esas operaciones.

Sin darse cuenta, usted puede estar utilizando a diario en el navegador programas que no son libres.

En la comunidad del software libre estamos familiarizados con el hecho de que los programas que no son libres maltratan a los usuarios. Algunos de nosotros defendemos nuestra libertad rechazando todo software privativo en nuestros ordenadores. Otros muchos consideran que la falta de libertad constituye un ataque al programa.

Muchos usuarios son conscientes de que este problema concierne a los accesorios que los navegadores ofrecen instalar, ya que estos pueden ser libres o no. Correcto, pero los navegadores ejecutan además otros programas que no son libres y sobre los que no nos preguntan ni nos avisan, programas que las páginas web contienen o enlazan. Tales programas están mayoritariamente escritos en JavaScript, aunque también se usan otros lenguajes.

JavaScript (oficialmente denominado ECMAScript, aunque pocos emplean este nombre) al principio se usaba para pequeños detalles ornamentales en páginas web, tales como bonitas pero innecesarias características de navegación y maquetación. Era aceptable considerarlos como meras extensiones del lenguaje de etiquetas HTML más que como verdadero software, y despreocuparse del asunto.

Algunos sitios continúan usando JavaScript de esa manera, pero muchos lo usan para programas mayores que realizan operaciones importantes. Por ejemplo, Google Docs trata de instalar en el navegador del usuario un programa JavaScript de medio megabyte y tan compactado que podríamos llamarlo «Obscurscript». Esta forma compactada está hecha a partir del código fuente, del que se borran los espacios que hacen el código legible y las observaciones explicativas que lo hacen comprensible, y se sustituyen los nombres significativos que aparecen en el código con nombres cortos arbitrarios, de modo que no hay forma de saber lo que significan.

Parte del significado de software libre es que los usuarios tienen acceso al código fuente del programa (su diseño). El código fuente del programa representa la mejor preferida por los programadores para modificarlo, lo que incluye un conveniente espaciado, observaciones explicativas y nombres significativos. El código compactado es un falso e inútil sustituto del código fuente. El código fuente real de estos programas no está disponible para los usuarios, de modo que los usuarios no pueden entenderlo; por lo tanto, estos programas no son libres.

Además de no ser libres, muchos de estos programas son malware, ya que espían al usuario. Aún peor, algunos sitios web utilizan servicios que registran todas las acciones del usuario mientras mira la página. Estos servicios «redactan» los registros supuestamente excluyendo ciertos datos sensibles que el sitio no debería obtener. Pero incluso si funcionan de forma fiable, el único propósito de estos servicios es proporcionar al sitio web otros datos personales que no debería tener.

Normalmente, los navegadores no avisan cuando cargan programas JavaScript. Algunos tienen una opción para desactivar JavaScript totalmente, pero incluso si somos conscientes de este problema, nos llevaría mucho trabajo identificar y bloquear los programas que no son libres ni tampoco triviales. No obstante, incluso en la comunidad del software libre, la mayoría de los usuarios no son conscientes del problema, y el silencio de los navegadores suele ocultarlo.

En definitiva, el lenguaje JavaScript no es en sí mismo mejor o peor para la libertad de los usuarios que cualquier otro lenguaje. Un programa JavaScript se puede publicar como software libre distribuyendo el código fuente bajo una licencia de software libre. Si el programa es autónomo (si su funcionamiento y su propósito son independientes de la página que lo contiene), no hay problema: se puede copiar y guardar como archivo en el ordenador, se modifica luego ese archivo y se abre con un navegador para ejecutarlo. Es posible incluso empaquetarlo para su instalación como otros programas libres e invocarlo por línea de comandos. Estos programas no plantean ninguna cuestión ética particular diferente de los de C.

El problema de la trampa de JavaScript se presenta cuando al programa JavaScript acompaña a una página web que visitan los usuarios. Esos programas JavaScript están hechos para operar en una página o sitio particular, y la página o sitio depende de ellos para funcionar.

Suponga que copia y modifica la página del código JavaScript. Surge entonces otro problema: incluso si el código fuente del programa está disponible, los navegadores no le ofrecen al usuario un modo de ejecutar su propia versión modificada en vez de la original cuando visita esa página o sitio. El efecto es comparable a la «tivoización», aunque en principio no tan difícil de solucionar.

JavaScript no es el único lenguaje que los sitios web utilizan para los programas que envían al usuario. Flash admitía la programación mediante una variante ampliada de JavaScript, pero esto es cosa del pasado . Es probable que Microsoft Silverlight cree un problema similar a Flash, solo que peor, ya que Microsoft lo usa como plataforma para códecs que no son libres. Un reemplazo libre para Silverlight no cumplirá adecuadamente su función en el mundo libre a menos que venga de serie con códecs de recambio libres.

Los applets Java también se ejecutan en el navegador, y plantean problemas similares. En general, cualquier sistema de applet presenta problemas de este tipo. Disponer de un entorno de ejecución libre para un applet no hace sino aplazar el problema.

En teoría se puede programar en HTML y CSS, pero en la práctica esta posibilidad es limitada y engorrosa; ya solo conseguir que haga algo es toda una hazaña. Tales programas deberían ser libres, aunque desde 2019 CSS no constituye un serio problema para la libertad de los usuarios.

Se ha desarrollado un potente movimiento para reclamar que los sitios web empleen solo formatos y protocolos libres (algunos los llaman «abiertos»); esto es, aquellos cuya documentación sea pública y que cualquiera sea libre de implementar. No obstante, la presencia de programas de JavaScript en las páginas web hace que este criterio sea insuficiente. El propio lenguaje de JavaScript, en cuanto formato, es libre, y el uso de JavaScript en un sitio web no es necesariamente algo malo. Sin embargo, como hemos visto antes, sí puede ser malo, en el casos de que el programa de JavaScript no sea libre. Cuando el sitio transmite un programa al usuario, no basta con que el programa esté escrito en un lenguaje documentado y sin trabas, sino que además el programa mismo debe ser libre. «Transmitir al usuario únicamente programas libres» debe ser uno de los criterios de un sitio web ético.

La carga y ejecución silenciosa de programas que no son libres es uno de los diversos problemas que presentan las «aplicaciones web». La expresión «aplicación web» se acuñó para obviar la distinción fundamental entre el software que se entrega a los usuarios y el que se ejecuta en un servidor. Puede referirse a un programa cliente especializado que se ejecuta en un navegador, puede referirse a un software especializado del servidor, o puede referirse a un programa cliente especializado que opera mano a mano con software especializado del servidor. La parte cliente y la parte servidor plantean problemas éticos diferentes, aun cuando estén tan integradas que se pueda considerar que forman parte de un solo programa. Este artículo se ocupa solo del software de la parte cliente. Tratamos lo referente al servidor por separado.

En la práctica, ¿cómo podemos afrontar el problema de la presencia en sitios web de programas Javascript que no son libres ni triviales? En primer lugar, no ejecutarlos.

¿A qué nos referimos cuando decimos que «no es trivial»? Es una cuestión de grado, por lo que no se trata de buscar una única respuesta correcta, sino de ofrecer un criterio sencillo que dé buenos resultados.

Nuestro criterio actual es considerar que un programa escrito en JavaScript no es trivial si se cumple alguna de las siguientes condiciones:

  • se remite a él como script externo (desde otra página);
  • declara un array de más de 50 elementos;
  • define una entidad nombrada (función o método) que llama a algo diferente de una primitiva;
  • define una entidad nombrada que comprende más de tres construcciones condicionales y una construcción en bucle;
  • el código que no pertenece a las definiciones nombradas llama a algo distinto de las entidades primitivas y funciones definidas más arriba en la página;
  • el código que no pertenece a las definiciones nombradas contiene, en total, más de tres construcciones condicionales y una construcción en bucle;
  • llama a la función eval;
  • hace llamadas Ajax;
  • utiliza notación con corchetes para acceder de manera dinámica a las propiedades de los objetos: object[property].
  • modifica el DOM;
  • utiliza estructuras JavaScript dinámicas que son difíciles de analizar sin interpretar el programa, o se carga junto con scripts que utilizan dichas estructuras. Concretamente, se trata del uso de cualquier estructura distinta de una cadena constante con ciertos métodos (Obj.write, Obj.createElement y otros).

¿Cómo hacemos para determinar si el código JavaScript es libre? En un artículo aparte proponemos un método para que un programa JavaScript que no sea trivial inserto en una página web indique la URL donde se encuentra su código fuente, y también su licencia, mediante comentarios estilizados.

Por último, tenemos que modificar los navegadores libres para que detecten y bloqueen el código JavaScript en las páginas web cuando no sea libre ni trivial. El programa LibreJS detecta y bloquea el código JavaScript que no es libre ni trivial en las páginas que se visitan. LibreJS está incluido en IceCat y disponible como aplicación complementaria para Firefox.

Los usuarios de navegadores necesitan una funcionalidad fácil de usar que especifique el código JavaScript a utilizar en lugar del que se encuentre en una página dada (el código especificado podría ser un reemplazo completo o una versión modificada del programa JavaScript libre de esa página). Greasemonkey está cerca de poder hacerlo, pero no lo suficiente, pues no garantiza la modificación del código JavaScript de la página antes de que el programa comience a ejecutarse. Funciona si se utiliza un proxy local, pero esto es demasiado incómodo como para considerarlo una solución real. Tenemos que desarrollar un procedimiento que sea fiable y cómodo, así como sitios web para compartir los cambios. El Proyecto GNU desearía recomendar sitios dedicados únicamente a cambios libres.

Estas funcionalidades permitirán que un programa JavaScript que se incluya en una página web sea libre en un sentido real y práctico. JavaScript ya no será un obstáculo para nuestra libertad, no más de lo que C y Java lo son ahora. Tendremos la posibilidad de rechazar e incluso reemplazar los programas JavaScript que no sean libres ni triviales, tal y como ahora rechazamos y reemplazamos los paquetes privativos que se ofrecen para su instalación convencional. A partir de ese momento podremos iniciar nuestra campaña para que los sitios web liberen JavaScript.

Entretanto, existe un caso en el que es aceptable ejecutar un programa JavaScript que no es libre: cuando se hace para enviar una queja a los administradores del sitio señalándoles que deberían liberar o eliminar el código JavaScript de la página. No dude en habilitar temporalmente JavaScript con esa finalidad, pero recuerde desactivarlo después.

Agradecimientos: Gracias a Matt Lee y John Resig por su ayuda en la concreción del criterio que proponemos, y a David Parunakian por señalarme este problema.