この翻訳は、 2023-07-05 以降に行われた 英語のオリジナル版の変更を反映できていません。

確認するには、 こちらの変更をご覧ください。 わたしたちのウェブページの翻訳の保守の情報については、翻訳 READMEをご覧ください。

JavaScriptの罠

あなたは、そうとは知らずに、不自由なプログラムをあなたのコンピュータで毎日実行しているかもしれません — ウェブ・ブラウザを通じて。


ウェブマスタのみなさん: ウェブサイトにおいて、JavaScriptプログラムのライセンスを提示するいくつかの方法があります。


自由ソフトウェアコミュニティでは、どんな不自由なプログラムもそのユーザを虐待する、という考えがよく知られています。わたしたちの中には、プロプライエタリなソフトウェアをまったく拒否することで自由を守る人もいます。多くの人は不自由はプログラムへの打撃だと認識します。

多くのユーザは、この問題がブラウザがインストールするようにと提供するプラグインにも関係すると知っています。プラグインには自由か不自由かの違いがありうるからです。しかし、ブラウザは、ほかの不自由なプログラムを実行します。そのプログラムについて、ブラウザは、あなたに尋ねることも告げることもないのです。そのプログラムはウェブページに含まれていたり、リンクされてたりします。これらのプログラムはほとんどの場合、JavaScriptで書かれています。ほかの言語も、また、使われていますが。

JavaScript(公式にはECMAScriptと呼ばれますが、この名前はほとんど使われません)は、きれいだが本質的ではないナビゲーションや表示の機能のような、ウェブページのちょっとした装飾のために、かつては使われました。本当のソフトウェアとしてではなく、HTMLのマークアップの単なる拡張として考え、この問題を無視することは容認されました。

いくつかのサイトは、まだそのような方法でJavaScriptを使っていますが、多くのサイトでは大きな処理をする、大きなプログラムのために使っています。たとえば、Google Docsはあなたのマシンに0.5メガバイトにも及ぶJavaScriptのプログラムをダウンロードしようとします。それは、暗黒スクリプト(Obfuscript)と呼び得る、圧縮された形式です。この圧縮された形式はソースコードから作られます。コードを読みやすくする余分な空白を削除し、理解を助ける説明のコメントを削除し、意味を持った名前を適当な短いものに置き換え、何を意味しているのか分からなくします。

自由ソフトウェアの意味の一部に、ユーザがそのプログラムのソースコード(プログラムの設計)にアクセスできることがあります。プログラムのソースコードとは、プログラマが修正するために好ましい形態を意味し、役立つ空白、説明の注釈、そして意味のある名前を含みます。コンパクト化されたコードは偽者であり、ソースコードの役に立たない代替です。そのプログラムの本当のソースコードをユーザが利用できないのであれば、ユーザはプログラムを理解できません。ですからそのプログラムは不自由です。

不自由であることに加えて、多くのこのようなプログラムはマルウェアです。なぜならユーザを詮索するからです。もっと嫌なことに、いくつかのサイトはそのページを見ているすべてのユーザの行動を記録するサービスを使います。そのサービスはおそらくその記録を「墨消し」し、ウェブサイトが取得すべきでない敏感なデータを除外するでしょう。しかし、たとえそれが信頼性をもって処理されるとしても、このようなサービスの全体の目的はウェブサイトに取得すべきでない個人情報を提供することなのです。

JavaScriptのプログラムをロードしたときに、ブラウザは通常何も言いません。いくつかのブラウザは、JavaScriptを完全に停止する方法を有してますが、たとえ、この問題を知っていたとしても、こういった瑣末ではない不自由なプログラムを同定し、ブロックするのには大変な労力が必要となるでしょう。しかし、自由ソフトウェアのコミュニティでさえ、ほとんどのユーザはこの問題を知りません。ブラウザの沈黙がこの問題を隠す傾向にあるのです。

明確にすると、JavaScript言語がユーザの自由にとってほかの言語と比べて本質的に良い/悪いということはありません。JavaScriptプログラムを自由ソフトウェアライセンスでソースコードを配布し、自由ソフトウェアとしてリリースすることは可能です。もしそのプログラムがそれ自身で意味があるものなら(一緒に来るページと機能と目的が独立であれば)、問題ありません。あなたのマシンにファイルとしてコピーでき、変更し、ブラウザでそのファイルを見て実行できます。ほかの自由なプログラムと同様にインストールのためにパッケージすることさえできますし、シェルコマンドで実行もできます。こういったプログラムは、Cのプログラムと特段異なる道徳上の問題があるわけではありません。

JavaScriptの罠の問題は、JavaScriptのプログラムがユーザが訪れるウェブページとともにもたらされる時に生じます。こういった JavaScript のプログラムは、特定のページやサイトで動くように書かれ、そのページやサイトは機能するためにそのプログラムに依存します。

