A Armadilha do JavaScript

por Richard Stallman

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 os programas não-livres maltratam seus usuários é familiar. Alguns de nós defendem nossa liberdade rejeitando todos os softwares proprietários em seus computadores. Muitos outros reconhecem a não-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 pode ser livres ou não-livres. Mas os navegadores executam outros programas não-livres que eles não lhe perguntam sobre — programas contidos ou vinculados em páginas web. Esses programas são muito frequentemente escritos em JavaScript, porém outros linguagens também são usados.

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 mera extensões de marcação HTML, em vez de verdadeiros softwares, e em desconsideração da questão.

Muitos sites ainda usam JavaScript desta forma, mas alguns 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” porque ele não possui comentários e praticamente nenhum espaço em branco, e os nomes dos métodos possuem apenas uma letra. O código-fonte de um programa é a forma preferida para modificá-lo; o código compacto não é código-fonte, e o código-fonte real desse programa não está disponível para o usuário.

Além de ser não-livre, muitos desses programas são malware porque eles bisbilhotam o usuário.

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.

É 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. Mas este é um caso incomum.

Em um caso comum, programas JavaScript são feitos para funcionar com uma página ou site em particular, e a página ou site depende deles para funcionar. Então, um outro problema surge: mesmo se o fonte do programa esteja disponível, navegadores não oferece 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; se nós alguma vez tivermos um reprodutor Flash livre suficientemente completo, ainda teremos que lidar com a questão de programas Flash não-livres. Silverlight parece criar um problema similar ao 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 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 que 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 2016.

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. Com a presença de programas nas páginas web, aquele critério é necessário, mas insuficiente. O próprio JavaScript, como um formato, é livre, e o uso de JavaScript em um site web não necessariamente é ruim. Porém, como já vimos acima, também não necessariamente é feito um bom uso dele. 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. “Somente programas livres transmitidos ao usuário” deve se tornar parte do critério para um comportamento apropriado por sites.

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 refere 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 programa de programas JavaScript não-livres 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.

Nossa tentativa de política é considerar um programa JavaScript não-trivial se:

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.