JavaScript Tuzağı
yazan Richard StallmanBir web sayfasının yapabileceği iki ahlaki yanlış vardır. Bu sayfada, web sitelerinin bilgisayarınızda çalışmak üzere özgür olmayan program göndermeleri anlatılıyor. Ayrıca SaaSS, “Yazılım Yerine Hizmet” [Service as a Software Substitute] yanlışı var, web sayfası sizden verinizi göndermenizi ister, böylece bilişim işlemlerini kendi sunucusunda gerçekleştirir, bu adaletsizdir çünkü gerçekleştirdiği bilişim işlemleri üzerinde bir denetiminiz yoktur.
Bilgisayarınızda web tarayıcınız aracılığıyla her gün farkında olmadan özgür olmayan programlar çalıştırıyor olabilirsiniz.
Özgür yazılım topluluğunda özgür olmayan herhangi bir programın kullanıcısına kötü davrandığı fikri tanıdık geliyor. Bazılarımız bilgisayarlarımızdaki tüm özel mülk yazılımları reddederek özgürlüğümüzü savunuyoruz. Diğerleri özgür olmama durumunu programa karşı bir darbe olarak kabul eder.
Pek çok kullanıcı, bu sorunun tarayıcıların kurmayı önerdiği eklentiler için geçerli olduğunun farkındadır, çünkü bu eklentiler özgür olabilirler de olmayabilir de. Ancak tarayıcılar; size sormadıkları, hatta size hiç söz etmedikleri başka özgür olmayan programları da çalıştırırlar, web sayfalarının doğrudan veya bağlantı olarak içerdiği programlar. Bu programlar çoğunlukla JavaScript ile yazılmış olsa da, diğer diller de kullanılabilir.
JavaScript (resmî olarak ECMAScript olarak adlandırılır ancak bu adı kullanan azdır); bir zamanlar web sayfalarındaki sevimli ama önemsiz gezinme ve görüntüleme özellikleri gibi küçük süsler için kullanılırdı. Bunları gerçek yazılım olarak değil, yalnızca HTML dilinin uzantıları olarak kabul etmek ve konuyu takmamak makbuldu.
Bazı siteler hâlâ bu şekilde JavaScript kullansa da, çoğunluğu daha büyük işler yapan büyük programlar için kullanıyor. Örneğin; Google Dokümanlar tarayıcınıza Obfuscript diyebileceğimiz sıkıştırılmış bir biçimde yarım megabaytlık bir JavaScript programı kurmaya çalışır. Bu sıkıştırılmış biçim, kaynak kodundan, kodu okunabilir hâle getiren ek boşlukları ve anlaşılabilir hâle getiren açıklayıcı yorumları silerek ve koddaki her anlamlı ismi keyfi bir kısa adla değiştirerek yapılır, böylece sonuçta ne anlama geldiğini anlayamayız.
Özgür yazılımın anlamının bir parçası, kullanıcıların programın kaynak koduna (planına) erişebilmeleridir. Bir programın kaynak kodu; yardımcı aralıklar, açıklayıcı yorumlar ve anlamlı adlar dahil olmak üzere programcıların değiştirmesi için tercih edilen biçim anlamına gelir. Sıkıştırılmış kod; kaynak kodu yerine sahte, işe yaramaz bir alternatiftir; bu programların gerçek kaynak kodu kullanıcılar tarafından kullanılamaz, bu yüzden kullanıcılar bunu anlayamaz; bu nedenle programlar özgür değildir.
Özgür olmamaya ek olarak bu programların birçoğu kötücül yazılımdır çünkü kullanıcıyı gizlice gözetlerler. Daha da kötüsü, bazı siteler, sayfaya bakan kullanıcının eylemlerini kaydeden hizmetleri kullanırlar. Hizmetler, söylendiğine göre, web sitesinin almaması gereken bazı hassas verileri hariç tutmak için kayıtları “yeniden düzenliyor”. Ancak bu güvenilir bir şekilde çalışsa bile bu hizmetlerin tüm amacı web sitesine aslında erişmemesi gereken kişisel veriler vermektir.
Tarayıcılar normalde JavaScript programlarını ne zaman yüklediklerini size söylemez. Bazı tarayıcılarda JavaScript'i tamamen devre dışı bırakmanın bir yolu vardır ancak bu sorunun farkında olsanız bile anlaşılması zor olan özgür olmayan programları tanımlamanız ve engellemeniz büyük zorluklar doğuracaktır. Bununla birlikte özgür yazılım topluluğunda bile çoğu kullanıcı bu sorunun farkında değildir; tarayıcıların sessizliği onu gizleme eğilimindedir.
Açıklığa kavuşturmak gerekir ki, JavaScript dili, başka bir dile göre kendiliğinden kullanıcıların özglürlüğü açısından ne daha iyi ne de daha kötüdür. Kaynak kodunu özgür bir yazılım lisansı altında dağıtarak bir JavaScript programını özgür yazılım olarak yayımlamak mümkündür. Program kendi kendine yetiyorsa, eğer işleyişi ve amacı içeri girdiği sayfadan bağımsızsa, bu iyi; makinenizdeki bir dosyaya kopyalayabilir, değiştirebilir ve çalıştırmak için bir tarayıcıyla bu dosyayı ziyaret edebilirsiniz. Ancak bu alışılmadık bir durum.
JavaScript tuzağı konusu, kullanıcıların ziyaret ettiği bir web sayfasıyla JavaScript programı indirildiğinde söz konusudur. Bu JavaScript programları belirli bir sayfa veya siteyle çalışma üzere yazılmıştır ve bu sayfanın veya sitenin çalışması onlara bağımlıdır.
Varsayalım ki sayfanın JavaScript kodunu kopyaladınız ve değiştirdiniz. Bu durumda başka bir sorun ortaya çıkıyor: Programın kaynağı mevcut olsa bile tarayıcılar bu sayfayı veya siteyi ziyaret ederken değiştirilmiş sürümünüzü, özgün sürüm yerine çalıştırmak için bir yol sunmuyor. Prensipte üstesinden gelmek çok zor olmasa da etkisi tivoizasyon ile karşılaştırılabilir.
JavaScript, web sitelerinin kullanıcıya gönderilen programlar için kullandığı tek dil değildir. Flash, JavaScript'in genişletilmiş bir varyantı aracılığıyla programlamayı destekler, ama bu artık geçmişte kaldı. Microsoft Silverlight'in Flash'a benzer bir sorun yaratması muhtemel görünüyor, belki de daha da kötüsü, çünkü Microsoft onu özgür olmayan kod çözücüler için bir platform olarak kullanıyor. Silverlight için özgür bir alternatif, normalde özgür alternatif kod çözücüleriyle birlikte gelmediği sürece, özgür dünyanın işine yaramaya yetmez.
Java uygulamacıkları da tarayıcıda çalışır ve benzer sorunları ortaya çıkarır. Genel olarak herhangi bir uygulamacık sistemi bu tür bir sorun taşır. Bir uygulamacık için özgür bir yürütme ortamına sahip olmanın bize yararı ancak sorunla karşılaştırmak olur.
Salt HTML ve CSS ile programlama teorik olarak mümkün olsa da, uygulamada bu yetenek sınırlıdır ve sakıncalıdır; sadece bir şeyi yapmak için etkileyici bir hack. Bu tür programlar özgür olmalı, fakat CSS 2019 itibareiyle kullanıcıların özgürlüğü için ciddi bir sorun değil.
Web sitelerinin yalnızca özgür olan (bazıları “açık” diyor), yani belgelendirmeleri yayınlanan ve gerçekleştirimlerinin özgür olduğu biçimleri ve protokolleri aracılığıyla iletişim kurmasını isteyen güçlü bir hareket gelişti. Ancak web sayfalarındaki JavaScript programlarının varlığı bu ölçütü yetersiz kılmaktadır. JavaScript dilinin kendisi bir biçim olarak özgürdür ve bir web sitesinde JavaScript kullanımı mutlaka kötü olmak zorunda değildir. Ancak, yukarıda gördüğümüz gibi, JavaScript programı özgür değilse, kötü de olabilir. Site kullanıcıya bir program gönderdiğinde programın belgelenmiş ve engelsiz bir dilde yazılması yeterli değildir; yazılan bu program da özgür olmalı. “Kullanıcıya yalnızca özgür programları ileten” etik bir web sitesi için ölçütün bir parçası haline gelmelidir.
Özgür olmayan programların sessizce yüklenmesi ve çalıştırılması, “web uygulamalarının” ortaya çıkardığı çeşitli sorunlardan sadece biridir. “Web uygulaması” terimi, kullanıcılara sunulan yazılım ile sunucu üzerinde çalışan yazılımlar arasındaki temel ayrımı göz ardı etmek için tasarlanmıştır. Tarayıcıda çalışan özelleşmiş bir istemci programı kastediliyor olabilir; özelleşmiş sunucu yazılımı kastediliyor olabilir; özelleşmiş sunucu yazılımı ile birlikte çalışan özelleşmiş bir istemci programı kastediliyor olabilir. İstemci ve sunucu tarafları; farklı bir etik sorun ortaya çıkarmaktadır, sıkı bir şekilde entegre olmuş olsalar bile tartışmasız tek bir programın bölümlerini oluştururlar. Bu makale yalnızca istemci tarafındaki yazılım sorununu ele almaktadır. Sunucu sorununu ayrıca ele alıyoruz.
Pratik açıdan web sitelerinde anlaşılması zor olan özgür olmayan JavaScript programları sorununu nasıl çözebiliriz? İlk adım, onu çalıştırmaktan kaçınmaktır.
“Anlaşılması zor olan“ derken neyi kastediyoruz? Bu bir seviye meselesidir, bu yüzden doğru bir cevap bulmak yerine iyi sonuçlar veren basit bir ölçüt tasarlama meselesidir.
Şu anki ölçütümüz, aşağıdaki koşullardan herhangi birini içeren bir JavaScript programını anlaşılması zor bir program olarak değerlendirmektir:
- harici bir komut dosyası olarak adlandırılır (başka bir sayfadan).
- 50'den fazla eleman uzunluğunda bir dizi tanımlar.
- ilkel bir tipten başka bir şey çağıran adlandırılmış bir varlık (fonksiyon veya metot) tanımlar.
- üçten fazla koşullu yapı ve döngü yapısı içeren adlandırılmış bir varlık tanımlar.
- adlandırılmış tanımların dışındaki kod; sayfada daha fazla tanımlanan ilkellerden ve fonksiyonlardan başka bir şey çağırır.
- adlandırılmış tanımların dışındaki kod; toplamda üçten fazla koşullu yapı ve döngü yapısı içerir.
- eval kullanır.
- Ajax çağrıları yapar.
- nesne[özellik] gibi, dinamik nesne özelliği erişimi için köşeli parantez gösterimini kullanır.
- DOM'u değiştirir.
- programı yorumlamadan analiz etmesi zor olan ya da bu tür yapıları kullanan betiklerle yüklü dinamik JavaScript yapılarını kullanır. Özellikle, bir karakter dizisinden başka bir yapıyı belirli metotlarla kullanma (Obj.write, Obj.createElement ve diğerleri).
JavaScript kodunun özgür olup olmadığını nasıl anlarız? Ayrı bir makalede bir web sayfasındaki anlaşılması zor olan bir JavaScript programının kaynak kodunun bulunduğu URL'yi ve biçimlendirilmiş yorumları kullanarak lisansını belirtebileceği bir yöntem öneriyoruz.
Son olarak web sayfalarındaki anlaşılması zor olan özgür olmayan JavaScript'i tespit etmek ve engellemek için özgür tarayıcıları değiştirmemiz gerekiyor. LibreJS programı; ziyaret ettiğiniz sayfalarda özgür olmayan, anlaşılması zor olan bir JavaScript'i tespit eder ve engeller. LibreJS, IceCat'a dâhil edilmiştir ve Firefox için bir eklenti olarak mevcuttur.
Tarayıcı kullanıcılarının ayrıca belirli bir sayfada JavaScript yerine kullanılacak JavaScript kodunu belirtmek için uygun bir vasıtaya ihtiyacı vardır. (Belirtilen kod, bu sayfadaki özgür JavaScript programının tamamen değiştirilmesi veya değiştirilmiş bir sürümü olabilir.) Greasemonkey, bunu yapmaya en yakın eklentidir, ancak tam olarak bunu yapamaz, çünkü bu program çalıştırılmadan önce bir sayfadaki JavaScript kodunu değiştirmeyi garanti etmez. Yerel bir vekil sunucu kullanmak işe yarar ancak bu da gerçek bir çözüm olmak için çok zahmetli. Güvenilir ve uygun bir çözüm ve değişiklikleri paylaşmak için siteler oluşturmak gerekir. GNU Projesi sadece özgür değişikliklere adanmış siteleri önermek ister.
Bu özellikler, bir web sayfasına dâhil olan bir JavaScript programının gerçek ve pratik anlamda özgür olmasını mümkün kılacaktır. JavaScript artık özgürlüğümüz için belirgin bir engel teşkil etmeyecek, şimdi C ve Java'nın olduğundan daha fazla değil en azından. Kurulum için teklif edilen özgür olmayan paketleri reddettiğimiz gibi, özgür olmayan, anlaşılması zor olan JavaScript programlarını reddebilecek ve hatta değiştirebileceğiz. Böylece web sitelerinin Javascript'lerini özgürleştirme kampanyamız da başlayabilir.
Bu arada özgür olmayan bir JavaScript programını çalıştırmanın kabul edilebilir olduğu bir durum var: Web sitesi operatörlerine sitedeki JavaScript kodunu özgürleştirmeleri veya kaldırmaları gerektiğini söyleyen bir şikayet göndermek. Lütfen bunu yapmak için geçici olarak JavaScript'i etkinleştirmekten çekinmeyin, ancak elbette daha sonra tekrar devre dışı bırakmayı unutmayın.
Web yöneticileri: Bir web sitesindeki JavaScript programlarının lisansını belirtmenin birkaç yolu vardır.
Teşekkürler: Matt Lee ve John Resig'e önerdiğimiz ölçütleri tanımlamamıza yardım ettikleri için ve hususu dikkatime sunduğu için David Parunakian'a teşekkür ediyorum.
Web yöneticileri: Bir web sitesindeki JavaScript programlarının lisansını belirtmenin birkaç yolu vardır.