そのページのJavaScriptのコードをあなたがコピーして変更したとしましょう。ここで、別の問題が生じます: たとえプログラムのソースが利用可能でも、ブラウザは、そのページやサイトを訪れた際、あなたの変更したバージョンをオリジナルの代わりに実行する方法を提供しないのです。この効果はTivoizationと似たようなものです。克服するのに困難を極める、というほどではありませんが。

JavaScriptはウェブサイトでユーザに送られるプログラムに使われる唯一の言語ではありません。FlashはJavaScriptの拡張された一種を通じてプログラミングをサポートしましたが、これは過去のものです。マイクロソフトのSilverlightはFlashと同様な問題を作り出すと思われます。それがより悪いのは、マイクロソフトがそれを不自由なコーデックのプラットフォームとして使うからです。それが通常、自由な代替コーデックとともに来るのでなければ、Silverlightの自由な代替は自由な社会のために、その仕事を適切になし得ないでしょう。

Javaアプレットもブラウザで実行され、同様な問題を引き起こします。一般に、どのような種類のアプレットシステムもこの種の問題を有しています。アプレットの自由な実行環境を有するということは、この問題に出くわすのに十分なところに、わたしたちを連れていってくれる、というだけです。

理論的にはHTMLとCSSでプログラムすることが可能ですが、実際にはその機能は限られ不便です。(HTMLとCSSだけで)何かをすることは、すばらしいハックでしょう。そのようなプログラムは自由であるべきですが、CSSは2019年の時点において、ユーザの自由に対する深刻な問題ではありません。

ウェブサイトに対して、自由な(ある人は「オープン」と言います)、すなわち、その文書が公表されていて誰もが自由に実装できる、そういったフォーマットとプロトコルだけを通じて通信することを要求する、力強い運動が発達してきました。しかし、ウェブページの中のJavaScriptプログラムの存在がこの基準を不十分とします。JavaScriptそれ自身は、フォーマットとして自由で、ウェブサイトでJavaScriptを使うことは必ずしも悪くありません。しかし、上で述べたように、JavaScriptプログラムが不自由な場合、悪いものになりえます。サイトがプログラムをユーザに送信するとき、文書があり障害がない言語でかかれているプログラムだというだけでは十分ではないのです。つまり、そのプログラムも自由でなければなりません。「ユーザには自由なプログラムだけが送信される」ことが倫理的なウェブサイトの基準の一部となるべきです。

黙ったまま不自由なプログラムをロードして実行することは、「ウェブ・アプリケーション」によって引き起こされるいくつかの問題の一つです。「ウェブ・アプリケーション」という用語はユーザに送られるソフトウェアとサーバで実行されるソフトウェアの基本的な区別を無視するよう設計されています。それはブラウザで実行される特別なクライアントプログラムを指すこともありえますし、特別なサーバソフトウェアを指すこともありえます。また、特別なサーバソフトウェアと一緒に動く特別なクライアントプログラムを指すこともありえます。たとえそれらが密接に統合され単一のプログラムの部分のように構成されていたとしても、クライアント側とサーバ側では異なる倫理上の問題を引き起こします。この論説では、クライアント側のソフトウェアの問題だけを扱います。サーバの問題は別に扱っています。

実際面で、ウェブサイトの瑣末でない不自由なJavaScriptプログラムの問題をわたしたちはどのように扱えるでしょうか? 第一の段階は、それを実行することを避けることです。

「瑣末ではない」とは何を意味するでしょう? これは程度の問題ですから、一つの正解を探すよりも、良い結果を与える単純な基準を設計する問題です。

わたしたちの現在の基準では、以下の条件のいずれかを満たすJavaScriptプログラムを瑣末ではないとします:

  • 外部スクリプトとして参照される(他のページから)。
  • 50要素以上の配列を宣言する。
  • 名前の付いたエンティティ(関数あるいはメソッド)を定義し、プリミティブ以上の何かを呼び出す。
  • 三つ以上の条件構造とループ構造を含む名前付のエンティティを定義する。
  • 名前付定義の外のコードでプリミティブと該当ページで定義される関数以外を呼び出す。
  • 名前付定義の外のコードであわせて三つ以上の条件構造とループ構造を含む。
  • evalを呼び出す。
  • Ajax呼び出しを行う。
  • object[property]のようにカギ括弧の記述で動的オブジェクトのプロパティのアクセスを使う。
  • DOMを変更する。
  • プログラムを解釈せずには解析することが難しい動的なJavaScriptの構成物を使用する、あるいは、そのような構成物を使うスクリプトと一緒にロードされる。具体的には、文字列リテラル以外の構成物を特定のメソッド(Obj.writeObj.createElement、など)で使うことです。

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プログラムのライセンスを提示するいくつかの方法があります。


謝辞: マット・リージョン・レジッグに、提案された基準の定義への助力に関して感謝します。また、デビッド・パルナキアンに、この問題にわたくしの関心を向けさせてくれたことを感謝します。