English [en]   العربية [ar]   español [es]   فارسی [fa]   français [fr]   hrvatski [hr]   italiano [it]   日本語 [ja]   lietuvių [lt]   Nederlands [nl]   polski [pl]   português do Brasil [pt-br]   русский [ru]   українська [uk]   简体中文 [zh-cn]  

会员给予自由软件基金会动力。请助力我们达成新增700会员的目标或者请在12月31日前捐款!

加入

$220,296
$450,000

这是针对英文原版页面的中文翻译。

JavaScript的陷阱

Richard Stallman

你可能每天都在自己的电脑上运行非自由软件却毫不知情—通过使用你的浏览器。

网络管理员:有好几种方法可以指示网站的JavaScript程序的许可证。

在自由软件社区,非自由软件会侵害其用户的概念大家都很熟悉。有些人会拒绝在电脑上使用任何专属软件,以此来捍卫自己的自由。还有许多人意识到非自由并拒绝那些程序。

许多用户知道浏览器要求安装的插件有此问题,因为它们可能是自由软件,也可能是非自由软件。但是浏览器也会运行不要求你许可的其他非自由软件,甚至也不告诉你—网页带有或链接了哪些程序。这些程序多数是用JavaScript编写的,虽然其他语言也是可以的。

JavaScript(正式名称是ECMAScript,但是很少有人用了)曾经用于不重要的网页装饰,比如可爱但是并不重要的导航和显示功能。可以认为这些只是HTML标记语言的扩展,而不是真正的软件,这样就可以忽略它的问题。

许多网站仍然这样使用JavaScript,但是有一些网站用它作为完成任务的主要程序。例如,Google Docs会尝试在你的电脑里下载大约500k字节的JavaScript程序,该程序使用一种我们称之为模糊脚本(Obfuscript)的紧密格式,没有注释,也少有空格,而其方法的名称只有一个字母。一个程序的源代码应该是有利于修改程序的形式;这种紧密格式不是源代码,其源代码没有提供给用户。

除了不是自由软件,许多这类程序都是恶意软件,因为它们嗅探用户

浏览器一般不会告诉你它们什么时候会加载JavaScript程序。有些浏览器提供了完全禁用JavaScript的方法,可是即使你知道有问题,你还是需要花很多精力去确认这些非自由软件并拦截它们。然而,就连自由软件社区的大多数用户都不知道这个有问题;而浏览器的沉默也好似在掩盖这个问题。

可以把JavaScript程序发布为自由软件,使用自由软件许可证发布其源代码就行。如果该程序是自给自足的—如果它的功能和目的独立于它所应用的网站—这就没问题;你可以将其拷贝到你的电脑,修改它,使用浏览器加载它并运行它。但是这并不是其通常的情形。

通常情况下,JavaScript程序会和特定的网页或网站一起工作,而那个网页或网站有了这个程序才能正常工作。这就出现了另一个问题:即使有源程序,浏览器也无法运行你修改的版本,除非你使用原来的版本访问特定的网站或网页。这个效果和tivoization1类似,虽然从根本上不是那么难以解决。

JavaScript不是网站发送到用户的程序使用的唯一语言。Flash支持用一种扩展的JavaScript语言编程;如果我们有足够完整的自由Flash播放器,我们就可以对付非自由Flash程序带来的问题。Silverlight似乎也和Flash一样创建一些程序,可能更糟,因为微软使用它作为非自由编解码器的平台。自由的Silverlight替代不能为自由世界正常工作,除非它还带有自由的编解码替代。

Java小程序2也会在浏览器里运行,也就有同样的问题。一般来说,各种小程序系统都有这样的问题。创建一个运行小程序的自由环境仅仅是让我们能够看到这个问题。

理论上能够使用HTML和CSS编程,但是实际上它不方便而且受限制;最多只是展示一些令人惊奇的黑客编程技巧。这些程序理应是自由的,但CSS在2106年还不是影响用户自由的严重问题。

