Questa traduzione potrebbe non essere aggiornata con le modifiche effettuate dopo il 2023-07-05 alla versione originale inglese.

È disponibile un elenco delle modifiche. Per informazioni su come gestire e inviare traduzioni delle nostre pagine web consultate la Guida alle traduzioni.

La trappola JavaScript

Forse ogni giorno eseguite software non libero senza rendervene conto, attraverso il vostro browser.


Per i webmaster: ci sono molti modi di indicare la licenza dei programmi JavaScript in un sito.


La comunità del software libero è ben consapevole dell'idea che i programmi non liberi maltrattano gli utenti. Alcuni di noi difendono la propria libertà rifiutandosi categoricamente di installare software proprietario. Molti altri considerano che la mancanza di libertà costituisce un duro colpo al programma.

Molti utenti sono a conoscenza del fatto che questo problema si applica ai plug-in che i browser offrono di installare, visto che possono essere sia liberi che non liberi. Ma i browser eseguono altri programmi non liberi per i quali non vi chiedono il permesso o vi avvisano: i programmi che le pagine web contengono o includono da altri siti. Questi programmi sono spesso scritti in JavaScript, anche se a volte sono scritti in altri linguaggi.

JavaScript (ufficialmente ma raramente chiamato ECMAScript) un tempo veniva utilizzato per vari fronzoli non essenziali nelle pagine web, come effetti visuali e di navigazione. Era quindi accettabile considerarli come una mera estensione del linguaggio HTML più che come software vero e proprio, e così ignorare il problema.

Alcuni siti continuano ad usare JavaScript in quella maniera, mentre molti lo usano per grandi programmi che svolgono operazioni complesse. Per esempio Google Docs prova a installare nel vostro browser un JavaScript che pesa mezzo megabyte, in una forma compattata che potremmo chiamare Obfuscript. Questa versione compattata è ottenuta dal codice sorgente, togliendo gli spazi aggiuntivi che rendono il codice leggibile, le note esplicative che lo rendono comprensibile, e sostituendo i nomi significativi con brevi nomi arbitrari in modo che non si riesca a capire cosa vogliono dire.

Una parte del significato di software libero è che gli utenti devono poter aver accesso al codice sorgente del programma. Il sorgente di un programma è la forma preferita dai programmatori per modificare un programma: incluse spaziature tra i caratteri, commenti e uso di nomi significativi. Il codice compattato è un falso e inutile sostituto del codice sorgente: il vero sorgente di questi programmi non viene reso disponibile agli utenti, quindi gli utenti non possono capirlo; pertanto questi programmi non sono liberi.

Oltre ad essere non liberi, molti di questi programmi sono malware perché spiano gli utenti. Peggio ancora, alcuni siti usano servizi che registrano tutte le azioni dell'utente mentre visita la pagina. Questi servizi in teoria “eliminano” i dati sensibili che il sito non dovrebbe raccogliere, ma anche se fosse vero il problema comunque rimarrebbe: questi servizi inviano al sito informazioni che non dovrebbe ricevere.

I browser di solito non vi informano di aver caricato dei programmi JavaScript. Alcuni browser forniscono un'opzione per disabilitare JavaScript del tutto, ma anche se siete a conoscenza di questo problema, identificare e bloccare i programmi non banali e non liberi non è facile e persino nella comunità del software libero la maggior parte degli utenti non ne è a conoscenza, anche per via del silenzio dei browser.

Dobbiamo chiarire un possibile equivoco: il linguaggio JavaScript non è intrinsecamente migliore o peggiore per la libertà degli utenti di qualsiasi altro linguaggio. È possibile rilasciare un programma JavaScript come software libero se si distribuisce il suo codice sorgente sotto una licenza libera. Se il programma è indipendente (nel senso che il suo funzionamento e scopo non dipendono dalla pagina che lo conteneva) va bene. Lo si può copiare su un file nel proprio computer, modificarlo ed eseguirlo in un browser. È anche possibile creare un pacchetto per installarlo, proprio come altri programmi liberi, e invocarlo da shell. I JavaScript non hanno un profilo morale diverso da quelle dei programmi C.

Parliamo di Trappola JavaScript quando un programma JavaScript viene fornito in una pagina Web visitata dagli utenti. Questi programmi JavaScript sono scritti per funzionare solamente in una particolare pagina o sito, e la pagina o sito dipendono da loro per funzionare.

Supponiamo di copiare e modificare il codice JavaScript della pagina. Allora sorge un altro problema: anche se il codice sorgente del programma è disponibile, i browser non offrono un modo per poter eseguire la versione modificata del programma al posto dell'originale quando viene visitata una pagina. L'effetto è comparabile alla tivoizzazione anche se, in linea di principio, meno difficile da superare.

JavaScript non è l'unico linguaggio che i siti web usano per i programmi inviati agli utenti. Flash permetteva di programmare attraverso una variante estesa di JavaScript, ma ormai è una tecnologia che sta scomparendo. Silverlight è in procinto di porre un problema simile a Flash ma peggiore, visto che Microsoft lo usa come piattaforma per codec non liberi. Un sostituto libero per Silverlight non può funzionare per il mondo libero a meno che dei codec liberi non vengano inclusi con esso.

Anche le applet Java vengono eseguite dal browser e pongono simili problematiche. In generale, ogni sistema di applet pone simili problemi. Avere un ambiente di esecuzione libero per un'applet ci porta solo a scontrarci con questo problema.

