summaryrefslogtreecommitdiff
path: root/talermerchantdemos/blog/articles/ja/javascript-trap.html
blob: ceaa4fe3f9ca82a11d6e76dfc49020dcc373d345 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
<!--#set var="ENGLISH_PAGE" value="/philosophy/javascript-trap.en.html" -->

<!--#include virtual="/server/header.ja.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.ja.html" -->
<h2>JavaScriptの罠</h2>

<p><a href="http://www.stallman.org/">リチャード・ストールマン</a>著</p>

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

<!-- any links that used to point to the appendices should point to
     free-your-javascript.html instead.  -->
<blockquote>
<p>ウェブマスタのみなさん: ウェブサイトにおいて、JavaScriptプログラムのライセンスを提示する<a
href="/software/librejs/free-your-javascript.html">いくつかの方法</a>があります。</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はあなたのマシンに0.5メガバイトにも及ぶ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と似たようなものです。克服するのに困難を極める、ということはありませんが。</p>

<p>JavaScriptはウェブサイトでユーザに送られるプログラムに使われる唯一の言語ではありません。FlashはJavaScriptの拡張された一種を通じてプログラミングをサポートします。充分に完全な自由なFlashプレイヤを有するなら、(今後)不自由なFlashの問題をわたしたちは扱う必要が出るでしょう。SilverlightはFlashと同様な問題を作り出すと思われます。それがより悪いのは、マイクロソフトがそれを不自由なコーデックのプラットフォームとして使うからです。それが通常、自由な代替コーデックとともに来るのでなければ、Silverlightの自由な代替は自由な社会のために、その仕事をなし得ないでしょう。</p>

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

<p>理論的にはHTMLとCSSでプログラムすることが可能ですが、実際にはその機能は限られ不便です。(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>三つ以上の条件構造とループ構造を含む名前付のエンティティを定義する。</li>

  <li>名前付定義の外のコードでプリミティブと該当ページで定義される関数以外を呼び出す。</li>

  <li>名前付定義の外のコードであわせて三つ以上の条件構造とループ構造を含む。</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>ウェブマスタのみなさん: ウェブサイトにおいて、JavaScriptプログラムのライセンスを提示する<a
href="/software/librejs/free-your-javascript.html">いくつかの方法</a>があります。</p>
</blockquote>

<p><strong>謝辞</strong>: <a href="/people/people.html#mattlee">マット・リー</a>と<a
href="http://ejohn.org">ジョン・レジッグ</a>に、提案された基準の定義への助力に関して感謝します。また、デビッド・パルナキアンに、この問題にわたくしの関心を向けさせてくれたことを感謝します。</p>

<div class="translators-notes">

<!--TRANSLATORS: Use space (SPC) as msgstr if you don't have notes.-->
 </div>
</div>

<!-- for id="content", starts in the include above -->
<!--#include virtual="/server/footer.ja.html" -->
<div id="footer">
<div class="unprintable">

<p>FSFおよびGNUに関する問い合わせは<a
href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>までお願いします(英語)。FSFへの連絡は<a
href="/contact/">他の方法</a>もあります。リンク切れや他の修正、提案は<a
href="mailto:webmasters@gnu.org">&lt;webmasters@gnu.org&gt;</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">

        &lt;web-translators@gnu.org&gt;</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="mailto:web-translators@gnu.org">&lt;web-translators@gnu.org&gt;</a>におねがいします。</p><p>わたしたちのウェブページの翻訳の調整と提出については、<a
href="/server/standards/README.translations.html">翻訳 README</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 &copy; 2009-2013, 2016, 2017, 2018, 2019 Richard Stallman</p>

<p>このページは<a rel="license"
href="http://creativecommons.org/licenses/by-nd/4.0/deed.ja">Creative
Commons Attribution-NoDerivs 4.0 International License</a>の条件で許諾されます。</p>

<!--#include virtual="/server/bottom-notes.ja.html" -->
<div class="translators-credits">

<!--TRANSLATORS: Use space (SPC) as msgstr if you don't want credits.-->
 </div>

<p class="unprintable"><!-- timestamp start -->
最終更新:

$Date: 2020/01/16 07:31:21 $

<!-- timestamp end -->
</p>
</div>
</div>
<!-- for class="inner", starts in the banner include -->
</body>
</html>