summaryrefslogtreecommitdiff
path: root/talermerchantdemos/blog/articles/ru/javascript-trap.html
blob: a7d67702b77cacd86f2c4d80ab216a82c2a178c7 (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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
<!--#set var="ENGLISH_PAGE" value="/philosophy/javascript-trap.en.html" -->

<!--#include virtual="/server/header.ru.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.ru.html" -->
<h2>Западня JavaScript</h2>

<p><a href="http://www.stallman.org/">Ричард Столмен</a></p>

<p><strong>Не исключено, что вы запускаете несвободные программы на своем
компьютере каждый день, даже не осознавая этого&nbsp;&mdash;
из вашего браузера.</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">несколько способов
указать лицензию программ на JavaScript</a> на сайте.</p>
</blockquote>

<p>Сообщество свободного программного обеспечения хорошо знакомо с идеей, что
<a href="/philosophy/free-software-even-more-important.html">любая
несвободная программа несправедлива по отношению к
пользователям</a>. Некоторые из нас защищают нашу свободу, отвергая всякие
несвободные программы на наших компьютерах. Многие другие считают
несвободность программы серьезным недостатком.</p>

<p>Многим пользователям известно, что этот вопрос касается модулей, которые
браузеры предлагают установить, поскольку они могут быть свободными или
несвободными. Но существуют другие несвободные программы, которые браузеры
выполняют, не спрашивая вас и даже не говоря вам об этом&nbsp;&mdash; это
программы, на которые ссылаются или которые содержат страницы сайта. Эти
программы чаще всего написаны на языке JavaScript, хотя используются и
другие языки.</p>

<p>JavaScript (официально называемый &ldquo;ECMAScript&rdquo;, но мало кто
употребляет это название) когда-то применяли для мелких излишеств на
страницах Интернета, таких как занятные, но несущественные детали
отображения и навигации. Было допустимо рассматривать их просто как
дополнения к разметке HTML, а не как настоящие программы, и не задаваться
этим вопросом.</p>

<p>Некоторые сайты до сих пор используют JavaScript таким же образом, но многие
применяют его для крупных программ, которые решают серьезные
задачи. Например, &ldquo;Google Docs&rdquo; пытается установить в вашем
браузере программу на JavaScript, занимающую полмегабайта, в сжатом виде,
который мы называем &ldquo;Obfuscript&rdquo; (запутанный сценарий). Это
программа в сжатом виде, полученная из исходного текста удалением избыточных
пробелов, без которых программу невозможно читать, а также пояснительных
замечаний, которые позволяют понять программу, и заменой всех значащих
идентификаторов в программе на произвольные краткие идентификаторы, так что
невозможно понять, что это должно означать.</p>

<p>Часть <a href="/philosophy/free-sw.html">представления о свободных
программах</a> заключается в том, что у пользователей есть доступ к
исходному тексту программы (ее плану). Исходный текст программы&nbsp;&mdash;
это форма, предпочтительная для внесения программистами
изменений&nbsp;&mdash; она содержит полезное форматирование, пояснительные
заметки, а также осмысленные идентификаторы. Сжатая программа в качестве
исходного текста никуда не годится; настоящий исходный текст этих программ
пользователям не доступен, так что пользователи не могут разбираться в них;
таким образом, программы несвободны.</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>. Предположительно
службы &ldquo;урезают&rdquo; записи, чтобы исключить какие-то
конфиденциальные данные, которые сайт получать не должен. Но даже если это
работает надежно, само назначение этих служб состоит в том, чтобы дать сайту
персональные данные, которых он получать не должен.</p>

<p>Браузеры обычно не сообщают вам о том, что они загружают программы на
JavaScript. В некоторых браузерах есть способ полностью выключить
JavaScript, но даже если вы знакомы с этой проблемой, вам было бы достаточно
трудно распознать содержательные несвободные программы и заблокировать
их. Однако даже в сообществе свободного программного обеспечения большинство
пользователей не знает об этой проблеме; молчание браузеров не выставляет ее
напоказ.</p>

<p>Есть возможность сделать программу на JavaScript свободной, распространяя
исходный текст по лицензии свободных программ. Если программа
самостоятельна&nbsp;&mdash; если ее работа и назначение не зависят от
страницы, на которой она используется&nbsp;&mdash; прекрасно; вы можете
сохранить ее на своей машине, изменить ее и открыть в браузере, чтобы
работать с ней. Но так обычно не делают.</p>

<p>Обычно программы на JavaScript предназначены для работы с конкретной
страницей или конкретным сайтом, а работа страницы зависит от этих
программ. Тогда встает другая проблема: даже если исходный текст программы
доступен, браузеры не предлагают способа работать с измененной вами версией
вместо исходной, когда вы посещаете этот сайт. Этот эффект сравним с
тивоизацией, хотя его в принципе не так трудно преодолеть.</p>

<p>JavaScript&nbsp;&mdash; не единственный язык, на котором написаны программы,
передаваемые с сайтов пользователю. Flash поддерживает программирование с
помощью расширенного варианта языка JavaScript; если у нас будет хотя бы
достаточно полный свободный проигрыватель Flash, нам будет необходимо решать
проблему несвободных программ на Flash. Silverlight, кажется, создает
проблемы, сходные с Flash, только еще хуже, поскольку Microsoft применяет
его как базу для несвободных кодеков. Свободная замена Silverlight не решит
проблему для свободного мира, если вместе с ней не будут поставляться
свободные замены кодеков.</p>

<p>Апплеты на языке Java тоже выполняются в браузере и приводят к
похожим проблемам. Вообще говоря, любая система апплетов
приводит к проблемам этого рода. Наличие свободной среды
для выполнения апплетов приводит нас только к
постановке этого вопроса.</p>

<p>Теоретически возможно программировать на HTML и CSS, но на практике эти
возможности ограничены, это неудобно; для каждой малости требуется
незаурядное мастерство. Такие программы должны быть свободны, но
на&nbsp;2019&nbsp;год CSS не представляет серьезной проблемы для
пользователей.</p>

<p>Возникло мощное движение, которое призывает применять на сайтах только
форматы и протоколы, которые свободны (некоторые говорят
&ldquo;открыты&rdquo;); другими словами, те, документация на которые
опубликована и которые каждый волен реализовать. Однако наличие программ на
JavaScript на страницах сайтов делает это условие недостаточным. Сам по себе
JavaScript свободен как формат, и когда его применяют на сайте, это не
обязательно плохо. Однако, как мы видели выше, это может быть
нехорошо&nbsp;&mdash; если программа на JavaScript несвободна. Когда сайт
передает программу пользователю, недостаточно, чтобы программа была написана
на документированном и не вызывающем затруднений языке&nbsp;&mdash; эта
программа тоже должна быть свободна. Условие &ldquo;пользователю передаются
только свободные программы&rdquo; должно стать частью критерия этичного
поведения сайтов.</p>

<p>Молчаливая загрузка и выполнение несвободных программ&nbsp;&mdash; один из
нескольких вопросов, поднимаемых &ldquo;веб-приложениями&rdquo;. Термин
&ldquo;веб-приложение&rdquo; был создан, чтобы стереть принципиальное
различие между программами, которые передают пользователям, и программами,
которые работают на сервере. Он может обозначать особую клиентскую
программу, которую выполняет браузер; он может обозначать особую серверную
программу; он может обозначать особую клиентскую программу, которая работает
рука об руку с особой серверной программой. Клиентская и серверная стороны
затрагивают разные этические вопросы, даже если они так тесно связаны, что
можно утверждать, что они представляют собой части одной программы. Эта
статья рассматривает только вопрос программ на клиентской стороне. Вопрос
серверной стороны мы рассматриваем отдельно.</p>

<p>Как на практике мы можем решать проблему нетривиальных несвободных программ
на языке JavaScript на сайтах? Первый шаг&nbsp;&mdash; избегать выполнения
их.</p>

<p>Что мы подразумеваем под &ldquo;нетривиальным&rdquo;? Это понятие
растяжимое, так что это вопрос создания простого критерия, дающего хорошие
результаты, а не поиска единственно верного ответа.</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>объект</em>[<em>свойство</em>]</b>.</li>

  <li>в ней изменяется DOM;</li>
  
  <li>она применяет динамические конструкции, которые трудно анализировать без
интерпретации программы или загружается с программами, которые применяют
такие конструкции. А именно, применение любых конструкций, кроме литерала
строки с определенными методами (<b>Obj.write</b>, <b>Obj.createElement</b>
и другие).</li>
</ul>

<p>Как мы узнаем, свободны ли программы на JavaScript? <a
href="/licenses/javascript-labels.html">В отдельной статье мы предлагаем
метод</a>, которым нетривиальная программа на языке JavaScript на странице
сайта может указать адрес, по которому находится ее исходный текст, а также
может указать и лицензию с помощью стилизованных комментариев.</p>

<p>Наконец, нам нужно изменить свободные браузеры так, чтобы они обнаруживали и
блокировали несвободные нетривиальные программы на языке JavaScript на
страницах сайтов. Программа <a href="/software/librejs/">LibreJS</a>
обнаруживает несвободные нетривиальные программы на JavaScript на страницах,
которые вы посещаете, и блокирует их. LibreJS входит в состав IceCat и
доступен в качестве дополнения для Firefox.</p>

<p>Пользователям браузера нужен также удобный механизм для указания
программ, которые нужно использовать <em>вместо</em> программ
на определенной странице. (Указанные программы могут быть
полной заменой или только измененной версией свободных программ
с той страницы.) Greasemonkey приближается к этому,
но не совсем, потому что не гарантирует, что
программа со страницы будет изменена перед тем, как эта программа
начинает выполняться. Можно использовать локальный прокси-сервер,
но это слишком непрактично для реального решения.
Нам нужно построить решение, которое будет
надежным и удобным, так же как и сайты для обмена модификациями.
Проект GNU хотел бы рекомендовать сайты, выделенные только для
свободных изменений.</p>

<p>Эти особенности будут позволять программе на JavaScript
со страницы сайта быть по-настоящему свободной в практическом смысле.
JavaScript больше не будет особенным препятствием на пути к нашей
свободе&nbsp;&mdash; не более, чем C и Java сейчас.
Мы сможем отвергать и даже заменять несвободные нетривиальные
программы на языке JavaScript точно так же, как мы отвергаем
и заменяем несвободные пакеты, предлагаемые для установки
обычным образом. Тогда мы сможем начать кампанию по освобождению
JavaScript на сайтах.</p>

<p>А пока выполнять несвободную программу на JavaScript допустимо в одном
случае: если это нужно, чтобы послать жалобу операторам сайта и сообщить им,
что им следует освободить или удалить программы на JavaScript с этого
сайта. Пожалуйста, смело включайте временно JavaScript, чтобы сделать
это&nbsp;&mdash; но не забудьте выключить его после этого.</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">несколько способов
указать лицензию программ на JavaScript</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.ru.html" -->
<div id="footer">
<div class="unprintable">

<p>Пожалуйста, присылайте общие запросы фонду и GNU по адресу <a
href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>. Есть также <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">&ldquo;Руководстве по
переводам&rdquo;</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>Copyright &copy; 2009, 2010, 2011, 2012, 2016, 2017, 2018,
2019 Free Software Foundation, Inc. (translation)</p>

<p>Это произведение доступно по <a rel="license"
href="http://creativecommons.org/licenses/by-nd/4.0/deed.ru">лицензии
Creative Commons Attribution-NoDerivs (<em>Атрибуция&nbsp;&mdash; Без
производных произведений</em>) 4.0 Всемирная</a>.</p>

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

<!--TRANSLATORS: Use space (SPC) as msgstr if you don't want credits.-->
 </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>