Esta tradução pode não refletir as alterações feitas desde 2023-07-05 ao original em Inglês.

Você deveria dar uma olhada nas alterações. Por favor, veja o README de traduções para informações sobre a manutenção de traduções a este artigo.

A Armadilha do JavaScript

Você pode estar executando programas não livres em seu computador todo dia sem perceber – por meio de seu navegador web.


Webmasters: há várias formas de indicar a licença de programas JavaScript em um site.


Na comunidade de software livre, a ideia de que qualquer programa não livre maltrata seus usuários é familiar. Alguns de nós defendem nossa liberdade rejeitando todos os softwares privativos em seus computadores. Muitos outros reconhecem a falta de liberdade como uma afronta ao programa.

Muitos usuários estão cientes de que essa questão se aplica aos plug-ins que navegadores oferecem para instalar, já que eles podem ser livres ou não livres. Mas os navegadores executam outros programas não livres sem pedir autorização e sem avisar – programas contidos ou vinculados em páginas web. Esses programas são muito frequentemente escritos em JavaScript, porém outras linguagens também são usadas.

JavaScript (oficialmente chamado de ECMAScript, mas poucos usam este nome) foi, certa vez, usado para pequenas decorações estéticas em páginas web, tal como recursos de exibição e navegação fofas, mas não essenciais. Era aceitável considerá-los como meras extensões de marcação HTML, em vez de verdadeiros softwares, e em desconsideração da questão.

Alguns sites ainda usam JavaScript desta forma, mas muitos o usam para programas maiores que fazem trabalhos maiores. Por exemplo, Google Docs tenta baixar para sua máquina um programa JavaScript no tamanho de meio megabyte, em uma forma compacta que poderíamos chamar de “Obfuscript”. Essa forma compactada é feita a partir do código-fonte, excluindo os espaços extras que tornam o código legível e as observações explicativas que o tornam compreensível e substituindo cada nome significativo no código por um nome arbitrário abreviado, para que não seja possível dizer qual é seu suposto significado.

Parte do significado do software livre é que os usuários têm acesso ao código-fonte do programa (seu plano). O código-fonte de um programa significa a forma preferida para os programadores modificarem – incluindo espaçamento útil, observações explicativas e nomes significativos. Código compactado é um substituto falso e inútil do código-fonte; o código-fonte real desses programas não está disponível para os usuários, portanto os usuários não podem entendê-lo; portanto, os programas são não livres.

Além de ser não livre, muitos desses programas são malwares porque eles bisbilhotam o usuário. Ainda mais desagradável, alguns sites usam serviços que registram todas as ações do usuário enquanto olha para a página. Os serviços supostamente “redigem” os registros para excluir alguns dados confidenciais que o site não deve obter. Mas mesmo que isso funcione de forma confiável, todo o propósito desses serviços é fornecer ao site dados pessoais (de outras pessoas) que ele não deveria obter.

Navegadores normalmente não lhe informam quando eles carregaram programas JavaScript. Alguns navegadores apresentam uma forma de desligar completamente o JavaScript, mas mesmo se eles estiverem cientes desta questão, você ainda teria um problema considerável para identificar programas não livres e não triviais para, então, bloqueá-los. Porém, mesmo na comunidade de software livre, a maioria dos usuários não estão cientes desta questão, o silêncio dos navegadores tende a ocultar isso.

Para ser claro, a linguagem JavaScript não é inerentemente melhor ou pior para a liberdade dos usuários do que qualquer outra linguagem. É possível lançar um programa JavaScript como software livre, por meio da distribuição do código-fonte sob uma licença de software livre. Se o programa é independente – se sua funcionalidade e propósito são independentes da página na qual ele veio – não há problema; você pode copiá-lo para um arquivo em sua máquina, modificá-lo e visitar aquele arquivo com um navegador para executá-lo. É ainda possível empacotá-lo para instalação como outros programas livres e invocá-lo com um comando shell. Esses programas não apresentam nenhum problema moral especial diferente daqueles dos programas C.

O problema da armadilha do JavaScript se aplica quando o programa JavaScript vem junto com uma página web que os usuários visitam. Esses programas JavaScript são escritos para funcionar com uma página ou site específico, e a página ou site depende deles para funcionar.

Digamos que você copie e modifique o código JavaScript da página. Então, um outro problema surge: mesmo se o fonte do programa estiver disponível, navegadores não oferecem uma forma de executar sua versão modificada em vez do original ao visitar aquela página ou aquele site. O efeito é comparável à tivoização, apesar de, em princípio, não ser tão difícil de superar.

JavaScript não é a única linguagem que sites web usam para programas enviados pelo usuários. O Flash oferece suporte a programação por meio de uma variante estendida do JavaScript, mas esta é uma coisa do passado. Silverlight da Microsoft parece criar um problema similar ao do Flash, só que pior, já que a Microsoft o usa como uma plataforma para codecs não livres. Um substituto livre para o Silverlight não faz o trabalho adequadamente para o mundo livre a menos que venha codecs livres em substituição.

Os applets do Java também são executados no navegador, e trazem questões similares. Em geral, qualquer forma de sistema de applets representa esse tipo de problema. Tendo um ambiente de execução livre para um applet só nos traz o suficiente para encontrar o problema.