已经有一个强大的运动,它号召网站只使用自由(有的人叫"开放")的格式和协议来通讯;就是说,它们的文档应该公开,而且任何人都有自由来实现。当网页带有程序时,这个标准是必要的,但是并不充分。JavaScript本身,作为一种格式,是自由的,而且在网站上使用JavaScript并不必然是坏事。然而,正如以上所看到的,它也不必然就是好事。当网站将程序转移到用户,程序只是由有文档、不受限制的语言编写并不足够;该程序必须也是自由的。“只许把自由软件转移到用户”必须成为网站行为规范的准则。

不动声色地加载和运行非自由软件只是"网络应用"带来的诸多问题之一。"网络应用"这一术语就是用来抹杀用户软件和服务器软件的根本区别。它可以指运行在浏览器里的特定客户端软件;它也可以指特定的服务器软件;它还可以指和特定服务器软件紧密协作的客户端软件。客户端和服务器端有不同的道德问题,即使它们如此紧密地协作,以至于可以说它们是一个软件的不同部分。本文只讨论客户端软件的问题。我们会分开讨论服务器端的软件。

实际操作中,我们应该如何对付网站上非自由、非平凡的JavaScript程序带来的问题呢?第一步就是避免运行它。

什么是我们说的"非平凡"呢?它表示的是程度,所以它是指设计一种简明的标准来获得好的结果,而不是去寻求唯一正确的答案。

我们目前的政策认为一个JavaScript程序是非平凡的,如果:

我们如何判别JavaScript代码是否是自由的?在另一篇文章中,我们提议了一种方法,它指出网页带有的非平凡JavaScript程序可以使用风格化的注释来表达获得其源代码的URL,也可以表达其许可证。

最后,我们需要修改自由的浏览器,使它们可以探测并拦截网页上非平凡、非自由的JavaScript。LibreJS程序就可以探测到你访问的网页上的非自由、非平凡的JavaScript,并拦截之。LibreJS包含在IceCat浏览器中,也可以作为Firefox的附加组件。

浏览器用户还需要方便的工具来指定需要使用的JavaScript代码,而不是使用网页上的JavaScript代码。(指定的代码可以是完全的替代,也可以是页面上的自由JavaScript程序的修改版。)Greasemonkey已经快能够做到这一点,但是还没有,因为它不能保证在页面上的JavaScript程序运行之前就做出修改。使用本地的代理可以工作,但是作为真正的解决方案还是太不方便。我们需要构建一个可靠和方便的解决方案,也要构建一个分享修改方法的网站。GNU工程愿意推荐那些只致力于分享自由修改方法的网站。

这些措施使网页带有的JavaScript程序变成实际和真正意义上的自由软件成为可能。JavaScript就不再是阻碍我们自由的特别障碍—就象现在的C和Java那样。我们将来能够拒绝、甚至替换掉非自由和非平凡的JavaScript程序,就像我们拒绝和替换那些以通常形式安装的非自由软件包一样。那时,我们就能够开始让网站提供自由JavaScript程序的活动了。

与此同时,在一种情形下运行非自由JavaScript程序是可以接受的:使用它来向网站操作员抱怨该网站应该移除JavaScript代码或者使它自由。请不要犹豫,你可以暂时启用JavaScript做这件事—之后别忘了再禁用它就好。

网络管理员:有好几种方法可以指示网站的JavaScript程序的许可证。

致谢:我感谢Matt LeeJohn Resig,他们帮助我们定义了我们提议的标准,还感谢David Parunakian提醒我关注此问题。

译注

  1. tivoization,是一种电脑工具,它包含在GPL软件内但你却不能修改它,因为一旦发现软件遭到修改它就会自动关闭。
  2. applet,是一种小程序,可以在特定的环境下独立运行。

返回顶部


[FSF 标志]“我们的使命在于维护、保障和推动人们使用、学习、复制和重新发布计算机软件的自由,我们的使命还在于捍卫自由软件使用者的权利。”

自由软件基金会是GNU操作系统的主要赞助机构。请通过以下方式支持GNU和FSF购买手册和装备 加入FSF成为会员、直接或者通过Flattr向FSF捐赠