diff options
Diffstat (limited to 'talermerchantdemos/blog/articles/zh/javascript-trap.html')
-rw-r--r-- | talermerchantdemos/blog/articles/zh/javascript-trap.html | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/talermerchantdemos/blog/articles/zh/javascript-trap.html b/talermerchantdemos/blog/articles/zh/javascript-trap.html new file mode 100644 index 0000000..19ac700 --- /dev/null +++ b/talermerchantdemos/blog/articles/zh/javascript-trap.html @@ -0,0 +1,193 @@ +<!--#set var="ENGLISH_PAGE" value="/philosophy/javascript-trap.en.html" --> + +<!--#include virtual="/server/header.zh-cn.html" --> +<!-- Parent-Version: 1.90 --> + +<!-- This file is automatically generated by GNUnited Nations! --> +<title>JavaScript的陷阱</title> + +<!--#include virtual="/philosophy/po/javascript-trap.translist" --> +<!--#include virtual="/server/banner.zh-cn.html" --> +<h2>JavaScript的陷阱</h2> + +<p><a href="http://www.stallman.org/">Richard Stallman</a> 著</p> + +<p><strong>你可能每天都在自己的电脑上运行非自由软件却毫不知情——通过使用你的浏览器。</strong></p> + +<!-- any links that used to point to the appendices should point to + free-your-javascript.html instead. --> +<blockquote> +<p>网络管理员:有<a +href="/software/librejs/free-your-javascript.html">好几种方法</a>可以指示网站的JavaScript程序的许可证。</p> +</blockquote> + +<p>在自由软件社区,<a +href="/philosophy/free-software-even-more-important.html">非自由软件会侵害其用户</a>的概念大家都很熟悉。有些人会拒绝在电脑上使用任何专有软件,以此来捍卫自己的自由。还有许多人意识到非自由并拒绝那些程序。</p> + +<p>许多用户知道浏览器要求安装的插件有此问题,因为它们可能是自由软件,也可能是非自由软件。但是浏览器也会运行不要求你许可的其他非自由软件,甚至也不告诉你——网页带有或链接了哪些程序。这些程序多数是用JavaScript编写的,虽然其他语言也是可以的。</p> + +<p>JavaScript(正式名称是ECMAScript,但是很少有人用了)曾经用于不重要的网页装饰,比如可爱但是并不重要的导航和显示功能。可以认为这些只是HTML标记语言的扩展,而不是真正的软件,这样就可以忽略它的问题。</p> + +<p>一些网站仍然这样使用JavaScript,但是有一些网站用它作为完成任务的主要程序。例如,Google +Docs会尝试在你的电脑里下载大约500k字节的JavaScript程序,该程序使用一种我们称之为模糊脚本(Obfuscript)的紧密格式。这种格式删除了源代码里有助阅读的空格和注释,并将原来有意义的方法名称替换为任意的短名称,这样人们就无法直接看出这些方法原来的意义。</p> + +<p><a +href="/philosophy/free-sw.html">自由软件定义</a>的内容包含着用户可以访问程序的源代码。一个程序的源代码应该是有利于修改程序的形式—包括有利阅读的空格和分行、解释性注释和有意义的名称。这种紧密格式不是源代码,而只是毫无用处的源代码替代品;其源代码并没有提供给用户,因而用户无法了解该程序;该程序是非自由的。</p> + +<p>除了是非自由软件,许多这种程序是<em>恶意软件</em>,因为它们<a +href="http://github.com/w3c/fingerprinting-guidance/issues/8">嗅探用户</a>。更恶劣的是,有些站点使用服务来记录<a +href="https://freedom-to-tinker.com/2017/11/15/no-boundaries-exfiltration-of-personal-data-by-session-replay-scripts/">用户浏览该页面时的所有行为</a>。该服务本来应该“修改”记录以抹去网站不该获得的一些敏感数据。但是,即使该功能能够可靠的实施,该服务的整体目的也是给予该网站它不应该获得的个人数据。</p> + +<p>浏览器一般不会告诉你它们什么时候会加载JavaScript程序。有些浏览器提供了完全禁用JavaScript的方法,可是即使你知道有问题,你还是需要花很多精力去确认这些非自由软件并拦截它们。然而,就连自由软件社区的大多数用户都不知道这个有问题;而浏览器的沉默也好似在掩盖这个问题。</p> + +<p>可以把JavaScript程序发布为自由软件,使用自由软件许可证发布其源代码就行。如果该程序是自给自足的——如果它的功能和目的独立于它所应用的网站——这就没问题;你可以将其拷贝到你的电脑,修改它,使用浏览器加载它并运行它。但是这并不是其通常的情形。</p> + +<p>通常情况下,JavaScript程序会和特定的网页或网站一起工作,而那个网页或网站有了这个程序才能正常工作。这就出现了另一个问题:即使有源程序,浏览器也无法运行你修改的版本,除非你使用原来的版本访问特定的网站或网页。这个效果和tivoization<sup><a +href="#TransNote1">1</a></sup>类似,虽然从根本上不是那么难以解决。</p> + +<p>JavaScript不是网站发送到用户的程序使用的唯一语言。Flash支持用一种扩展的JavaScript语言编程;如果我们有足够完整的自由Flash播放器,我们就可以对付非自由Flash程序带来的问题。Silverlight似乎也和Flash一样创建一些程序,可能更糟,因为微软使用它作为非自由编解码器的平台。自由的Silverlight替代不能为自由世界正常工作,除非它还带有自由的编解码替代。</p> + +<p>Java小程序<sup><a +href="#TransNote2">2</a></sup>也会在浏览器里运行,也就有同样的问题。一般来说,各种小程序系统都有这样的问题。创建一个运行小程序的自由环境仅仅是让我们能够看到这个问题。</p> + +<p>理论上能够使用HTML和CSS编程,但是实际上它不方便而且受限制;最多只是展示一些令人惊奇的黑客编程技巧。这些程序理应是自由的,不过CSS在2019年还不是影响用户自由的严重问题。</p> + +<p>已经有一个强大的运动,它号召网站只使用自由(有的人叫"开放")的格式和协议来通信;就是说,它们的文档应该公开,而且任何人都有自由来实现。然而,当网页带有JavaScript程序时,这个标准就不够了。JavaScript本身,作为一种格式,是自由的,而且在网站上使用JavaScript并不必然是坏事。然而,正如以上所看到的,它也不必然就是好事——如果JavaScript程序是非自由软件。当网站将程序转移到用户,程序只是由有文档、不受限制的语言编写并不足够;该程序必须也是自由的。“只许把自由软件转移到用户”必须成为网站行为规范的准则。</p> + +<p>不动声色地加载和运行非自由软件只是"网络应用"带来的诸多问题之一。"网络应用"这一术语就是用来抹杀用户软件和服务器软件的根本区别。它可以指运行在浏览器里的特定客户端软件;它也可以指特定的服务器软件;它还可以指和特定服务器软件紧密协作的客户端软件。客户端和服务器端有不同的道德问题,即使它们如此紧密地协作,以至于可以说它们是一个软件的不同部分。本文只讨论客户端软件的问题。我们会分开讨论服务器端的软件。</p> + +<p>实际操作中,我们应该如何对付网站上非自由、非平凡的JavaScript程序带来的问题呢?第一步就是避免运行它。</p> + +<p>什么是我们说的"非平凡"呢?它表示的是程度,所以它是指设计一种简明的标准来获得好的结果,而不是去寻求唯一正确的答案。</p> +<p> +我们目前的标准认为一个JavaScript程序是非平凡的,如果它满足以下任一条件:</p> + +<ul> + <li>该程序引用一个外部的脚本(来自另一个页面)。</li> + + <li>该程序声明的数组超过了50个元素。</li> + + <li>该程序定义的主体(函数或方法)会做调用基本函数以外的调用。</li> + + <li>该程序定义的主体带有3个以上的条件判断或循环结构。</li> + + <li>除了定义之外,页面的代码调用了该页面上间隔很远的非基本函数。</li> + + <li>除了定义之外,页面代码带有3个以上的条件判断或循环结构(两个结构的总和超过3)。</li> + + <li>该程序调用了 <b>eval</b>。</li> + + <li>该程序有 Ajax 调用。</li> + + <li>该程序使用带有方括号形式的动态对象属性访问,就像<b><em>object</em>[<em>property</em>]</b>这样。</li> + + <li>该程序修改了 DOM。</li> + + <li>该程序要么使用动态JavaScript结构,这些结构在不了解该程序的情况下很难分析,要么该程序和使用这些结构的脚本一起加载。具体情况是程序使用除了诸如带有方法(<b>Obj.write</b>, +<b>Obj.createElement</b>等)之外的字符串字面量。</li> +</ul> + +<p>我们如何判别JavaScript代码是否是自由的?在<a +href="/licenses/javascript-labels.html">另一篇文章</a>中,我们提议了一种方法,它指出网页带有的非平凡JavaScript程序可以使用风格化的注释来表达获得其源代码的URL,也可以表达其许可证。</p> + +<p>最后,我们需要修改自由的浏览器,使它们可以探测并拦截网页上非平凡、非自由的JavaScript。<a +href="/software/librejs/">LibreJS</a>程序就可以探测到你访问的网页上的非自由、非平凡的JavaScript,并拦截之。LibreJS包含在IceCat浏览器中,也可以作为Firefox的附加组件。</p> + +<p>浏览器用户还需要方便的工具来指定需要使用的JavaScript代码,<em>而不是</em>使用网页上的JavaScript代码。(指定的代码可以是完全的替代,也可以是页面上的自由JavaScript程序的修改版。)Greasemonkey已经快能够做到这一点,但是还没有,因为它不能保证在页面上的JavaScript程序运行之前就做出修改。使用本地的代理可以工作,但是作为真正的解决方案还是太不方便。我们需要构建一个可靠和方便的解决方案,也要构建一个分享修改方法的网站。GNU工程愿意推荐那些只致力于分享自由修改方法的网站。</p> + +<p>这些措施使网页带有的JavaScript程序变成实际和真正意义上的自由软件成为可能。JavaScript就不再是阻碍我们自由的特别障碍—就象现在的C和Java那样。我们将来能够拒绝、甚至替换掉非自由和非平凡的JavaScript程序,就像我们拒绝和替换那些以通常形式安装的非自由软件包一样。那时,我们就能够开始让网站提供自由JavaScript程序的活动了。</p> + +<p>与此同时,在一种情形下运行非自由JavaScript程序是可以接受的:使用它来向网站操作员抱怨该网站应该移除JavaScript代码或者使它自由。请不要犹豫,你可以暂时启用JavaScript做这件事—之后别忘了再禁用它就好。</p> + +<!-- any links that used to point to the appendices should point to + free-your-javascript.html instead. --> +<blockquote> +<p>网络管理员:有<a +href="/software/librejs/free-your-javascript.html">好几种方法</a>可以指示网站的JavaScript程序的许可证。</p> +</blockquote> + +<p><strong>致谢:</strong>我感谢<a href="/people/people.html#mattlee">Matt Lee</a>和<a +href="http://ejohn.org">John Resig</a>,他们帮助我们定义了我们提议的标准,还感谢David +Parunakian提醒我关注此问题。</p> + +<div class="translators-notes"> + +<!--TRANSLATORS: Use space (SPC) as msgstr if you don't have notes.--> +<h3>译注</h3> +<ol> +<li +id="TransNote1">tivoization,是一种电脑工具,它包含在GPL软件内但你却不能修改它,因为一旦发现软件遭到修改它就会自动关闭。</li> +<li id="TransNote2">applet,是一种小程序,可以在特定的环境下独立运行。</li> +</ol></div> +</div> + +<!-- for id="content", starts in the include above --> +<!--#include virtual="/server/footer.zh-cn.html" --> +<div id="footer"> +<div class="unprintable"> + +<p>请将有关自由软件基金会(FSF)&GNU的一般性问题发送到<a +href="mailto:gnu@gnu.org"><gnu@gnu.org></a>。也可以通过<a +href="/contact/">其他联系方法</a>联系自由软件基金会(FSF)。有关失效链接或其他错误和建议,请发送邮件到<a +href="mailto:webmasters@gnu.org"><webmasters@gnu.org></a>。</p> + +<p> +<!-- TRANSLATORS: Ignore the original text in this paragraph, + replace it with the translation of these two: + + We work hard and do our best to provide accurate, good quality + translations. However, we are not exempt from imperfection. + Please send your comments and general suggestions in this regard + to <a href="mailto:web-translators@gnu.org"> + + <web-translators@gnu.org></a>.</p> + + <p>For information on coordinating and submitting translations of + our web pages, see <a + href="/server/standards/README.translations.html">Translations + README</a>. --> +若您想翻译本文,请参看<a +href="/server/standards/README.translations.html">翻译须知</a>获取有关协调和提交翻译的相关事项。</p> +</div> + +<!-- Regarding copyright, in general, standalone pages (as opposed to + files generated as part of manuals) on the GNU web server should + be under CC BY-ND 4.0. Please do NOT change or remove this + without talking with the webmasters or licensing team first. + Please make sure the copyright date is consistent with the + document. For web pages, it is ok to list just the latest year the + document was modified, or published. + + If you wish to list earlier years, that is ok too. + Either "2001, 2002, 2003" or "2001-2003" are ok for specifying + years, as long as each year in the range is in fact a copyrightable + year, i.e., a year in which the document was published (including + being publicly visible on the web or in a revision control system). + + There is more detail about copyright years in the GNU Maintainers + Information document, www.gnu.org/prep/maintain. --> +<p>Copyright © 2009-2013, 2016, 2017, 2018, 2019 Richard Stallman</p> + +<p>本页面使用<a rel="license" +href="http://creativecommons.org/licenses/by-nd/4.0/">Creative Commons +Attribution-NoDerivatives 4.0 International License</a>授权。</p> + +<!--#include virtual="/server/bottom-notes.zh-cn.html" --> +<div class="translators-credits"> + +<!--TRANSLATORS: Use space (SPC) as msgstr if you don't want credits.--> +<b>翻译团队</b>:<a rel="team" +href="https://savannah.gnu.org/projects/www-zh-cn/"><CTT></a>,2017-2019。</div> + +<p class="unprintable"><!-- timestamp start --> +最后更新: + +$Date: 2019/12/30 12:08:30 $ + +<!-- timestamp end --> +</p> +</div> +</div> +<!-- for class="inner", starts in the banner include --> +</body> +</html> |