Pułapka JavaScript'u
Richard StallmanIstnieją dwa rodzaje moralnej niesprawiedliwości, którą może wyrządzić strona internetowa. Ta strona wyjaśnia dlaczego wysyłanie niewolnych programów na Wasz komputer jest złe. Istnieje również zło, które nazywamy SaaSS, „Service as a Software Substitute” gdzie strona zachęca Was do wysyłania Waszych danych, przez co może wykonywać pracę komputera na swoim serwerze, co jest niesprawiedliwe gdyż nie macie kontroli nad tym jakie obliczenia są wykonywane.
Możliwe, że korzystacie z niewolnych programów na swoim komputerze każdego dnia – przez przeglądarkę internetową
W społeczności wolnego oprogramowania, znana jest idea tego, że każdy niewolny program źle traktuje użytkowników. Niektórzy z nas całkowicie odmawiają używania prawnie zastrzeżonego oprogramowania, a wielu innych fakt bycia niewolnym uważa za wadę programu.
Wielu użytkowników jest świadomych tego, że kwestia ta ma zastosowanie do wtyczek oferowanych do instalacji przez przeglądarki, jako że mogą one być wolne bądź niewolne. Jednak przeglądarki uruchamiają inne niewolne programy, o co nie pytają użytkowników ani nawet ich o tym nie informują – programy zawarte bezpośrednio bądź przez odnośnik na stronach internetowych. Te programy najczęściej napisane są w JavaScript, choć wykorzystywane są także i inne języki.
JavaScript (oficjalnie nazywany ECMAScript, choć niewielu korzysta z tej nazwy) był dawniej wykorzystywany do drobnych upiększeń na stronach internetowych, takich jak ładne, lecz nieistotne elementy nawigacji bądź wyświetlania. Dopuszczalnym było traktowanie ich jedynie jako rozszerzenia znaczników HTML, raczej niż prawdziwe oprogramowanie; nie stanowiły one znaczącej kwestii.
Niektóre strony nadal korzystają z JavaScript w ten sposób, jednak wiele wykorzystują go do większych programów wykonujących duże zadania. Przykładowo, Google Docs próbuje pobrać na maszynę użytkownika program JavaScript o objętości pół megabajta, upakowany w formie, którą nazwać można Obfuscriptem (celowo nieczytelnie napisany kod) ponieważ nie posiada żadnych komentarzy i prawie żadnych białych znaków, a nazwy metod są jednoliterowe, więc trudno zrozumieć co kod ma robić.
Częścią znaczenia wolnego oprogramowania jest to, że użytkownicy mają dostęp do kodu źródłowego programu (jego planu). Kod źródłowy programu stanowi preferowaną formę dla programistów do modyfikowania – wliczając pomocne wcięcia, uwagi objaśniające i sensowne nazwy. Skompresowany kod jest jest zafałszowanym, bezużytecznym substytutem kodu źródłowego. Prawdziwy kod źródłowy tych programów nie jest dostępny dla użytkowników, zatem użytkownicy nie mogą go zrozumieć; oznacza to, że te programy są niewolne.
Dodatkiem do faktu bycia niewolnymi, wiele z tych programów to malware, ponieważ podglądają użytkowników. Co gorsze niektóre strony korzystają z usług, które zapisują wszystkie czynności wykonane przez użytkownika kiedy patrzy na stronę. Usługi te podobno „redagują” te nagrania tak, aby wykluczyć część wrażliwych danych których strona nie powinna mieć. Nawet jeżeli działają niezawodnie całym sensem tych usług jest dostarczenie stronie innych osobistych informacji, których mieć nie powinna.
Przeglądarki normalnie nie informują użytkownika kiedy ładują programy JavaScript. Niektóre przeglądarki mają możliwość by wyłączyć JavaScript całkowicie, jednak nawet jeśli o tym wiecie, jest nieoczywiste jak rozróżnić nietrywialne niewolne oprogramowanie i je zablokować. Jednak, nawet w społeczności wolnego oprogramowania, większość użytkowników nie jest świadoma tej kwestii; milczenie przeglądarek sprzyja zaś zatajaniu tego.
Żeby było jasne – język JavaScript niekoniecznie jest lepszy lub gorszy dla wolności użytkowników od innych języków. Jest możliwym wydanie programu JavaScript jako wolne oprogramowanie, przez dystrybucję kodu objętego licencją wolnego oprogramowania. Jeśli program jest samowystarczalny – jeśli jego funkcja czy cel są niezależne od strony na której jest – to jest w porządku; możecie skopiować program do pliku na komputerze, zmodyfikować go i odwiedzić w przeglądarce aby go uruchomić. Możliwym jest również zapakowanie go do instalacji jak każdy inny wolny program i uruchamianie go za pomocą komendy w shellu. Te programy nie mają problemów moralnych innych niż te napisane w języku C.
Problem pułapki JavaScriptu występuje kiedy program napisany w tym języku załączony jest do strony internetowej odwiedzanej przez użytkowników. Te programy napisane są aby działać z daną stroną/stronami, a funkcjonowanie stron jest zależne od tychże programów.
Załóżmy że kopiujecie lub modyfikujecie kod źródłowy JavaScriptu załączony do strony. Wtedy pojawia się inny problem: nawet jeżeli kod programu jest dostępny, przeglądarki nie oferują możliwości uruchomienia Waszej zmodyfikowanej wersji w miejscu oryginału podczas odwiedzania strony. Efekt jest porównywalny do tivoizacji, jednakże w zasadzie nie jest taki trudny do przezwyciężenia.
JavaScript nie jest jedynym językiem w którym strony przesyłają programy. Flash umożliwiał programowanie poprzez rozszerzony wariant JavaScript; jednak jest to już pieśnią przeszłości. Microsoft Silverlight prawdopodobnie kreuje problem podobny do Flasha, tyle że gorszy, gdyż Microsoft używa go jako platformy dla niewolnych kodeków. Wolna alternatywa dla Silverlight nie wykonuje pracy odpowiedniej dla wolnego świata, chyba że dostarczana jest z alternatywnymi, wolnymi kodekami.
Aplety Java także są uruchamiane w przeglądarce i wzbudzają podobne kłopoty. Ogólnie rzecz biorąc, każdy typ systemu apletów stanowi tego typu zagrożenie. Posiadanie wolnego środowiska wykonawczego dla apletu jedynie przybliża nas aby bezpośrednio zetknąć się z sednem sprawy.
Teoretycznie jest możliwe aby programować w HTML i CSS, ale w praktyce jest to ograniczone i niewygodne; aby cokolwiek zrobić to już dobre przedsięwzięcie. Takie programy powinny być wolne, ale CSS nie jest poważnym problemem dla wolności użytkowników w roku 2019.
Powstał silny ruch który domaga się od stron internetowych by komunikowały się jedynie przez formaty i protokoły, które są wolne (niektórzy powiedzą „otwarte”); a więc takich, których dokumentacja została opublikowana i które każdy może zaimplementować. Z obecnością programów JavaScript na stronach internetowych, takie kryterium jest niewystarczające. JavaScript sam w sobie, jako format, jest wolny, a wykorzystanie JavaScript w na stronie internetowej samo w sobie nie jest złe. Jednak, jak widać po powyższych przykładach, może być złe jeśli program JavaScript jest niewolny. Kiedy strona przesyła program do użytkownika, nie jest wystarczającym by program był napisany w udokumentowanym i nieobciążonym języku; taki program musi być także wolny. „Jedynie wolne programy przesyłane do użytkownika” mogą stać się częścią kryterium dla poprawnego zachowania się stron internetowych.
Ciche ładowanie i uruchamianie niewolnych programów jest jedną z wielu kwestii wnoszonych przez „aplikacje sieciowe”. Termin „aplikacji sieciowych” został zaprojektowany by ignorować fundamentalne różnice między oprogramowaniem dostarczonym do użytkowników, a oprogramowaniem działającym na serwerze. Może się on odnosić do wyspecjalizowanego programu uruchamianego bezpośrednio w przeglądarce; może się on odnosić do wyspecjalizowanego oprogramowania serwera; może się on odnosić do wyspecjalizowanego programu w przeglądarce działającego wspólnie z wyspecjalizowanym oprogramowaniem serwera. Strony klienta i serwera podnoszą różne kwestie etyczne, nawet jeśli są tak mocno zintegrowane, że w efekcie tworzą części jednego programu. To opracowanie dotyczy tylko oprogramowanie po stronie klienta. Problem serwerów omawiamy osobno.
W kwestiach praktycznych, jak możemy sobie radzić z problemem niewolnych programów JavaScript na stronach internetowych? Pierwszym krokiem jest odmowa jego uruchamiania.
Po pierwsze, co mamy na myśli przez „nietrywialne”? Skoro pojęcie „nietrywialności” jest stopniowane, jest kwestią zaprojektowania prostego kryterium dającego dobre rezultaty, raczej niż ustalania jedynej poprawnej odpowiedzi.
Według naszych aktualnych kryteriów, aby uznać program JavaScript nietrywialnym wystarczy spełnić jeden z poniższych warunków:
- odnosi się do zewnętrznego skryptu (z innej strony).
- deklaruje tablicę dłuższą niż 50 elementów.
- definiuje nazwany podmiot (funkcję lub metodę), która wywołuje coś innego niż proste wyrażenia.
- definiuje nazwany podmiot posiadający więcej niż trzy warunkowe konstrukty i konstrukcje pętli.
- kod poza nazwanymi definicjami wywołuje coś innego niż proste wyrażenia i funkcje zdefiniowane na tej stronie.
- kod poza nazwanymi definicjami zawiera więcej niż trzy warunkowe konstrukty i konstrukcje funkcji, w całości.
- wywołuje eval.
- wywołuje Ajax'a.
- używa notacji nawiasowej dla dostępu własności dynamicznych obiektów, która wygląda jak object[property].
- modyfikuje DOM.
- używa dynamicznych struktur JavaScript, które są trudne do analizowania bez uruchamiania programu, lub jest ładowany razem ze skryptami, które używają takich struktur. W szczególności korzystanie z innych konstruktów od literału łańcuchowego z niektórymi funkcjami (Obj.write, Obj.createElement i inne).
Jak rozróżnić czy dany kod JavaScript jest wolny? W osobnym artykule, sugerujemy metody, dzięki którym nietrywialny program JavaScript na stronie internetowej może wskazać adres URL, na którym znajduje się jego kod źródłowy. Może również wskazać swoją licencję, używając stylizowanych komentarzy.
W końcu musimy zmienić wolne przeglądarki aby rozpoznawały i blokowały nietrywialny JavaScript na stronach internetowych. Program LibreJS wykrywa niewolny, nietrywialny JavaScript na stronach, które odwiedzacie i go blokuje. LibreJS jest wbudowany w IceCat i jest dostępny jako dodatek do Firefox.
Użytkownicy przeglądarek potrzebują wygodnej metody określenia kodu JavaScript, którego chcą użyć zamiast JavaScript na wybranej stronie. (Określony kod może być całkowitym zastąpieniem, bądź zmodyfikowaną wersją wolnego programu JavaScript obecnego na wybranej stronie.) Greasemonkey jest bliskie umożliwienia tego, jednak nie do końca, gdyż nie gwarantuje modyfikacji kodu JavaScript na stronie zanim ten zacznie się wykonywać. Wykorzystanie lokalnego proxy działa, jednak jest zbyt niedogodne by być realnym rozwiązaniem. Potrzebujemy rozwiązania, które jest niezawodne i wygodne, jak i witryny gdzie można się dzielić zmianami. Projekt GNU zarekomenduje strony, które są dedykowane jedynie wolnym zmianom.
Takie możliwości umożliwią programom JavaScript zawartym na stronach internetowych bycie wolnymi w rzeczywistym i praktycznym sensie. JavaScript już nie będzie szczególną przeszkodą do naszej wolności – nie bardziej niż C i Java są nimi teraz. Będziemy mogli odrzucić a nawet podmienić niewolne, nietrywialne programy JavaScript, tak samo jak możemy podmienić niewolne pakiety normalnie oferowane nam do instalacji. Nasza kampania dla stron internetowych by uwolnić ich JavaScript może się wtedy zacząć.
W międzyczasie jest jeden przypadek gdzie jest dopuszczalne uruchamiać niewolny program JavaScript: aby wysłać zażalenie do operatorów witryn internetowych, że powinni uwolnić lub usunąć JavaScript ze stron. Nie wahajcie się włączyć JavaScript tymczasowo aby to zrobić, ale pamiętajcie go potem wyłączyć.
Webmasterzy: istnieją różne metody na wskazanie licencji programów JavaScript na stronie internetowej.
Podziękowania dla Matt Lee i John Resig za ich pomoc w definiowaniu naszej propozycji kryterium, oraz dla David Parunakian za pomoc w uświadomieniu mi problemu.
Webmasterzy: istnieją różne metody na wskazanie licencji programów JavaScript na stronie internetowej.