javascript-trap.html (27073B)
1 <!--#set var="ENGLISH_PAGE" value="/philosophy/javascript-trap.en.html" --> 2 3 <!--#include virtual="/server/header.ru.html" --> 4 <!-- Parent-Version: 1.96 --> 5 <!-- This page is derived from /server/standards/boilerplate.html --> 6 <!--#set var="TAGS" value="essays licensing traps" --> 7 <!--#set var="DISABLE_TOP_ADDENDUM" value="yes" --> 8 9 <!-- This file is automatically generated by GNUnited Nations! --> 10 <title>Западня JavaScript - Проект GNU - Фонд свободного программного обеспечения</title> 11 12 <!--#include virtual="/philosophy/po/javascript-trap.translist" --> 13 <!--#include virtual="/server/banner.ru.html" --> 14 <!--#include virtual="/philosophy/ph-breadcrumb.ru.html" --> 15 <!--GNUN: OUT-OF-DATE NOTICE--> 16 <!--#include virtual="/server/top-addendum.ru.html" --> 17 <div class="article reduced-width"> 18 <h2>Западня JavaScript</h2> 19 20 <address class="byline"><a href="https://www.stallman.org/">Ричард Столмен</a></address> 21 22 <p><strong>Не исключено, что вы запускаете несвободные программы на своем 23 компьютере каждый день, даже не осознавая этого — 24 из вашего браузера.</strong></p> 25 26 <!-- any links that used to point to the appendices should point to 27 free-your-javascript.html instead. --> 28 <div class="announcement"> 29 <hr class="no-display" /> 30 <p>Вебмастеры: есть <a 31 href="/software/librejs/free-your-javascript.html">несколько способов 32 указать лицензию программ на JavaScript</a> на сайте.</p> 33 <hr class="no-display" /> 34 </div> 35 36 <p>Сообщество свободного программного обеспечения хорошо знакомо с идеей, что 37 <a href="/philosophy/free-software-even-more-important.html">любая 38 несвободная программа несправедлива по отношению к 39 пользователям</a>. Некоторые из нас защищают нашу свободу, отвергая всякие 40 несвободные программы на наших компьютерах. Многие другие считают 41 несвободность программы серьезным недостатком.</p> 42 43 <p>Многим пользователям известно, что этот вопрос касается модулей, которые 44 браузеры предлагают установить, поскольку они могут быть свободными или 45 несвободными. Но существуют другие несвободные программы, которые браузеры 46 выполняют, не спрашивая вас и даже не говоря вам об этом — это 47 программы, на которые ссылаются или которые содержат страницы сайта. Эти 48 программы чаще всего написаны на языке JavaScript, хотя используются и 49 другие языки.</p> 50 51 <p>JavaScript (официально называемый “ECMAScript”, но мало кто 52 употребляет это название) когда-то применяли для мелких излишеств на 53 страницах Интернета, таких как занятные, но несущественные детали 54 отображения и навигации. Было допустимо рассматривать их просто как 55 дополнения к разметке HTML, а не как настоящие программы, и не задаваться 56 этим вопросом.</p> 57 58 <p>Некоторые сайты до сих пор используют JavaScript таким же образом, но многие 59 применяют его для крупных программ, которые решают серьезные 60 задачи. Например, “Google Docs” пытается установить в вашем 61 браузере программу на JavaScript, занимающую полмегабайта, в сжатом виде, 62 который мы называем “Obfuscript” (запутанный сценарий). Это 63 программа в сжатом виде, полученная из исходного текста удалением избыточных 64 пробелов, без которых программу невозможно читать, а также пояснительных 65 замечаний, которые позволяют понять программу, и заменой всех значащих 66 идентификаторов в программе на произвольные краткие идентификаторы, так что 67 невозможно понять, что это должно означать.</p> 68 69 <p>Часть <a href="/philosophy/free-sw.html">представления о свободных 70 программах</a> заключается в том, что у пользователей есть доступ к 71 исходному тексту программы (ее плану). Исходный текст программы — 72 это форма, предпочтительная для внесения программистами 73 изменений — она содержит полезное форматирование, пояснительные 74 заметки, а также осмысленные идентификаторы. Сжатая программа в качестве 75 исходного текста никуда не годится; настоящий исходный текст этих программ 76 пользователям не доступен, так что пользователи не могут разбираться в них; 77 таким образом, программы несвободны.</p> 78 79 <p>Кроме того, что они несвободны, многие из этих программ <em>вредоносны</em>, 80 потому что они <a 81 href="https://github.com/w3c/fingerprinting-guidance/issues/8">шпионят за 82 пользователем</a>. Что еще более гадко, некоторые сайты пользуются 83 службами, которые <a 84 href="https://freedom-to-tinker.com/2017/11/15/no-boundaries-exfiltration-of-personal-data-by-session-replay-scripts/">записывают 85 все действия пользователя при просмотре страницы</a>. Предположительно 86 службы “урезают” записи, чтобы исключить какие-то 87 конфиденциальные данные, которые сайт получать не должен. Но даже если это 88 работает надежно, само назначение этих служб состоит в том, чтобы дать сайту 89 персональные данные, которых он получать не должен.</p> 90 91 <p>Браузеры обычно не сообщают вам о том, что они загружают программы на 92 JavaScript. В некоторых браузерах есть способ полностью выключить 93 JavaScript, но даже если вы знакомы с этой проблемой, вам было бы достаточно 94 трудно распознать содержательные несвободные программы и заблокировать 95 их. Однако даже в сообществе свободного программного обеспечения большинство 96 пользователей не знает об этой проблеме; молчание браузеров не выставляет ее 97 напоказ.</p> 98 99 <p>Для ясности: язык JavaScript сам по себе не лучше и не хуже для свободы 100 пользователей, чем любой другой язык. Можно сделать программу на JavaScript 101 свободной, распространяя исходный текст по лицензии свободных программ. Если 102 программа самостоятельна — если ее работа и назначение не зависят 103 от страницы, на которой она используется — прекрасно; вы можете 104 сохранить ее на своей машине, изменить ее и открыть в браузере, чтобы 105 работать с ней. Можно даже упаковать ее для установки точно так же, как 106 другие свободные программы, и вызова из командной оболочки. Эти программы не 107 представляют никаких особых нравственных проблем по сравнению с программами 108 на Си.</p> 109 110 <p>Проблема западни JavaScript возникает, когда программа на JavaScript 111 загружается со страницей сайта, который посещает пользователь. Эти программы 112 на JavaScript написаны для работы с конкретной страницей или сайтом, и они 113 нужны, чтобы страница или сайт работали.</p> 114 115 <p>Предположем, вы копируете и модифицируете программу JavaScript данной 116 страницы. Тогда встает другая проблема: даже если исходный текст программы 117 доступен, браузеры не предлагают способа работать с измененной вами версией 118 вместо исходной, когда вы посещаете этот сайт. Этот эффект сравним с 119 тивоизацией, хотя его в принципе не так трудно преодолеть.</p> 120 121 <p>JavaScript — не единственный язык, на котором написаны программы, 122 передаваемые с сайтов пользователю. Flash поддерживал программирование с 123 помощью расширенного варианта языка JavaScript, но это все в 124 прошлом. Microsoft Silverlight, кажется, создает проблемы, сходные с Flash, 125 только еще хуже, поскольку Microsoft применяет его как базу для несвободных 126 кодеков. Свободная замена Silverlight не решит адекватно проблему для 127 свободного мира, если вместе с ней не будут поставляться свободные замены 128 кодеков.</p> 129 130 <p>Апплеты на языке Java тоже выполняются в браузере и приводят к 131 похожим проблемам. Вообще говоря, любая система апплетов 132 приводит к проблемам этого рода. Наличие свободной среды 133 для выполнения апплетов приводит нас только к 134 постановке этого вопроса.</p> 135 136 <p>Теоретически возможно программировать на HTML и CSS, но на практике эти 137 возможности ограничены, это неудобно; для каждой малости требуется 138 незаурядное мастерство. Такие программы должны быть свободны, но 139 на 2019 год CSS не представляет серьезной проблемы для 140 пользователей.</p> 141 142 <p>Возникло мощное движение, которое призывает применять на сайтах только 143 форматы и протоколы, которые свободны (некоторые говорят 144 “открыты”); другими словами, те, документация на которые 145 опубликована и которые каждый волен реализовать. Однако наличие программ на 146 JavaScript на страницах сайтов делает это условие недостаточным. Сам по себе 147 JavaScript свободен как формат, и когда его применяют на сайте, это не 148 обязательно плохо. Однако, как мы видели выше, это может быть 149 нехорошо — если программа на JavaScript несвободна. Когда сайт 150 передает программу пользователю, недостаточно, чтобы программа была написана 151 на документированном и не вызывающем затруднений языке — эта 152 программа тоже должна быть свободна. Условие “пользователю передаются 153 только свободные программы” должно стать частью критерия этичного 154 поведения сайтов.</p> 155 156 <p>Молчаливая загрузка и выполнение несвободных программ — один из 157 нескольких вопросов, поднимаемых “веб-приложениями”. Термин 158 “веб-приложение” был создан, чтобы стереть принципиальное 159 различие между программами, которые передают пользователям, и программами, 160 которые работают на сервере. Он может обозначать особую клиентскую 161 программу, которую выполняет браузер; он может обозначать особую серверную 162 программу; он может обозначать особую клиентскую программу, которая работает 163 рука об руку с особой серверной программой. Клиентская и серверная стороны 164 затрагивают разные этические вопросы, даже если они так тесно связаны, что 165 можно утверждать, что они представляют собой части одной программы. Эта 166 статья рассматривает только вопрос программ на клиентской стороне. Вопрос 167 серверной стороны мы рассматриваем отдельно.</p> 168 169 <p>Как на практике мы можем решать проблему нетривиальных несвободных программ 170 на языке JavaScript на сайтах? Первый шаг — избегать выполнения 171 их.</p> 172 173 <p>Что мы подразумеваем под “нетривиальным”? Это понятие 174 растяжимое, так что это вопрос создания простого критерия, дающего хорошие 175 результаты, а не поиска единственно верного ответа.</p> 176 <p> 177 В настоящее время мы пользуемся правилом, согласно которому программа на 178 JavaScript нетривиальна, если выполняется любое из условий:</p> 179 180 <ul> 181 <li>на нее ссылаются как на внешний сценарий (с другой страницы);</li> 182 183 <li>в ней объявляется массив длиной более 50 элементов;</li> 184 185 <li>в ней определяется именованный объект (функция или метод), который вызывает 186 что-либо кроме примитива;</li> 187 188 <li>в ней определяется именованный объект с более чем тремя условными 189 конструкциями или циклами;</li> 190 191 <li>программы вне именованных определений вызывают что-либо кроме примитивов и 192 функций, определенных далее на этой странице;</li> 193 194 <li>программы вне именованных определений содержат более чем три условных 195 конструкции и цикла (всего);</li> 196 197 <li>в ней вызывается <b>eval</b>;</li> 198 199 <li>в ней делаются вызовы Ajax;</li> 200 201 <li>в ней применяется нотация квадратных скобок для доступа к свойствам 202 динамического объекта, что выглядит как 203 <b><em>объект</em>[<em>свойство</em>]</b>.</li> 204 205 <li>в ней изменяется DOM;</li> 206 207 <li>она применяет динамические конструкции, которые трудно анализировать без 208 интерпретации программы или загружается с программами, которые применяют 209 такие конструкции. А именно, применение любых конструкций, кроме литерала 210 строки с определенными методами (<b>Obj.write</b>, <b>Obj.createElement</b> 211 и другие).</li> 212 </ul> 213 214 <p>Как мы узнаем, свободны ли программы на JavaScript? <a 215 href="/licenses/javascript-labels.html">В отдельной статье мы предлагаем 216 метод</a>, которым нетривиальная программа на языке JavaScript на странице 217 сайта может указать адрес, по которому находится ее исходный текст, а также 218 может указать и лицензию с помощью стилизованных комментариев.</p> 219 220 <p>Наконец, нам нужно изменить свободные браузеры так, чтобы они обнаруживали и 221 блокировали несвободные нетривиальные программы на языке JavaScript на 222 страницах сайтов. Программа <a href="/software/librejs/">LibreJS</a> 223 обнаруживает несвободные нетривиальные программы на JavaScript на страницах, 224 которые вы посещаете, и блокирует их. LibreJS входит в состав IceCat и 225 доступен в качестве дополнения для Firefox.</p> 226 227 <p>Пользователям браузера нужен также удобный механизм для указания 228 программ, которые нужно использовать <em>вместо</em> программ 229 на определенной странице. (Указанные программы могут быть 230 полной заменой или только измененной версией свободных программ 231 с той страницы.) Greasemonkey приближается к этому, 232 но не совсем, потому что не гарантирует, что 233 программа со страницы будет изменена перед тем, как эта программа 234 начинает выполняться. Можно использовать локальный прокси-сервер, 235 но это слишком непрактично для реального решения. 236 Нам нужно построить решение, которое будет 237 надежным и удобным, так же как и сайты для обмена модификациями. 238 Проект GNU хотел бы рекомендовать сайты, выделенные только для 239 свободных изменений.</p> 240 241 <p>Эти особенности будут позволять программе на JavaScript 242 со страницы сайта быть по-настоящему свободной в практическом смысле. 243 JavaScript больше не будет особенным препятствием на пути к нашей 244 свободе — не более, чем C и Java сейчас. 245 Мы сможем отвергать и даже заменять несвободные нетривиальные 246 программы на языке JavaScript точно так же, как мы отвергаем 247 и заменяем несвободные пакеты, предлагаемые для установки 248 обычным образом. Тогда мы сможем начать кампанию по освобождению 249 JavaScript на сайтах.</p> 250 251 <p>А пока выполнять несвободную программу на JavaScript допустимо в одном 252 случае: если это нужно, чтобы послать жалобу операторам сайта и сообщить им, 253 что им следует освободить или удалить программы на JavaScript с этого 254 сайта. Пожалуйста, смело включайте временно JavaScript, чтобы сделать 255 это — но не забудьте выключить его после этого.</p> 256 257 <!-- any links that used to point to the appendices should point to 258 free-your-javascript.html instead. --> 259 <div class="announcement"> 260 <hr class="no-display" /> 261 <p>Вебмастеры: есть <a 262 href="/software/librejs/free-your-javascript.html">несколько способов 263 указать лицензию программ на JavaScript</a> на сайте.</p> 264 <hr class="no-display" /> 265 </div> 266 267 <p><strong>Благодарности:</strong> Я благодарю <a 268 href="/people/people.html#mattlee">Мэтта Ли</a> и <a 269 href="https://ejohn.org">Джона Резига</a> за их помощь в определении 270 предлагаемого нами критерия, и Давида Парунакяна за то, что он обратил мое 271 внимание на эту проблему.</p> 272 </div> 273 274 <div class="translators-notes"> 275 276 <!--TRANSLATORS: Use space (SPC) as msgstr if you don't have notes.--> 277 </div> 278 </div> 279 280 <!-- for id="content", starts in the include above --> 281 <!--#include virtual="/server/footer.ru.html" --> 282 <div id="footer" role="contentinfo"> 283 <div class="unprintable"> 284 285 <p>Пожалуйста, присылайте общие запросы фонду и GNU по адресу <a 286 href="mailto:gnu@gnu.org"><gnu@gnu.org></a>. Есть также <a 287 href="/contact/">другие способы связаться</a> с фондом. Отчеты о 288 неработающих ссылках и другие поправки или предложения можно присылать по 289 адресу <a href="mailto:webmasters@gnu.org"><webmasters@gnu.org></a>.</p> 290 291 <p> 292 <!-- TRANSLATORS: Ignore the original text in this paragraph, 293 replace it with the translation of these two: 294 295 We work hard and do our best to provide accurate, good quality 296 translations. However, we are not exempt from imperfection. 297 Please send your comments and general suggestions in this regard 298 to <a href="mailto:web-translators@gnu.org"> 299 300 <web-translators@gnu.org></a>.</p> 301 302 <p>For information on coordinating and contributing translations of 303 our web pages, see <a 304 href="/server/standards/README.translations.html">Translations 305 README</a>. --> 306 Мы старались сделать этот перевод точным и качественным, но исключить 307 возможность ошибки мы не можем. Присылайте, пожалуйста, свои замечания и 308 предложения по переводу по адресу <a 309 href="mailto:web-translators@gnu.org"><web-translators@gnu.org></a>. 310 </p><p>Сведения по координации и предложениям переводов наших статей см. в 311 <a href="/server/standards/README.translations.html">“Руководстве по 312 переводам”</a>.</p> 313 </div> 314 315 <!-- Regarding copyright, in general, standalone pages (as opposed to 316 files generated as part of manuals) on the GNU web server should 317 be under CC BY-ND 4.0. Please do NOT change or remove this 318 without talking with the webmasters or licensing team first. 319 Please make sure the copyright date is consistent with the 320 document. For web pages, it is ok to list just the latest year the 321 document was modified, or published. 322 323 If you wish to list earlier years, that is ok too. 324 Either "2001, 2002, 2003" or "2001-2003" are ok for specifying 325 years, as long as each year in the range is in fact a copyrightable 326 year, i.e., a year in which the document was published (including 327 being publicly visible on the web or in a revision control system). 328 329 There is more detail about copyright years in the GNU Maintainers 330 Information document, www.gnu.org/prep/maintain. --> 331 <p>Copyright © 2009-2013, 2016-2019, 2021 Richard Stallman<br />Copyright 332 © 2009, 2010, 2011, 2012, 2013, 2016, 2017, 2018, 2019, 2021 Free 333 Software Foundation, Inc. (translation)</p> 334 335 <p>Это произведение доступно по <a rel="license" 336 href="http://creativecommons.org/licenses/by-nd/4.0/deed.ru">лицензии 337 Creative Commons Attribution-NoDerivs (<em>Атрибуция — Без 338 производных произведений</em>) 4.0 Всемирная</a>.</p> 339 340 <!--#include virtual="/server/bottom-notes.ru.html" --> 341 <div class="translators-credits"> 342 343 <!--TRANSLATORS: Use space (SPC) as msgstr if you don't want credits.--> 344 </div> 345 346 <p class="unprintable"><!-- timestamp start --> 347 Обновлено: 348 349 $Date: 2021/09/28 08:02:28 $ 350 351 <!-- timestamp end --> 352 </p> 353 </div> 354 </div> 355 <!-- for class="inner", starts in the banner include --> 356 </body> 357 </html>