Исправить или удалить автоматически установленный JavaScript?

Эта статья была впервые опубликована Джули Марчант с применением лицензии CC BY-SA 4.0.

В эссе Ричарда Столлмана "Ловушка JavaScript" говорится о том, что люди ежедневно используют проприетарное программное обеспечение, которые беззвучно, автоматически устанавливаются в их веб-браузеры. На самом деле, он очень преуменьшает проблему; большинство пользователей не только запускают проприетарные программы каждый день, просто просматривая веб-страницы, они запускают десятки или даже сотни таких программ каждый день. Ловушка JavaScript очень реальна и распространена; говорят, что без этих нестандартных, обычно проприетарных расширений HTML настолько сломан, что веб-браузеры перешли к тому, чтобы даже не предполагают очевидную опцию отключения JavaScript; отключение JavaScript, как утверждается, приведет только к путанице.

Очевидно, что нам нужно решить эту проблему. Однако, сосредоточившись на том, являются ли скрипты вредоносными или свободными, г-н Столлман упускает важнейший момент: такое поведение автоматической, бесшумной установки программ само по себе является главной проблемой. То, что большинство программ, о которых идет речь, являются проприетарными, это лишь побочный эффект.

В ответ на статью г-на Столлмана было разработано расширение для Firefox и веб-браузеров, производных от Firefox, под названием LibreJS. Это расширение автоматически анализирует все JavaScript на странице, чтобы определить, являются ли они вредоносными или свободными; если одно из этих условий оказывается верным, программа выполняется. В противном случае она блокируется. Я ценю проект LibreJS и то, что он пытается сделать. Но я считаю, что LibreJS - это в корне неверный подход к решению проблемы.

Сейчас LibreJS терпит неудачу, потому что ему требуется формат, который нигде не признается, но теоретически это можно решить в будущем, так что давайте предположим, что так и будет. Предположим также, что LibreJS преуспевает настолько, что заставляет большую часть веб-страниц выпускать скрипты под свободными лицензиями и документировать лицензии в формате, понятном LibreJS.

На первый взгляд, это замечательно, но из этого следует, что программное обеспечение по-прежнему молча устанавливается в наши веб-браузеры каждый день. Разница лишь в том, что LibreJS считает эти программы безопасными.

Я не хочу преуменьшать важность того, чтобы все программы были свободными. Однако, когда любое программное обеспечение автоматически устанавливается на наши компьютеры по требованию другой стороны, это делает реализацию свободы невозможной. Предполагается, что вы хотите, чтобы все эти программы на JavaScript, число которых может легко исчисляться сотнями новых скриптов каждый день, выполнялись на вашем компьютере, как правило, еще до того, как у вас появится шанс проверить исходный код.

Еще хуже то, что система автоматической установки программ JavaScript устанавливает их только временно, чтобы выполнить один раз. По сути, всякий раз, когда сервер обновляет JavaScript, который отправляется в веб-браузеры пользователей, это обновление навязывается пользователям. Даже если скрипт является свободным, в него как будто бы встроен бэкдор.

Это очень похоже на случай с тивоизацией, когда вы теоретически можете контролировать действия программы, но на практике не можете сделать этого в силу обстоятельств. Теоретического контроля недостаточно. Необходим и фактический контроль. В случае с JavaScript отсутствие контроля - это не результат злого умысла, а скорее результат того, что веб-браузеры неосмотрительно полагают, что пользователь желает выполнения каждого сценария, который может быть рекомендован веб-страницей. Но это не обязательно так. Это было бы похоже на то, как если бы Windows устанавливалась на мой компьютер каждый раз, когда я читаю статью, рекомендующую использовать Windows, или если бы каждый пост в блоге, рассказывающий о том, как хорош Chrome, приводил к автоматической установке Chrome на мою систему.

Что же мы можем сделать с этим? Я знаю два возможных решения.

Решение 1: Починить JavaScript

Первое возможное решение и самое очевидное - изменить поведение веб-браузеров в отношении программных запросов JavaScript. Я предлагаю, чтобы система была приемлемой, если бы все следующие условия БЫЛИ выполнены:

  • Веб-браузер не должен исполнять JavaScript постоянно, а только тогда, когда пользователь явно разрешает это каким-либо образом.
  • Веб-браузер должен предоставлять пользователю возможность выполнять любой произвольный сценарий, а не только тот, который запрашивается определенной веб-страницей.
  • Веб-браузер не должен автоматически обновлять код JavaScript, конечно, если только пользователь не указал, что это необходимо, и пользователь должен иметь возможность выбирать, откуда приходят подобные обновления.