Teoricamente, é possível programar em HTML e CSS, mas, na prática, essa capacidade é limitada e inconveniente; para que seja possível que o programa faça alguma coisa, é necessário um hack impressionante. Tais programas devem ser livres, mas CSS não é um problema sério para a liberdade dos usuários em 2019.

Um movimento forte desenvolveu aquelas chamadas (“calls”) para sites web para se comunicar apenas por meio de formatos e protocolos que são livres (alguns dizem “abertos”); isto é, cuja documentação está publicada e a qual qualquer um é livre para implementar. Porém, a presença de programas JavaScript nas páginas web tornam aquele critério ineficiente. A linguagem do JavaScript em si, como um formato, é livre, e o uso de JavaScript em um site web não necessariamente é ruim. Porém, como já vimos acima, pode ser ruim – se o programa JavaScript for não livre. Quando o site transmite um programa para o usuário, não basta o programa estar escrito em uma linguagem documentada e desembaraçada; aquele programa também deve ser livre. “Transmita apenas programas livres para os usuários” deve se tornar parte do critério site web ético.

Carregar e executar silenciosamente programas não livres é uma dentre várias questões levantadas por “aplicações web”. O termo “aplicações web” foi atribuído em total desprezo à distinção fundamental entre software entregue a usuários e software sendo executado em um servidor. Ele pode se referir a um programa especializado para cliente ser executado em um navegador; ele pode se referir a um software especializado para servidor; ele pode se referir a um programa especializado para cliente que funciona de mãos dadas com software especializado para servidor. Os lados de cliente e servidor levantam questões éticas diferentes, mesmo se eles estiverem estritamente integrados que eles indiscutivelmente formam partes de um único programa. Esse artigo tem como escopo apenas a questão do software do cliente. Nós vamos tratar da questão do servidor separadamente.

Em termos práticos, como nós podemos lidar com o problema de programas JavaScript não livres e não triviais em sites? O primeiro passo é evitar executá-lo.

O que nós queremos dizer por “não triviais”? É uma questão de grau, então essa é uma questão de projetar um critério simples que fornece bons resultados, em vez de encontrar a resposta correta.

Nosso critério atual é considerar um programa JavaScript como não trivial se qualquer uma dessas condições for atendida:

  • ele é referido como um script externo (de outra página).
  • ele declara um vetor com mais de 50 elementos.
  • ele define uma entidade dada (função ou método) que chama qualquer outra que não seja a primitiva.
  • ele define uma dada entidade com mais de três construtos condicionais e construção de loop.
  • um código fora das definições dadas chama qualquer coisa, exceto primitivas e funções definidas anteriormente na página.
  • um código fora das definições dadas contém mais de três construtos condicionais e construção de loop, no total.
  • ele chama eval.
  • ele faz chamadas Ajax.
  • ele usa a notação de colchetes para o acesso à propriedade de objeto dinâmico, que se parece com objeto[propriedade].
  • ele altera o DOM.
  • ele usa construtos JavaScript dinâmicos que são difíceis de analisar sem interpretar o programa, ou é carregado junto com scripts que usam tais construtos. Especificamente, usando quaisquer outros construtos que não uma string literal com determinados métodos (Obj.write, Obj.createElement e outros).

Como nós dizemos se o código JavaScript é livre? Em um artigo separado, propomos um método por meio da qual um programa JavaScript não trivial em uma página pode indicar a URL na qual seu código-fonte está localizado, e pode indicar sua licença também, usando comentários estilizados.

Finalmente, precisamos mudar navegadores livres para detectar e bloquear JavaScript não livres e não triviais em páginas web. O programa LibreJS detecta JavaScript não trivial e não livre em páginas que você visita, e os bloqueia. LibreJS está incluso no IceCat e disponível como uma extensão para Firefox.

Usuários do navegador também precisam de uma facilidade conveniente para especificar um código JavaScript para usar em vez do JavaScript em uma certa página. (O código especificado pode ser um substituto total, ou uma versão modificada do programa JavaScript livre naquela página.) Greasemonkey chega perto de ser capaz de fazer isso, mas não muito, já que ele não garante modificar o código JavaScript em uma página antes daquele programa iniciar a execução. Usar um proxy local funciona, mas é, agora, inconveniente demais para ser uma solução real. Precisamos construir uma solução que é confiável e conveniente, assim como um site para compartilhar as alterações. O Projeto GNU gostaria de recomendar os sites que são dedicados unicamente às alterações livres.

Esses recursos possibilitarão para um programa JavaScript incluído em uma página web ser livre em um senso real e prático. JavaScript não será mais um obstáculo em especial para nossa liberdade – não mais que C e Java são agora. Seremos capazes de rejeitar e até substituir os programas JavaScript não triviais e não livres, assim como rejeitamos e substituímos pacotes não livres que são oferecidos para instalação na forma comum. Nossa campanha para sites tornarem livres os seus JavaScript pode, então, começar.

Neste meio tempo, há um caso no qual é aceitável executar um programa JavaScript não livre: para enviar uma reclamação para os operadores do site dizendo que eles devem tornar livre ou remover o código JavaScript do site. Por favor, não hesite em habilitar temporariamente JavaScript para fazer isso – mas lembre-se de desabilitá-lo novamente em seguida.


Webmasters: há várias formas de indicar a licença de programas JavaScript em um site.


Agradecimentos: Obrigado a Matt Lee e John Resig por ajudarem na definição de nosso critério proposto e a David Parunakian por trazer o programa à minha atenção.