Привет, Хабр! Представляю вашему вниманию перевод статьи Julie Marchant Fix or Kill Automatically Installed JavaScript? В эссе Ричарда Столлмана "Ловушка JavaScript" отмечается, что люди запускают несвободные программы, которые автоматически незаметно устанавливаются в их браузеры каждый день. На самом деле он сильно преуменьшил проблему. Мало того, что большинство пользователей ежедневно запускают несвободные программы просто просматривая веб-страницы, они запускают десятки или даже сотни таких программ каждый день. Ловушка JavaScript чрезвычайно реальна и плодовита. Считается, что работа с сайтами будет нарушена без этих нестандартных, обычно проприетарных, расширений HTML, что веб-браузеры даже не предлагают очевидной возможности отключить JavaScript. Утверждается, что отключение JavaScript приведет только к путанице. Очевидно, что нам нужно решить эту проблему. Однако, сосредоточив внимание на том являются ли скрипты "тривиальными" или свободными, г-н Столлман упускает важный момент: автоматическая незаметная установка программного обеспечения сама по себе является главной проблемой. То, что по большей части программное обеспечение оказывается несвободным, является лишь побочным эффектом. В ответ на статью г-на Столлмана было разработано расширение для браузера Firefox и его производных под названием LibreJS. Это расширение автоматически анализирует весь JavaScript на странице, чтобы определить является ли он тривиальным или свободным и если одно из этих условий истинно, скрипты выполняются, в противном случае — блокируются. Я ценю проект LibreJS и то, что он пытается сделать. Но я думаю, что LibreJS — это в корне неправильный подход к решению проблемы. Прямо сейчас LibreJS терпит неудачу, потому что он требует формата, который нигде не распознается, но теоретически это может быть решено в будущем, поэтому давайте предположим что все в порядке. Предположим, что LibreJS настолько успешен, что заставляет большую часть Интернета выпускать скрипты под свободными лицензиями и описывать лицензии в формате, понятном LibreJS. Кажется, на первый взгляд это здорово, но из этого следует, что программное обеспечение по-прежнему незаметно устанавливается в наши браузеры каждый день. Разница лишь в том, что LibreJS считает программы свободными. Я не хочу преуменьшать важность того, чтобы все программы были свободными. Однако, когда какое-либо программное обеспечение автоматически устанавливается на наши компьютеры по запросу третьей стороны, это делает невозможным осуществление свободы. Предполагается, что вы хотите, чтобы все эти JavaScript программы, которые легко могут составлять сотни новых скриптов каждый день, выполнялись на вашем компьютере, как правило прежде, чем вы даже сможете проверить их исходный код. Хуже того, система автоматической установки JavaScript устанавливает программное обеспечение только временно, чтобы выполниться только один раз. Фактически, всякий раз когда сервер обновляет JavaScript, который отправляется в веб-браузеры, это обновление насаждается пользователям. Даже если скрипт свободный, у него как будто имеется встроенный бекдор. Это очень похоже на случай тивоизации, когда теоретически у вас есть свобода контролировать то что делает программа, но вы не можете делать это на практике из-за обстоятельств. Недостаточно иметь теоретический контроль. Также необходим фактический контроль. В случае JavaScript, это отсутствие контроля не является результатом злого умысла, а скорее результатом небрежного предположения веб-браузеров, что пользователь желает выполнить каждый скрипт, который может предлагать веб-страница. Это не обязательно так. Это было бы похоже на то, как если бы Windows устанавливалась на мой компьютер каждый раз, когда я читал бы статью, рекомендующую использовать Windows или если бы в блоге говорилось о том, насколько Chrome великолепен, приводило бы к автоматической установке Chrome на мою систему. Так что мы можем сделать? Я знаю два возможных решения. Первое возможное и наиболее очевидное решение заключается в изменении поведения веб-браузеров в отношении запросов программного обеспечения JavaScript. Я предлагаю, для того чтобы система была приемлемой, ДОЛЖНЫ быть выполнены все следующие условия: Вы заметите, что автоматическое обнаружение лицензий не включено ни в один из этих пунктов. Так как же пользователь получает только свободный JavaScript без ручной проверки каждого исходного файла? Решение на самом деле довольно простое: так же, как и любое другое свободное программное обеспечение. Я доверяю разработчикам Trisquel включать в репозиторий только свободные программы без вредоносных функций. Кстати, разработчики Trisquel могут защитить пользователей от вредоносных программ, несвободных или нет; LibreJS — не может. Аналогичным образом, мы можем создать и поддерживать репозиторий свободного JavaScript кода. Чтобы это работало, установленные JavaScript программы также должны работать на всех веб-страницах, которые запрашивают его, а не только на одной странице. Что касается уже установленного JavaScript кода, возможность его использования можно определить получив хэш минифицированных версий установленных скриптов, а затем получить хэш запрошенных скриптов после их минификации таким же образом. Если хэши не совпадают, можно проверить имена файлов скриптов на полное или частичное совпадение и пользователю может быть задан вопрос, следует ли использовать эти скрипты. Также будет полезно какое-то подобие базы данных в браузере пользователя, определяющее сайты, на которых могут быть использованы определенные скрипты. Я полагаю, что этот подход потребует значительных усилий и, вероятно, именно поэтому разработчик LibreJS не попытался сделать это. Не помогает то, что достижение надежности предполагает непрерывную работу поспевающую за изменяющимися страницами. Когда я предложил что-то вроде Решения 1 в списке рассылки bug-gnuzilla, в одном из ответов отмечалось, что есть гораздо более простое решение: вместо того, чтобы пытаться исправить JavaScript, мы могли бы полностью отключить выполнение JavaScript в наших браузерах (другими словами, убить JavaScript). Конечно, я имею в виду автоматически установливаемый JavaScript. Например, нет ничего плохого в использовании JavaScript для разработки расширений Firefox. Пользовательские скрипты и расширения могут быть даже разработаны для замены важного проприетарного JavaScript кода. Тем не менее это решение не лишено проблем. В частности, это требует огромных социальных изменений, хотя и меньших, чем пытается сделать LibreJS. Браузеры, удаляющие поддержку JavaScript, могут помочь в этом плане, но есть проблема с курицей и яйцом в том смысле, что браузеры без поддержки JavaScript будут рассматриваться как неполноценные, в то время как многие веб-сайты требуют работоспособности скриптов. Одним из промежуточных шагов для достижения этой цели может быть браузер, поддерживающий JavaScript, но по умолчанию JS должен быть отключен, и дающим пользователю простой способ временно включить выполнение JavaScript на одной странице. Таким образом, пользователь получит опыт без использования JavaScript, но все же у него будет возможность использовать JavaScript для страниц, на которых он необходим, без каких-либо неудобств которые делают браузер неудобным. Появился бы даже приятный побочный эффект для пользователей — их работа в Интернете стала бы более плавной. Многие веб-сайты имеют огромные раздутые скрипты, которых можно полностью избежать просто отключив JavaScript. Каждый из этих подходов имеет сильные и слабые стороны. Первое решение может дать хорошие результаты сразу для таких сайтов как Diaspora и Reddit, для которых требуется JavaScript код, но в основном свободный. Вероятно, это не приведет к значительным изменениям в Интернете, но для работы это не обязательно. Однако для этого потребуется некоторая работа по правильной настройке поведения браузера в отношении JavaScript и стало бы гораздо больше работы для поддержания хранилища свободных программ JavaScript. Второе решение довольно похоже на то, что LibreJS в настоящее время пытается сделать, хотя и в гораздо меньшем масштабе. Это зависит от изменения Интернета: убеждить большинство веб-разработчиков прекратить использовать JavaScript код. Если это решение сработает, то эффект может быть впечатляющим. С другой стороны, это решение может легко потерпеть неудачу или просто привести к появлению еще одного становящегося популярным метода автоматической установки программного обеспечения в браузеры пользователей. Я не уверен что лучше, но LibreJS не является ни хорошим, ни хорошим временным решением, ни даже шагом в правильном направлении. Пока свободный браузер, который корректно исправляет JavaScript становится доступным, любой, кто хочет свободы в вычислениях, должен отключить все привычные действия JavaScript в своих браузерах, даже если код является свободным, а веб-разработчики, уважающие свободу своих пользователей, должны устранить веcь требующийся JavaScript на своих сайтах.