Deze vertaling bevat nog niet de wijzigingen die zijn gemaakt sinds 2021-05-31 in het originele Engelstalige artikel.
Je zou kunnen kijken naar deze wijzigingen. Lees ook de handleiding voor vertalingen voor informatie over het onderhouden van vertalingen van dit artikel.
De JavaScript-valstrik
door Richard Stallman
Waarschijnlijk voer je elke dag niet-vrije programma's uit op je computer zonder dat je het door hebt—via je webbrowser.
Websitebeheerders: er zijn diverse methoden om de licentie van JavaScript-programma's op een website aan te geven.
In de vrije software gemeenschap is het bekend dat niet-vrije programma's hun gebruikers misbruiken. Sommigen onder ons verdedigen onze vrijheid door alle private software op onze computers af te wijzen. Vele anderen zien onvrijheid als een tekortkoming in het programma.
Veel gebruikers zijn zich ervan bewust dat deze kwestie ook van toepassing is op add-ons die in de webbrowser geïnstalleerd kunnen worden, omdat ook deze vrij of niet-vrij kunnen zijn. Maar browsers gebruiken andere niet-vrije programma's zonder jou daar eerst toestemming voor te vragen of zelfs over te informeren—programma's die zich in webpagina's bevinden. Deze programma's worden meestal geschreven in JavaScript, maar andere programmeertalen worden ook gebruikt.
JavaScript (officieel ECMAScript genoemd, maar weinigen gebruiken die naam) werd eerst gebruikt voor kleine details in webpagina's, zoals schattige maar niet-essentiële functies om te bladeren door webpagina's. Het was acceptabel om deze te beschouwen als uitbreidingen van de HTML-opmaak, in plaats van echte software; het was geen belangrijke kwestie.
Sommige websites gebruiken JavaScript nog steeds op die manier, maar veel websites gebruiken het voor omvangrijke programma's die grote taken uitvoeren. Neem bijvoorbeeld Google Docs; het probeert een JavaScript-programma naar je machine te downloaden dat een halve megabyte groot is, in een compacte vorm die we Obfuscript noemen, omdat het geen commentaar bevat en nauwelijks spaties, en de namen van methoden zijn één letter lang. De broncode van een programma is de vorm die het liefst gebruikt wordt om te bewerken; de compacte code is niet de broncode, en de echte broncode van dit programma is niet beschikbaar voor de gebruiker.
Een onderdeel van vrije software is dat gebruikers toegang hebben tot de broncode van een programma (zijn blauwdruk). De broncode van een programma is datgene wat programmeurs kunnen wijzigen—met inbegrip van spaties, commentaar met uitleg en zinnige naamgeving. Compacte code is een onbruikbare vervanger voor dit doel; de daadwerkelijke broncode is dan niet echt beschikbaar voor de gebruikers en dus niet te begrijpen; dat maakt een dergelijk programma niet-vrij.
Bovendien zijn deze niet-vrije programma's ook vaak malware omdat ze de gebruiker bespioneren. Nog erger, sommige sites gebruiken services die alle handelingen van een gebruiker op die site vastleggen. Dit soort services “bewerken” deze opnamen zodat gevoelige data niet mee komt, maar al zou dat goed werken, het hele idee is toch om websites van data te voorzien die het niet zou mogen hebben.
Browsers vertellen je normaal gesproken niet wanneer zij JavaScript-programma's laden. Sommige browsers hebben de mogelijkheid om JavaScript geheel uit te schakelen, maar zelfs als je je bewust bent van deze kwestie, zou het grote moeite kosten om de niet-triviale, niet-vrije programma's te identificeren en deze te blokkeren. Echter, zelfs in de vrije-softwaregemeenschap zijn de meeste gebruikers zich niet bewust van deze kwestie; het zwijgen van de browser verhult het.
Het is mogelijk om JavaScript-programma's als vrije software uit te brengen, door het verspreiden van de broncode onder een vrije-software licentie. Als het programma zelf-bevattend is—zijn functioneren en doel zijn onafhankelijk van de pagina waarin het geleverd werd—is dat prima; je kunt het programma kopiëren naar je eigen computer, het wijzigen, en dat bestand openen met een browser om het uit te voeren. Maar dat is een ongebruikelijk geval.
In het gebruikelijke geval zijn JavaScript-programma's bedoeld om te werken met een bepaalde pagina of website, en de pagina of website hangt voor zijn functioneren van deze programma's af. Dan speelt een ander probleem: zelfs als de broncode van het programma beschikbaar is, bieden browsers je geen manier aan om jouw aangepaste versie uit te voeren in plaats van de originele versie bij het bezoeken van die pagina of website. Het effect lijkt op tivoisatie (waarbij je de software niet kunt vervangen), hoewel het in principe niet zo moeilijk is op te lossen.
JavaScript is niet de enige programmeertaal die websites gebruiken om programma's naar de gebruiker te sturen. Flash ondersteunt programmeren door middel van een uitgebreide variant van JavaScript; als we ooit een compleet vrije Flash-speler hebben, moeten we omgaan met de kwestie van niet-vrije Flash-programma's. Silverlight heeft een vergelijkbaar probleem, maar dan erger, omdat Microsoft het gebruikt als een platform voor niet-vrije codecs. Een vrije vervanging van Silverlight is niet genoeg voor de vrije wereld totdat het normaal gesproken geleverd wordt met vrije vervangingen voor codecs.
Java-applets worden ook in de browser uitgevoerd en hebben vergelijkbare problemen. Over het algemeen zal elke vorm van applet dit soort problemen hebben. Wanneer we een vrije uitvoeringsomgeving hebben voor een applet brengt dat ons alleen ver genoeg om het probleem te ervaren.
Het is theoretisch mogelijk om te programmeren in HTML en CSS, maar in de praktijk is deze mogelijkheid gelimiteerd en niet gemakkelijk; het zou een ware prestatie zijn om iets te programmeren in deze talen. Dergelijke programma's zouden vrij moeten zijn, maar CSS is sinds 2019 geen serieus probleem meer voor de vrijheid van gebruikers.
Er heeft zich een sterke beweging ontwikkeld die oproept dat websites alleen communiceren door middel van formaten en protocollen die vrij zijn (sommigen zeggen "open"); wat betekent dat de documentatie gepubliceerd is en iedereen vrij is het te implementeren. Met JavaScript is dat criterium niet meer voldoende. JavaScript zelf, als taal, is vrij, en het gebruik ervan is niet noodzakelijkerwijs slecht. Echter, zoals we hierboven hebben gezien, hoeft het ook niet goed te zijn—wanneer het programma zelf onvrij is. Wanneer de website een programma naar de gebruiker verzendt, is het niet niet genoeg dat het programma is geschreven in een vastgelegde en vrije taal; het programma moet zelf ook vrij zijn. “Alleen vrije programma's die naar de gebruiker worden verzonden” moet onderdeel worden van de eisen voor behoorlijk gedrag voor websites.
Het stilletjes laden en uitvoeren van niet-vrije programma's is één van de problemen die zich voordoen bij "web-applicaties". De term "webapplicatie" is bedacht om het fundamentele verschil, tussen software die geleverd wordt aan de gebruikers en software die uitgevoerd wordt op een server, te verzwijgen. Het kan verwijzen naar een gespecialiseerd clientprogramma dat wordt uitgevoerd in een browser; het kan verwijzen naar gespecialiseerde serversoftware; het kan verwijzen naar een gespecialiseerd clientprogramma dat hand in hand samenwerkt met gespecialiseerde serversoftware. De client- en server-kant brengen verschillende ethische kwesties aan het licht, zelfs als ze zo hecht samenwerken dat ze mogelijkerwijs gedeeltes van een enkel programma zijn. Dit artikel spreekt slechts over de kwestie van de software aan de client-kant. We benoemen de serverkwestie apart.
Hoe kunnen we praktisch omgaan met het probleem van complexe niet-vrije JavaScript-programma's in webpagina's? De eerste stap is het niet uit te voeren.
Wat bedoelen we met "niet-triviaal"? Hier is geen vaste grens voor, dus gaat het om het ontwerpen van een simpele eis die goede resultaten geeft, in plaats van het juiste antwoord te vinden.
Ons huidige beleid is om een JavaScript-programma als niet-triviaal te beschouwen wanneer:
- het aan wordt geroepen als extern script (vanuit een andere pagina)
- het een array, groter dan 50 elementen gebruikt.
- het een functie of methode bevat die meer aanroept dan een primitive.
- het een object aanmaakt met meer dan drie voorwaardelijke constructies of lussen.
- code buiten de functies die iets anders dan primitieven aanroepen of functies verderop op de pagina.
- code buiten de functies die in totaal meer dan drie voorwaardelijke constructies of lussen bevat.
- wanneer het eval aanroept.
- het een Ajax aanroep doet.
- het vierkante haken gebruikt voor dynamische toegang tot properties van het type object[property].
- het de DOM wijzigt.
- het dynamische JavaScript-constructies gebruikt die moeilijk te analyseren zijn zonder het programma te interpreteren, of als het gelijk wordt geladen met scripts die dergelijke constructies gebruiken. Met name andere constructies dan string waarden bij bepaalde methoden (Obj.write, Obj.createElement, en anderen).
Hoe kunnen we uitvinden of JavaScript-code vrij is? In een apart artikel stellen we een conventie voor waarmee niet-triviale JavaScript-programma's in een webpagina de URL kunnen aangeven waar de broncode staat, alsmede zijn licentie, door middel van gestilleerd commentaar.
Tenslotte moeten we vrije browsers wijzigen zodat zij niet-triviale, niet-vrije JavaScript detecteren en blokkeren. Het programma LibreJS detecteert niet-vrije, niet-triviale JavaScript in de pagina's die je bezoekt, en blokkeert deze. LibreJS wordt meegeleverd met IceCat, en is beschikbaar als add-on voor Firefox.
Gebruikers van browsers hebben ook een gebruikersvriendelijke methode nodig om JavaScript-code te gebruiken in plaats van de JavaScript in een bepaalde pagina. (De gespecificeerde code kan een volledige vervanging zijn, of een gewijzigde versie van het vrije JavaScript-programma in die pagina.) Greasemonkey komt hier dicht in de buurt, maar niet helemaal, want het garandeert niet dat de aangepaste JavaScript-code op de pagina wordt gebruikt voordat het programma begint met uitvoeren. Het gebruiken van een lokale proxy werkt, maar is momenteel te moeilijk om een echte oplossing te zijn. We moeten een oplossing creëren die betrouwbaar en gemakkelijk is, alsmede websites om gewijzigde programma's te delen. Het GNU-project raadt graag websites aan die toegewijd zijn aan vrije wijzigingen.
Deze functies zullen het mogelijk maken dat een JavaScript-programma dat wordt meegeleverd met een webpagina in een praktisch opzicht vrij is. JavaScript zal geen bijzonder obstakel zijn voor onze vrijheid—niet meer dan C en Java nu zijn. We zullen in staat zijn om de niet-vrije, niet-triviale JavaScript-programma's te verwerpen en zelfs te vervangen, net zoals we niet-vrije programma's verwerpen en vervangen die ons op de reguliere manier ter installatie aangeboden worden.
In de tussentijd is er één moment waarop het acceptabel is om een niet-vrij JavaScript-programma uit te voeren: om een klacht naar de websitebeheerders te sturen, waarin je aangeeft dat ze de JavaScript-code op de website zouden moeten bevrijden of verwijderen. Aarzel niet om JavaScript tijdelijk aan te zetten om dat te doen—maar vergeet niet om het na afloop weer uit te zetten.
Websitebeheerders: er zijn diverse methoden om de licentie van JavaScript-programma's op een website aan te geven.
Dankbetuiging:Ik dank Matt Lee en John Resig voor hun hulp bij het bepalen van de voorgestelde criteria, en aan David Parunakian, die mij geholpen heeft me bewust te maken van het probleem.