taler-merchant-demos

Python-based Frontends for the Demonstration Web site
Log | Files | Refs | Submodules | README | LICENSE

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 компьютере каждый день, даже не осознавая этого&nbsp;&mdash;
     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 выполняют, не спрашивая вас и даже не говоря вам об этом&nbsp;&mdash; это
     47 программы, на которые ссылаются или которые содержат страницы сайта. Эти
     48 программы чаще всего написаны на языке JavaScript, хотя используются и
     49 другие языки.</p>
     50 
     51 <p>JavaScript (официально называемый &ldquo;ECMAScript&rdquo;, но мало кто
     52 употребляет это название) когда-то применяли для мелких излишеств на
     53 страницах Интернета, таких как занятные, но несущественные детали
     54 отображения и навигации. Было допустимо рассматривать их просто как
     55 дополнения к разметке HTML, а не как настоящие программы, и не задаваться
     56 этим вопросом.</p>
     57 
     58 <p>Некоторые сайты до сих пор используют JavaScript таким же образом, но многие
     59 применяют его для крупных программ, которые решают серьезные
     60 задачи. Например, &ldquo;Google Docs&rdquo; пытается установить в вашем
     61 браузере программу на JavaScript, занимающую полмегабайта, в сжатом виде,
     62 который мы называем &ldquo;Obfuscript&rdquo; (запутанный сценарий). Это
     63 программа в сжатом виде, полученная из исходного текста удалением избыточных
     64 пробелов, без которых программу невозможно читать, а также пояснительных
     65 замечаний, которые позволяют понять программу, и заменой всех значащих
     66 идентификаторов в программе на произвольные краткие идентификаторы, так что
     67 невозможно понять, что это должно означать.</p>
     68 
     69 <p>Часть <a href="/philosophy/free-sw.html">представления о свободных
     70 программах</a> заключается в том, что у пользователей есть доступ к
     71 исходному тексту программы (ее плану). Исходный текст программы&nbsp;&mdash;
     72 это форма, предпочтительная для внесения программистами
     73 изменений&nbsp;&mdash; она содержит полезное форматирование, пояснительные
     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 службы &ldquo;урезают&rdquo; записи, чтобы исключить какие-то
     87 конфиденциальные данные, которые сайт получать не должен. Но даже если это
     88 работает надежно, само назначение этих служб состоит в том, чтобы дать сайту
     89 персональные данные, которых он получать не должен.</p>
     90 
     91 <p>Браузеры обычно не сообщают вам о том, что они загружают программы на
     92 JavaScript. В некоторых браузерах есть способ полностью выключить
     93 JavaScript, но даже если вы знакомы с этой проблемой, вам было бы достаточно
     94 трудно распознать содержательные несвободные программы и заблокировать
     95 их. Однако даже в сообществе свободного программного обеспечения большинство
     96 пользователей не знает об этой проблеме; молчание браузеров не выставляет ее
     97 напоказ.</p>
     98 
     99 <p>Для ясности: язык JavaScript сам по себе не лучше и не хуже для свободы
    100 пользователей, чем любой другой язык. Можно сделать программу на JavaScript
    101 свободной, распространяя исходный текст по лицензии свободных программ. Если
    102 программа самостоятельна&nbsp;&mdash; если ее работа и назначение не зависят
    103 от страницы, на которой она используется&nbsp;&mdash; прекрасно; вы можете
    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&nbsp;&mdash; не единственный язык, на котором написаны программы,
    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 на&nbsp;2019&nbsp;год CSS не представляет серьезной проблемы для
    140 пользователей.</p>
    141 
    142 <p>Возникло мощное движение, которое призывает применять на сайтах только
    143 форматы и протоколы, которые свободны (некоторые говорят
    144 &ldquo;открыты&rdquo;); другими словами, те, документация на которые
    145 опубликована и которые каждый волен реализовать. Однако наличие программ на
    146 JavaScript на страницах сайтов делает это условие недостаточным. Сам по себе
    147 JavaScript свободен как формат, и когда его применяют на сайте, это не
    148 обязательно плохо. Однако, как мы видели выше, это может быть
    149 нехорошо&nbsp;&mdash; если программа на JavaScript несвободна. Когда сайт
    150 передает программу пользователю, недостаточно, чтобы программа была написана
    151 на документированном и не вызывающем затруднений языке&nbsp;&mdash; эта
    152 программа тоже должна быть свободна. Условие &ldquo;пользователю передаются
    153 только свободные программы&rdquo; должно стать частью критерия этичного
    154 поведения сайтов.</p>
    155 
    156 <p>Молчаливая загрузка и выполнение несвободных программ&nbsp;&mdash; один из
    157 нескольких вопросов, поднимаемых &ldquo;веб-приложениями&rdquo;. Термин
    158 &ldquo;веб-приложение&rdquo; был создан, чтобы стереть принципиальное
    159 различие между программами, которые передают пользователям, и программами,
    160 которые работают на сервере. Он может обозначать особую клиентскую
    161 программу, которую выполняет браузер; он может обозначать особую серверную
    162 программу; он может обозначать особую клиентскую программу, которая работает
    163 рука об руку с особой серверной программой. Клиентская и серверная стороны
    164 затрагивают разные этические вопросы, даже если они так тесно связаны, что
    165 можно утверждать, что они представляют собой части одной программы. Эта
    166 статья рассматривает только вопрос программ на клиентской стороне. Вопрос
    167 серверной стороны мы рассматриваем отдельно.</p>
    168 
    169 <p>Как на практике мы можем решать проблему нетривиальных несвободных программ
    170 на языке JavaScript на сайтах? Первый шаг&nbsp;&mdash; избегать выполнения
    171 их.</p>
    172 
    173 <p>Что мы подразумеваем под &ldquo;нетривиальным&rdquo;? Это понятие
    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 свободе&nbsp;&mdash; не более, чем C и Java сейчас.
    245 Мы сможем отвергать и даже заменять несвободные нетривиальные
    246 программы на языке JavaScript точно так же, как мы отвергаем
    247 и заменяем несвободные пакеты, предлагаемые для установки
    248 обычным образом. Тогда мы сможем начать кампанию по освобождению
    249 JavaScript на сайтах.</p>
    250 
    251 <p>А пока выполнять несвободную программу на JavaScript допустимо в одном
    252 случае: если это нужно, чтобы послать жалобу операторам сайта и сообщить им,
    253 что им следует освободить или удалить программы на JavaScript с этого
    254 сайта. Пожалуйста, смело включайте временно JavaScript, чтобы сделать
    255 это&nbsp;&mdash; но не забудьте выключить его после этого.</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">&lt;gnu@gnu.org&gt;</a>. Есть также <a
    287 href="/contact/">другие способы связаться</a> с фондом. Отчеты о
    288 неработающих ссылках и другие поправки или предложения можно присылать по
    289 адресу <a href="mailto:webmasters@gnu.org">&lt;webmasters@gnu.org&gt;</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         &lt;web-translators@gnu.org&gt;</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">&lt;web-translators@gnu.org&gt;</a>.
    310 </p><p>Сведения по координации и предложениям переводов наших статей см. в
    311 <a href="/server/standards/README.translations.html">&ldquo;Руководстве по
    312 переводам&rdquo;</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 &copy; 2009-2013, 2016-2019, 2021 Richard Stallman<br />Copyright
    332 &copy; 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>Атрибуция&nbsp;&mdash; Без
    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>