Вы заметите, что автоматическое определение лицензии не включено ни в одно из этих действий. Так как же пользователю получить только предпочтительный JavaScript, не проверяя вручную каждый исходный файл? Решение на самом деле довольно простое: точно так же, как и в случае с любым другим свободным программным обеспечением. Я доверяю разработчикам Trisquel в том, что они включают в репозиторий Trisquel только свободные и бесплатные программы, не содержащие вредоносных функций. Кстати, разработчики Trisquel действительно могут защитить пользователей Trisquel от вредоносных программ, проприетарных или нет; а LibreJS этого не может. Точно так же мы можем создать и поддерживать репозиторий свободного и безопасного кода JavaScript.

Чтобы это работало, установленные программы JavaScript должны также работать на всех веб-страницах, которые их запрашивают, а не только на одной. Какой уже установленный код JavaScript использовать по умолчанию, можно определить, получив хэш минифицированных версий установленных скриптов, а затем получив хэш запрошенных скриптов после их минификации тем же способом. Если это не даст результата, можно проверить имена файлов скриптов на совпадение, и спросить пользователя, следует ли использовать эти скрипты. Не помешала бы и некая база данных в веб-браузере пользователя, указывающая веб-сайты, на которых следует использовать определенные скрипты.

Я полагаю, что такой подход потребует значительных усилий, и, вероятно, именно поэтому разработчик LibreJS не пытался его реализовать. Не помогает и то, что для надежной работы такого подхода пришлось бы постоянно работать над изменением веб-страниц.

Решение 2: Убить JavaScript

Когда я предлагаю нечто подобное решению номер один в списке рассылки bug-gnuzilla, одним из ответов было отмечено, что есть гораздо более простое решение: вместо того, чтобы пытаться исправить JavaScript, мы могли бы просто отключить выполнение JavaScript в наших веб-браузерах полностью (другими словами, убить JavaScript). Конечно, я имею в виду автоматически устанавливаемый JavaScript. Например, нет ничего плохого в нынешнем использовании JavaScript для разработки расширений Firefox. Пользовательские сценарии и расширения могут даже быть разработаны для замены важной части проприетарного кода JavaScript.

Тем не менее, это решение не лишено проблем. В частности, это требует масштабных социальных изменений, хотя и меньших, чем те, которые пытается исправить LibreJS. Веб-браузеры, удаляющие поддержку JavaScript, могут помочь в реализации этого плана, но здесь возникает проблема курицы и яйца в том смысле, что веб-браузеры без поддержки JavaScript будут восприниматься как неполноценные, как и многие веб-сайты требующие его выполнения.

Одним из возможных промежуточных вариантов может быть поддержка веб-браузером JavaScript, но его отключение по умолчанию и предоставление пользователю возможности временно включить выполнение JavaScript на отдельной странице; таким образом, пользователь будет работать основную чассть вермени без JavaScript, но при этом иметь возможность использовать JavaScript на страницах, которые этого требуют, не испытывая при этом неудобств. Это даже будет иметь приятный побочный эффект, делая просмотр страниц в целом более плавным; многие веб-сайты имеют огромную раздутость кода JavaScript, которую можно полностью избежать, просто отключив JavaScript.

Заключение

У каждого из этих подходов есть сильные и слабые стороны.

Первое решение может сразу дать хорошие результаты для таких вещей, как Diaspora и Reddit: веб-сайтов, на которых требуется JavaScript. Оно, вероятно, не приведет к большим изменениям в сети, если конечно вообще приведет, но для того, чтобы всё работало, это не так и нужно. Однако потребуется определенная работа по корректировке поведения веб-браузеров в отношении JavaScript, а также гораздо больше работы по поддержке репозитория свободной части программ на JavaScript.

Второе решение довольно похоже на то, что сейчас пытается реализовать LibreJS, хотя и в гораздо меньших масштабах. Оно зависит от изменения самой сети: убедить большинство веб-разработчиков перестать использовать код на JavaScript. Если это сработает, то может получиться впечатляюще. С другой стороны, это может привести к впечатляющему провалу или к тому, что станет популярным еще один автоматической метод, бесшумной установки программного обеспечения в веб-браузеры пользователей.

Я не знаю, что лучше, но LibreJS не является ни хорошим решением, ни хорошим временным исправлением, даже шагом в правильном направлении. Пока не появится какой-то свободный веб-браузер, который правильно исправляет JavaScript, все, кто хочет свободы в своих вычислениях, должны отключить выполнение JavaScript в своих веб-браузерах, даже если код является дружелюбным, а веб-разработчики, которые хотят уважать свободу своих пользователей, должны работать над устранением всех требований JavaScript на своих веб-сайтах.

Комментарии