Teoricamente è possibile programmare in HTML e CSS, ma in pratica questa possibilità è limitata e poco pratica; anche solo riuscire a realizzarci qualcosa richiede complessi smanettamenti. Questi programmi dovrebbero essere liberi, ma il CSS non è comunque un problema per la libertà degli utenti (nel 2019).

C'è un movimento forte che chiede ai siti web di comunicare solo tramite formati e protocolli liberi (alcuni dicono “aperti”), ovvero la cui documentazione viene pubblicata e ognuno può liberamente implementare. Tuttavia la presenza di programmi JavaScript nelle pagine Web rende insufficiente questo criterio. Lo stesso linguaggio JavaScript, come formato, è libero, e l'uso di JavaScript in un sito web non è necessariamente negativo. Ma come abbiamo già visto, può essere negativo se il programma non è libero. Quando il sito trasmette il programma all'utente, non basta che il linguaggio in cui questo è scritto sia documentato e libero, anche il programma deve essere documentato e libero. “Trasmettere all'utente solo programmi liberi” deve diventare uno dei criteri di un sito web etico.

Caricare ed eseguire programmi non liberi silenziosamente è uno degli svariati problemi posti dalle “applicazioni web”. Il termine “applicazioni web” è stato concepito per ignorare la distinzione fondamentale tra software trasmesso all'utente e software in esecuzione su un server. Può fare riferimento ad un programma client specializzato che si esegue nel browser; può fare riferimento a software specializzato del server; può fare riferimento ad un programma client specializzato che lavora a stretto contatto con un programma server specializzato. I lati client e server sollevano questioni etiche differenti, anche quando siano così strettamente integrati da poter sostenere che facciano parte di un singolo programma. Questo articolo fa riferimento solamente a ciò che riguarda il software lato client. Ci occupiamo del lato server separatamente.

In termini pratici, come possiamo affrontare il problema del software JavaScript non libero e non banale nei siti web? Il primo passo è evitare di eseguirlo.

Che cosa vuol dire “non banale”? Dipende da caso a caso ed è quindi preferibile definire un criterio semplice che offre buoni risultati piuttosto che cercare una risposta esatta.

Attualmente il nostro criterio è considerare che un programma scritto in JavaScript non è banale se soddisfa una delle seguenti condizioni:

  • è caricato come script esterno (da un'altra pagina).
  • dichiara un array con più di 50 elementi.
  • definisce un'entità (funzione o metodo) che chiama qualcosa di diverso da una primitiva.
  • definisce un'entità utilizzando più di tre costrutti condizionali e cicli.
  • il codice che si trova all'esterno di metodi e funzioni chiama qualsiasi cosa tranne le primitive e le funzioni definite nelle righe precedenti.
  • il codice che si trova all'esterno di metodi e funzioni contiene più di tre cicli o costrutti condizionali, sommati.
  • utilizza la funzione eval.
  • effettua chiamate Ajax.
  • utilizza la notazione a parentesi quadre per accedere alle proprietà di un oggetto dinamico, in questo modo object[property].
  • modifica il DOM.
  • usa costrutti dinamici di JavaScript che sono difficili da analizzare senza interpretare il programma, oppure viene caricato assieme ad altri script che usano tali costrutti. Nello specifico, riguarda l'utilizzo di qualsiasi elemento di costruzione diverso da una stringa di caratteri costante con certi metodi (Obj.write, Obj.createElement e altri).

Come facciamo a determinare se il codice JavaScript è libero? In un ulteriore articolo proponiamo un metodo con cui un programma JavaScript non banale in una pagina web può comunicare l'indirizzo web del suo codice sorgente e la sua licenza tramite commenti formattati.

Infine, è necessario modificare i browser liberi per rilevare e bloccare JavaScript non libero e non banale nelle pagine web. Il programma LibreJS rileva JavaScript non libero e non banale nelle pagine visitate e lo blocca. LibreJS è parte di IceCat ed è disponibile come estensione per Firefox.

Gli utenti dei browser hanno anche bisogno di un modo facile per sostituire il codice JavaScript di una pagina con il proprio. Il codice specificato può essere una modifica parziale o totale del programma JavaScript libero trovato nella pagina. Greasemonkey si avvicina ad essere adatto a questo scopo ma non lo è del tutto, visto che non garantisce che il codice venga modificato prima dell'esecuzione del programma. Usare un proxy locale funziona, ma è troppo scomodo per poter essere una soluzione pratica. Abbiamo bisogno di creare sia una soluzione affidabile e facile da usare che dei siti per poter condividere le modifiche. Il progetto GNU vorrebbe consigliare dei siti che siano dedicati esclusivamente alle modifiche libere.

Queste funzionalità permetteranno di includere programmi JavaScript liberi all'interno di una pagina web in maniera pratica. JavaScript cesserà di essere un ostacolo per la libertà più di quanto lo siano oggigiorno C e Java. Saremo capaci di respingere ed addirittura sostituire i programmi JavaScript non banali e non liberi proprio come facciamo con i programmi che vengono convenzionalmente installati. La nostra campagna per spingere i siti a liberare il proprio JavaScript può avere inizio.

Comunque c'è un caso in cui è accettabile eseguire del JavaScript non libero: per inviare una lamentela agli operatori del sito, chiedendo loro di liberare o altrimenti rimuovere il codice JavaScript dal sito. Vi prego di non esitare ad abilitare JavaScript temporaneamente per questo scopo – non dimenticate di disattivarlo una volta finito.


Per i webmaster: ci sono molti modi di indicare la licenza dei programmi JavaScript in un sito.


Grazie a: Matt Lee e John Resig per il loro aiuto nel definire il criterio da noi proposto ed a David Parunakian per avermi messo a conoscenza del problema.