#
msgid ""
msgstr ""
"PO-Revision-Date: 2025-01-28 23:45+0000\n"
"Last-Translator: gfbdrgng <hnaofegnp@hldrive.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/jshelter/"
"website-posts/ru/>\n"
"Language: ru\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.10-dev\n"

#: ../content/posts/cooperation.md:block 1 (header)
msgid ""
"title: Cooperation with the JShelter project, rebranding, and latest features\n"
"date: 2022-03-17 15:00\n"
"Series: JShelter background"
msgstr ""
"Название: Сотрудничество с проектом JShelter, ребрендинг и последние "
"возможности\n"
"дата: 2022-03-17 15:00\n"
"Серия: Справочная информация о JShelter"

#: ../content/posts/cooperation.md:block 2 (paragraph)
msgid ""
"This project started as JavaScript Restrictor at [Brno University of "
"Technology](https://www.fit.vut.cz). As announced in [a previous "
"post](/support), we got funding from NLNet [NGI0 PET "
"Fund](https://nlnet.nl/project/JSRestrictor/). Furthermore, NLNet allowed us"
" to cooperate with another NGI0 PET Fund project - [JShelter project "
"(formerly known as JavaScript Shield project) run by Free Software "
"Foundation](https://nlnet.nl/project/JavascriptShield/)."
msgstr ""
"Этот проект начался как JavaScript Restrictor в "
"[Brno University of Technology](https://www.fit.vut.cz). Как сообщалось в "
"[предыдущем сообщении](/support), мы получили финансирование от NLNet "
"[NGI0 PET Fund](https://nlnet.nl/project/JSRestrictor/). Кроме того, NLNet "
"позволил нам сотрудничать с другим проектом NGI0 PET Fund - [проектом "
"JShelter (ранее известным как JavaScript Shield project) под управлением "
"Free Software Foundation](https://nlnet.nl/project/JavascriptShield/)."

#: ../content/posts/cooperation.md:block 3 (paragraph)
msgid ""
"What did the cooperation bring to the users? More experience, more "
"developers, new ideas. Let us go through the list."
msgstr ""
"Что дало сотрудничество пользователям? Больше опыта, больше разработчиков, "
"новые идеи. Давайте пройдемся по списку."

#: ../content/posts/cooperation.md:block 4 (header)
msgid "1. Open development"
msgstr "1. Открытая разработка"

#: ../content/posts/cooperation.md:block 5 (paragraph)
msgid ""
"We created [mailing list](https://lists.nongnu.org/archive/html/js-shield/) "
"where we discussed the core issues of the development of the extension. We "
"held weekly meetings with the minutes available in the mailing list "
"archives."
msgstr ""
"Мы создали [список рассылки](https://lists.nongnu.org/archive/html/js-shield/"
"), где обсуждали основные вопросы разработки расширения. Мы проводили "
"еженедельные встречи, протоколы которых можно найти в архиве списка рассылки."

#: ../content/posts/cooperation.md:block 6 (header)
msgid "2. Integration of NoScript Common Library"
msgstr "2. Интеграция общей библиотеки NoScript"

#: ../content/posts/cooperation.md:block 7 (paragraph)
msgid ""
"Giorgio Maone, the developer of NoScript Suite, is a part of the JShelter "
"project. His recent efforts were in developing NoScript Common Library "
"(NSCL). The library aims at simplifying the development of privacy and "
"security-oriented web extensions with cross-browser support."
msgstr ""
"Джорджио Маоне, разработчик NoScript Suite, является частью проекта "
"JShelter. Его последние усилия были направлены на разработку библиотеки "
"NoScript Common Library (NSCL). Библиотека направлена на упрощение "
"разработки веб-расширений, ориентированных на конфиденциальность и "
"безопасность, с поддержкой кросс-браузерности."

#: ../content/posts/cooperation.md:block 8 (paragraph)
msgid ""
"Giorgio refactored the defence mechanism code injection and cross-browser "
"support. Both now depend on NSCL."
msgstr ""
"Джорджио рефакторизовал защитный механизм инъекции кода и поддержку кросс-"
"браузерности. Обе эти функции теперь зависят от NSCL."

#: ../content/posts/cooperation.md:block 9 (paragraph)
msgid ""
"The improved code injection solved several long-term issues of the previous "
"mechanism like (1) the uncertainty that the defences are inserted in time "
"before page scripts have access to the environment and (2) the vulnerability"
" to [Firefox bug](https://bugzilla.mozilla.org/show_bug.cgi?id=1267027) that"
" did not allow to insert (full) defenses for pages relying on [CSP "
"headers](https://content-security-policy.com/)."
msgstr ""
"Улучшенная инъекция кода решила несколько долгосрочных проблем предыдущего "
"механизма, таких как (1) неуверенность в том, что защита будет вставлена "
"вовремя, до того как скрипты страницы получат доступ к окружению, и (2) "
"уязвимость к [ошибке Firefox](https://bugzilla.mozilla.org/"
"show_bug.cgi?id=1267027), которая не позволяла вставить (полную) защиту для "
"страниц, полагающихся на [заголовки CSP](https://content-security-policy.com/"
")."

#: ../content/posts/cooperation.md:block 10 (paragraph)
msgid ""
"Improved cross-browser support should make the future lives of developers "
"easier. Should there be a change like the switch to Manifest3, we will "
"benefit from the effort put into NSCL."
msgstr ""
"Улучшенная поддержка кросс-браузерности должна облегчить жизнь разработчиков "
"в будущем. Если произойдут изменения, например, переход на Manifest3, мы "
"выиграем от усилий, приложенных к NSCL."

#: ../content/posts/cooperation.md:block 11 (header)
msgid "3. Development of a new site"
msgstr "3. Разработка нового сайта"

#: ../content/posts/cooperation.md:block 12 (paragraph)
msgid ""
"[Manufactura Independente](https://manufacturaindependente.org/), another "
"participant of JShelter, created a new website for the extension, see "
"<https://jshelter.org/>. Besides the polished structure and look, the new "
"website allows generating documentation for the Javascript Shield wrappers "
"directly from the comments in the source code. We do not have automatic "
"updates, yet. But we are working on that."
msgstr ""
"[Manufactura Independente](https://manufacturaindependente.org/), еще один "
"участник JShelter, создал новый сайт для расширения, см. <https://"
"jshelter.org/>. Помимо отполированной структуры и внешнего вида, новый сайт "
"позволяет генерировать документацию для обёрток Javascript Shield "
"непосредственно из комментариев в исходном коде. Пока что у нас нет "
"автоматического обновления. Но мы работаем над этим."

#: ../content/posts/cooperation.md:block 13 (header)
msgid "4. Improved user interface"
msgstr "4. Улучшенный пользовательский интерфейс"

#: ../content/posts/cooperation.md:block 14 (paragraph)
msgid ""
"The original method of assigning JavaScript Shield levels of protection to "
"each domain is nice to explain and should be easy to understand for users. "
"However, as the number of protected APIs grew, it became clear that we "
"needed to fine-tune the protection for each page for power users. For "
"example, allow Geolocation API for maps or allow Media Devices on a video "
"call application."
msgstr ""
"Первоначальный метод назначения уровней защиты JavaScript Shield для каждого "
"домена хорошо поддается объяснению и должен быть понятен пользователям. "
"Однако по мере роста числа защищенных API стало ясно, что нам необходимо "
"точно настроить защиту для каждой страницы для опытных пользователей. "
"Например, разрешить Geolocation API для карт или разрешить Media Devices в "
"приложении для видеозвонков."

#: ../content/posts/cooperation.md:block 15 (paragraph)
msgid ""
"The user often had to create a new level for each misbehaving domain. With "
"time, the amount of levels becomes overwhelming, and the user needs to keep "
"them in sync with the addition of the new APIs. Each version of the "
"extension that adds new wrappers tries to guess how to modify user-defined "
"levels to ease this task. But these modifications are not perfect."
msgstr ""
"Пользователю часто приходилось создавать новый уровень для каждого "
"провинившегося домена. Со временем количество уровней становится непомерно "
"большим, и пользователю необходимо поддерживать их в синхронизации с "
"добавлением новых API. Каждая версия расширения, добавляющая новые обертки, "
"пытается догадаться, как модифицировать пользовательские уровни, чтобы "
"облегчить эту задачу. Но эти модификации не идеальны."

#: ../content/posts/cooperation.md:block 16 (paragraph)
msgid ""
"0.7 brought a redesigned UI and backend that allows fine-tuning JavaScript "
"Shield protection for each domain. The new UI is a result of the effort of "
"most of the developers of the extension."
msgstr ""
"В версии 0.7 обновлен пользовательский интерфейс и бекенд, что позволяет "
"точно настроить защиту JavaScript Shield для каждого домена. Новый "
"пользовательский интерфейс - результат усилий большинства разработчиков "
"расширения."

#: ../content/posts/cooperation.md:block 17 (paragraph)
msgid "![visited page]({attach}/images/cooperation/fine-tuning.png)"
msgstr "![Посещенная страница]({attach}/images/cooperation/fine-tuning.png)"

#: ../content/posts/cooperation.md:block 18 (paragraph)
msgid ""
"0.6 introduced Fingerprint Detector that was improved in 0.8. The pop up "
"shows the number of potentially suspicious calls and the likelihood of "
"fingerprinting behaviour. The fingerprint report provides an explanation "
"about the fingerprinting activities. Marek Saloň is the main author of the "
"Fingerprint Detector."
msgstr ""
"В 0.6 появился детектор отпечатков пальцев, который был улучшен в 0.8. "
"Всплывающее окно показывает количество потенциально подозрительных звонков и "
"вероятность поведения по отпечаткам пальцев. Отчет об отпечатках пальцев "
"содержит пояснения о действиях по отпечаткам пальцев. Марек Салонь является "
"основным автором детектора отпечатков пальцев."

#: ../content/posts/cooperation.md:block 19 (paragraph)
msgid ""
"![FPD report shows the reasoning to claim that a page is fingerprinting the "
"browser]({attach}/images/cooperation/fpd-report.png)"
msgstr ""
"![Отчет FPD показывает основания для утверждения, что страница снимает "
"отпечатки пальцев с браузера]({attach}/images/cooperation/fpd-report.png)"

#: ../content/posts/cooperation.md:block 20 (paragraph)
msgid ""
"Marek also improved notifications so that the user cannot be overwhelmed by "
"many similar notifications during a very short period. Starting from 0.8, it"
" is also possible to use the extension for passive monitoring of page "
"activities without active modifications to the JavaScript environment. "
"Network Boundary Shield cannot be turned into notify mode, but it is very "
"rare to find a page accessing a local network. This configuration should not"
" break any page, the user is not protected from fingerprinting, but the "
"extension notifies about suspicious activities."
msgstr ""
"Марек также улучшил уведомления, чтобы пользователь не был перегружен "
"множеством одинаковых уведомлений в течение очень короткого периода времени. "
"Начиная с версии 0.8, расширение также можно использовать для пассивного "
"мониторинга активности страниц без активных модификаций среды JavaScript. "
"Network Boundary Shield нельзя перевести в режим уведомлений, но очень редко "
"можно обнаружить страницу, обращающуюся к локальной сети. Данная "
"конфигурация не должна ломать ни одну страницу, пользователь не защищен от "
"отпечатков пальцев, но расширение уведомляет о подозрительных действиях."

#: ../content/posts/cooperation.md:block 21 (paragraph)
msgid ""
"![Almost passive configuration of the "
"extension]({attach}/images/cooperation/almost-passive.png)"
msgstr ""
"![Почти пассивная конфигурация расширения]({attach}/images/cooperation/"
"almost-passive.png)"

#: ../content/posts/cooperation.md:block 22 (header)
msgid "5. Publicity"
msgstr "5. Реклама"

#: ../content/posts/cooperation.md:block 23 (paragraph)
msgid ""
"At the beginning of 2021, we only had a handful of users. When FSF "
"[announced the project](https://www.fsf.org/news/fsf-announces-jshelter-"
"browser-add-on-to-combat-threats-from-nonfree-javascript) the number of "
"users raised. We managed to retain about 75% of the peek of Firefox and "
"Chrome users. See graphs below."
msgstr ""
"В начале 2021 года у нас была лишь горстка пользователей. Когда FSF "
"[объявила о проекте](https://www.fsf.org/news/fsf-announces-jshelter-browser-"
"add-on-to-combat-threats-from-nonfree-javascript), число пользователей "
"возросло. Нам удалось сохранить около 75 % пользователей Firefox и Chrome. "
"Смотрите графики ниже."

#: ../content/posts/cooperation.md:block 24 (paragraph)
msgid "The number of daily users with Firefox browser:"
msgstr "Количество ежедневных пользователей браузера Firefox:"

#: ../content/posts/cooperation.md:block 25 (paragraph)
msgid ""
"![30th, some users left afterwards]({attach}/images/cooperation/firefox-"
"daily-2022-03-17.png)"
msgstr ""
"![30-е, некоторые пользователи ушли после этого]({attach}/images/cooperation/"
"firefox-daily-2022-03-17.png)"

#: ../content/posts/cooperation.md:block 26 (paragraph)
msgid "The number of weekly users with Chrome browser:"
msgstr "Количество еженедельных пользователей браузера Chrome:"

#: ../content/posts/cooperation.md:block 27 (paragraph)
msgid ""
"![We managed to keep most of the Chrome "
"users]({attach}/images/cooperation/chrome-weekly-2022-03-17.png)"
msgstr ""
"![Нам удалось сохранить большинство пользователей Chrome]({attach}/images/"
"cooperation/chrome-weekly-2022-03-17.png)"

#: ../content/posts/cooperation.md:block 28 (paragraph)
msgid ""
"The more users we have, the more bugs are found and the more likely we "
"receive contributions from other parties. Also, keep in mind that some "
"defences against fingerprinting work best when many users employ the "
"defences. So it is beneficial for everyone to have as many users as "
"possible."
msgstr ""
"Чем больше у нас пользователей, тем больше ошибок будет найдено и тем больше "
"вероятность того, что мы получим вклад от других сторон. Также следует "
"помнить, что некоторые средства защиты от отпечатков пальцев работают лучше "
"всего, когда их применяет много пользователей. Поэтому всем выгодно иметь "
"как можно больше пользователей."

#: ../content/posts/cooperation.md:block 29 (header)
msgid "6. New name, rebranding"
msgstr "6. Новое имя, ребрендинг"

#: ../content/posts/cooperation.md:block 30 (paragraph)
msgid ""
"The cooperation initially started between JavaScript Restrictor and "
"JavaScript Shield project. We thought about several rebranding options for "
"the project to give users a warm feeling of safety. Starting from 0.7 the "
"extension is called JShelter, uses a more privacy-friendly repository, and "
"we already had a new crab icon in the late 0.5 releases."
msgstr ""
"Изначально сотрудничество началось между JavaScript Restrictor и проектом "
"JavaScript Shield. Мы продумали несколько вариантов ребрендинга проекта, "
"чтобы дать пользователям теплое ощущение безопасности. Начиная с версии 0.7 "
"расширение называется JShelter, использует более дружественный к "
"конфиденциальности репозиторий, а в поздних релизах 0.5 у нас уже была новая "
"иконка краба."

#: ../content/posts/cooperation.md:block 31 (paragraph)
msgid ""
"We intend to keep the current infrastructure like the Github repository "
"intact. All Github pages links should work and are redirected to the new "
"website."
msgstr ""
"Мы намерены сохранить текущую инфраструктуру, например, репозиторий Github. "
"Все ссылки на страницы Github должны работать и перенаправлять на новый сайт."

#: ../content/posts/crawling.md:block 1 (header)
msgid ""
"title: Measurement of JavaScript API usage on the web\n"
"date: 2021-03-30 14:00\n"
"Series: JavaScript API usage"
msgstr ""
"Название: Измерение использования JavaScript API в Интернете\n"
"дата: 2021-03-30 14:00\n"
"Серия: Использование JavaScript API"

#: ../content/posts/crawling.md:block 2 (paragraph)
msgid ""
"The world wide web is a complex environment. Web pages can access many APIs "
"ranging from text formatting to access to nearby Bluetooth devices. While "
"many APIs are used for legitimate purposes, some are misused to track and "
"identify their users without their knowledge. In this paper, we propose a "
"methodology to measure the usage of JavaScript APIs on the public web. The "
"methodology consists of an automated visit of several thousand websites and "
"intercepting JavaScript calls performed by the pages. We also provide a "
"design and architecture of a measurement platform that can be used for an "
"automated visit of a list of websites. The proposed platform is based on "
"OpenWPM. The browser is instrumented by OpenWPM and a customized Web API "
"Manager extension is responsible for capturing JavaScript API calls."
msgstr ""
"Всемирная паутина - сложная среда. Веб-страницы могут обращаться ко многим "
"API, начиная от форматирования текста и заканчивая доступом к близлежащим "
"устройствам Bluetooth. Хотя многие API используются в законных целях, "
"некоторые из них используются не по назначению, чтобы отслеживать и "
"идентифицировать своих пользователей без их ведома. В этой статье мы "
"предлагаем методику измерения использования API JavaScript в публичном "
"Интернете. Методика заключается в автоматизированном посещении нескольких "
"тысяч веб-сайтов и перехвате вызовов JavaScript, выполняемых на страницах. "
"Мы также предлагаем дизайн и архитектуру измерительной платформы, которая "
"может быть использована для автоматического посещения списка веб-сайтов. "
"Предлагаемая платформа основана на OpenWPM. Браузер инструментируется "
"OpenWPM, а за перехват вызовов JavaScript API отвечает специализированное "
"расширение Web API Manager."

#: ../content/posts/crawling.md:block 3 (header)
msgid "Introduction"
msgstr "Введение"

#: ../content/posts/crawling.md:block 4 (paragraph)
msgid ""
"Web browsers offer a wide range of possibilities. on the surface they *just*"
" display web pages, but under the hood, web browsers provide a bridge "
"between a viewed page and the host operating system. A web browser allows a "
"web page to access information like values from sensors, information about "
"battery status, installed fonts, and much more. The advertisement industry "
"often takes advantage of the wide range of information provided by web "
"browsers to create a web browser [fingerprint](https://amiunique.org/links)."
" Most commonly, the fingeprinters misuse Web APIs (also called JavaScript "
"APIs)."
msgstr ""
"Веб-браузеры предлагают широкий спектр возможностей. Внешне они *просто* "
"отображают веб-страницы, но под капотом веб-браузеры обеспечивают мост между "
"просматриваемой страницей и операционной системой хоста. Веб-браузер "
"позволяет веб-странице получить доступ к такой информации, как значения от "
"датчиков, сведения о состоянии батареи, установленные шрифты и многое "
"другое. Рекламная индустрия часто использует широкий спектр информации, "
"предоставляемой веб-браузерами, для создания [отпечатка пальца] (https://"
"amiunique.org/links). Чаще всего фингерпринтеры злоупотребляют веб-"
"интерфейсами API (также называемыми API JavaScript)."

#: ../content/posts/crawling.md:block 5 (paragraph)
msgid ""
"This blog post is mainly concerned with user tracking and fingerprinting. "
"For example Battery Status API implementation on Mozilla Firefox revealed "
"very precise value allowing the trackers to identify the user for a [period "
"of time](https://petsymposium.org/2017/papers/hotpets/batterystatus-not-"
"included.pdf). As the Battery Status API was used heavily for "
"fingerprinting, it has been removed from Mozilla Firefox in 2017. Other "
"examples of JavaScript APIs that are used often for fingerprinting are "
"[Canvas API](http://cseweb.ucsd.edu/~hovav/papers/ms12.html), [Audio "
"API](https://senglehardt.com/papers/princeton_phd_dissertation_englehardt.pdf),"
" [Permissions API](https://arxiv.org/abs/2008.04480) or [APIs for device "
"sensors](https://dl.acm.org/doi/10.1145/3243734.3243860)."
msgstr ""
"Эта статья в блоге в основном посвящена отслеживанию пользователей и снятию "
"отпечатков пальцев. Например, реализация Battery Status API в Mozilla "
"Firefox показала очень точное значение, позволяющее трекерам "
"идентифицировать пользователя в течение [периода времени](https://"
"petsymposium.org/2017/papers/hotpets/batterystatus-not-included.pdf). "
"Поскольку Battery Status API активно использовался для отпечатков пальцев, "
"он был удален из Mozilla Firefox в 2017 году. Другими примерами API "
"JavaScript, которые часто используются для отпечатков пальцев, являются "
"[Canvas API](http://cseweb.ucsd.edu/~hovav/papers/ms12.html), [Audio API]"
"(https://senglehardt.com/papers/princeton_phd_dissertation_englehardt.pdf), "
"[Permissions API](https://arxiv.org/abs/2008.04480) или "
"[API для датчиков устройств](https://dl.acm.org/doi/10.1145/3243734.3243860)."

#: ../content/posts/crawling.md:block 6 (paragraph)
msgid ""
"In our work, we aim to measure the JavaScript APIs usage by popular "
"websites. In this article, we present core technologies to accomplish these "
"measurements. The stack of technologies is based on "
"[OpenWPM](https://github.com/mozilla/OpenWPM) enriched by a browser "
"extension, that allows us to intercept JavaScript calls of different APIs. "
"This browser extension is based on Proxy objects."
msgstr ""
"В нашей работе мы стремимся измерить использование JavaScript API на "
"популярных сайтах. В этой статье мы представляем основные технологии для "
"выполнения этих измерений. В основе стека технологий лежит [OpenWPM](https://"
"github.com/mozilla/OpenWPM), дополненная расширением для браузера, которое "
"позволяет перехватывать JavaScript-вызовы различных API. Это браузерное "
"расширение основано на объектах Proxy."

#: ../content/posts/crawling.md:block 7 (paragraph)
msgid ""
"Our work is based on work of [Peter Snyders et "
"al.](https://www3.cs.uic.edu/pub/Bits/PeterSnyder/Browser_Feature_Usage_on_the_Modern_Web.pdf)"
" carried in 2016. Since then many new APIs were specified and implemented in"
" web browsers, see the figure below (based on data from [Can I Use? "
"website](https://caniuse.com/))."
msgstr ""
"Наша работа основана на работе [Peter Snyders et al.](https://"
"www3.cs.uic.edu/pub/Bits/PeterSnyder/"
"Browser_Feature_Usage_on_the_Modern_Web.pdf), выполненной в 2016 году. С тех "
"пор было определено и реализовано множество новых API в веб-браузерах, см. "
"рисунок ниже (на основе данных сайта [Can I Use?](https://caniuse.com/))."

#: ../content/posts/crawling.md:block 8 (paragraph)
msgid ""
"![Progress of Web APIs amount implemented in distinct browsers in "
"time.]({attach}/images/crawling-apis.png)"
msgstr ""
"![Прогресс количества веб-интерфейсов, реализованных в разных браузерах за "
"определенное время.]({attach}/images/crawling-apis.png)"

#: ../content/posts/crawling.md:block 9 (header)
msgid "Methodology proposal"
msgstr "Методологическое предложение"

#: ../content/posts/crawling.md:block 10 (paragraph)
msgid ""
"This section describes the methodology that we plan to use. This methodology"
" is based on As it is based on the work of Peter Snyders, it is already "
"validated. Moreover, using a methodology that is very close to the original "
"one should show us a difference in the usage of the JavaScript APIs in 2016 "
"and 2021."
msgstr ""
"В этом разделе описывается методология, которую мы планируем использовать. "
"Эта методология основана на работе Питера Снайдерса, поэтому она уже "
"проверена. Более того, использование методологии, очень близкой к "
"оригинальной, должно показать нам разницу в использовании API JavaScript в "
"2016 и 2021 годах."

#: ../content/posts/crawling.md:block 11 (paragraph)
msgid ""
"The main idea of the measurement is to visit several thousands of the most "
"[popular pages](https://tranco-list.eu/#aboutus) on the internet and "
"intercept as many JavaScript calls as possible."
msgstr ""
"Суть измерения заключается в том, чтобы посетить несколько тысяч самых "
"[популярных страниц](https://tranco-list.eu/#aboutus) в интернете и "
"перехватить как можно больше вызовов JavaScript."

#: ../content/posts/crawling.md:block 12 (paragraph)
msgid ""
"Visiting websites will be performed through Mozilla Firefox with an "
"extension that intercepts and logs the JavaScript calls. We will visit not "
"only the landing page but also the subset of subpages of each website. From "
"the landing page, we will extract three links that point to a subpage of a "
"given page. From each of these three subpages, we will get another three "
"subpage links resulting in up to 13 pages of a given website being visited. "
"This amount of pages should be high enough to catch the most of JavaScript "
"calls. We will wait and intercept JavaScript calls for 30 seconds on each "
"page to wait of API calls performed during the page load."
msgstr ""
"Посещение сайтов будет осуществляться через Mozilla Firefox с расширением, "
"перехватывающим и регистрирующим вызовы JavaScript. Мы будем посещать не "
"только целевую страницу, но и подмножество подстраниц каждого сайта. С "
"целевой страницы мы извлечем три ссылки, указывающие на подстраницу данной "
"страницы. С каждой из этих трех подстраниц мы получим еще три ссылки на "
"подстраницы, в результате чего будет посещено до 13 страниц данного сайта. "
"Этого количества страниц должно быть достаточно, чтобы перехватить "
"большинство вызовов JavaScript. Мы будем ждать и перехватывать вызовы "
"JavaScript в течение 30 секунд на каждой странице, чтобы избежать вызовов "
"API, выполняемых во время загрузки страницы."

#: ../content/posts/crawling.md:block 13 (paragraph)
msgid ""
"Results of our measurements should also provide information about the "
"JavaScript APIs, that were probably used in a manner, that is not necessary "
"for a page to be working and is very likely used in a way, that the user "
"would not find useful. To achieve this,"
msgstr ""
"Результаты наших измерений также должны дать информацию о JavaScript API, "
"которые, возможно, использовались не так, как нужно для работы страницы, и, "
"скорее всего, использовались так, что пользователь не нашел бы их полезными. "
"Для этого,"

#: ../content/posts/crawling.md:block 14 (paragraph)
msgid ""
"We will run our measurements on every page in two different modes. Firstly, "
"we will visit the page using the a browser withou adblocker. Later, we will "
"also employ an adblocker. Hence, the study will show the difference API "
"usage of regular pages and trackers."
msgstr ""
"Мы будем проводить измерения на каждой странице в двух разных режимах. "
"Сначала мы заходим на страницу через браузер без адблокера. В дальнейшем мы "
"также будем использовать адблокер. Таким образом, исследование покажет "
"разницу в использовании API на обычных страницах и страницах с трекерами."

#: ../content/posts/crawling.md:block 15 (header)
msgid "The original study"
msgstr "Оригинальное исследование"

#: ../content/posts/crawling.md:block 16 (paragraph)
msgid ""
"The Snyders' study suggests that some of the JavaScript APIs are extremely "
"popular and they are used on more than 90% of measured pages (e.g. a well "
"known `Document.createElement` method from DOM API). On the other hand, "
"there are many APIs that are used by a minority of measured pages. That "
"being said, almost 50% of JavaScript APIs implemented in the browser at the "
"time were not used by any of the measured pages."
msgstr ""
"Исследование Снайдеров показывает, что некоторые API JavaScript чрезвычайно "
"популярны и используются более чем на 90% измеренных страниц (например, "
"хорошо известный метод `Document.createElement` из DOM API). С другой "
"стороны, существует множество API, которые используются на меньшинстве "
"измеряемых страниц. Так, почти 50 % API JavaScript, реализованных в браузере "
"на тот момент, не использовались ни на одной из измеренных страниц."

#: ../content/posts/crawling.md:block 17 (paragraph)
msgid ""
"The study also suggests that there is no direct connection between the "
"implementation date of a given JavaScript API in the browser (or by its "
"specification date by some of the specifications vendors) and its popularity"
" in using by websites. Concretely, there are some old JavaScript APIs, such "
"as `XMLHttpRequest` that are still very popular. However, there are also "
"quite new JavaScript APIs, that are used very frequently (i.e., `Selectors "
"API Level 1`)."
msgstr ""
"Исследование также показывает, что нет прямой связи между датой внедрения "
"того или иного JavaScript API в браузер (или датой его спецификации "
"некоторыми поставщиками спецификаций) и его популярностью в использовании на "
"веб-сайтах. В частности, есть некоторые старые JavaScript API, такие как "
"`XMLHttpRequest`, которые все еще очень популярны. Однако есть и совсем "
"новые API JavaScript, которые используются очень часто (например, `Selectors "
"API Level 1`)."

#: ../content/posts/crawling.md:block 18 (paragraph)
msgid ""
"The conducted study also measured the pages in two ways - with the ad "
"blocker and without any ad blocking extension. Results of measurements "
"showed that the blocking of different JavaScript APIs is not uniform and "
"some APIs are blocked more often than others. Specifically, 10% of "
"JavaScript APIs were blocked in 90% of cases resulting in a fact that 83% of"
" APIs were used on less than 1% of websites when the page was visited with "
"active blocking extension."
msgstr ""
"В ходе исследования страницы также измерялись двумя способами - с "
"блокировщиком рекламы и без расширения для блокировки рекламы. Результаты "
"измерений показали, что блокировка различных JavaScript API происходит "
"неравномерно, и некоторые API блокируются чаще, чем другие. В частности, 10 "
"% JavaScript API блокировались в 90 % случаев, в результате чего 83 % API "
"использовались менее чем на 1 % сайтов, когда страница посещалась с активным "
"блокирующим расширением."

#: ../content/posts/crawling.md:block 19 (header)
msgid "Web API Manager"
msgstr "Web API-менеджер"

#: ../content/posts/crawling.md:block 20 (paragraph)
msgid ""
"Web API Manager is a browser extension, that aims to block explicitly "
"defined JavaScript APIs. It has been developed by Snyders in 2016 and used "
"in several studies conducted by [Snyders et "
"al.](https://www.peteresnyder.com/https://www.peteresnyder.com/)."
msgstr ""
"Web API Manager - это расширение для браузера, предназначенное для "
"блокировки явно определенных API JavaScript. Оно было разработано Снайдерсом "
"в 2016 году и использовалось в нескольких исследованиях, проведенных "
"[Snyders et al.](https://www.peteresnyder.com/https://www.peteresnyder.com/)."

#: ../content/posts/crawling.md:block 21 (paragraph)
msgid ""
"The original purpose of the Web API Manager is to block explicitly defined "
"JavaScript APIs. However, in our measurements, we just need to intercept the"
" API calls, log these calls and delegate the calls to original receivers."
msgstr ""
"Первоначальное назначение Web API Manager - блокировать явно определенные "
"API JavaScript. Однако в наших измерениях нам нужно просто перехватывать "
"вызовы API, регистрировать их и делегировать вызовы оригинальным получателям."

#: ../content/posts/crawling.md:block 22 (paragraph)
msgid ""
"The main principle of Web API Manager is based on Proxy objects. This "
"metaprogramming technique allows intercepting calls performed on objects. "
"While the main goal of the Web API Manager extension is to block the calls "
"performed on objects that belong to particular JavaScript APIs, our goal is "
"only to intercept these operations and delegate them to their original "
"receivers. We will use the Log Aggregator interface to log the API calls."
msgstr ""
"Основной принцип работы Web API Manager основан на использовании Proxy-"
"объектов. Эта техника метапрограммирования позволяет перехватывать вызовы, "
"выполняемые над объектами. В то время как основная цель расширения Web API "
"Manager - блокировать вызовы, выполняемые над объектами, принадлежащими "
"определенным JavaScript API, наша задача - лишь перехватить эти операции и "
"делегировать их исходным получателям. Для регистрации вызовов API мы будем "
"использовать интерфейс Log Aggregator."

#: ../content/posts/crawling.md:block 23 (paragraph)
msgid ""
"To provide a Web API Manager the list of JavaScript APIs members we need a "
"list of supported APIs. The APIs implemented in Mozilla Firefox are "
"available as [IDL files](https://searchfox.org/mozilla-"
"central/source/dom/webidl)."
msgstr ""
"Чтобы предоставить менеджеру Web API список членов JavaScript API, нам нужен "
"список поддерживаемых API. API, реализованные в Mozilla Firefox, доступны в "
"виде [IDL-файлов](https://searchfox.org/mozilla-central/source/dom/webidl)."

#: ../content/posts/crawling.md:block 24 (header)
msgid "Measurement tools"
msgstr "Инструменты измерения"

#: ../content/posts/crawling.md:block 25 (paragraph)
msgid ""
"The figure below shows a simplified illustration of the measurement "
"platform. There is OpenWPM in the middle of the architecture. OpenWPM "
"orchestrates Selenium and Mozilla Firefox with the proxy-based intercepting "
"Web API Manager."
msgstr ""
"На рисунке ниже показана упрощенная иллюстрация измерительной платформы. В "
"центре архитектуры находится OpenWPM. OpenWPM объединяет Selenium и Mozilla "
"Firefox с прокси-сервером, перехватывающим Web API Manager."

#: ../content/posts/crawling.md:block 26 (paragraph)
msgid "![image]({attach}/images/crawling-architecture.png)"
msgstr "![изображение]({attach}/images/crawling-architecture.png)"

#: ../content/posts/crawling.md:block 27 (header)
msgid "The impact on JShelter"
msgstr "Влияние на JShelter"

#: ../content/posts/crawling.md:block 28 (paragraph)
msgid ""
"Once we have data from our crawling study, we will compare the data with "
"[another recent study](https://github.com/uiowa-irl/FP-"
"Inspector/blob/master/Data/potential_fingerprinting_APIs.md). As already "
"mentioned, we want to develop a fingerprinting detection based on counting "
"the number of different APIs employed by a page, especially APIs that are "
"not frequently used for benign purposes. When a fingerprinting attempt is "
"identified, we want to (1) inform the user, (2) prevent uploading of the "
"fingerprint to the server, (3) prevent storing the fingerprint for later "
"usage."
msgstr ""
"Как только мы получим данные нашего исследования краулинга, мы сравним их с "
"данными [другого недавнего исследования] (https://github.com/uiowa-irl/"
"FP-Inspector/blob/master/Data/potential_fingerprinting_APIs.md). Как уже "
"упоминалось, мы хотим разработать систему обнаружения отпечатков пальцев, "
"основанную на подсчете количества различных API, используемых страницей, "
"особенно API, которые не часто используются в доброкачественных целях. При "
"обнаружении попытки отпечатка мы хотим (1) сообщить об этом пользователю, (2)"
" предотвратить загрузку отпечатка на сервер, (3) предотвратить хранение "
"отпечатка для последующего использования."

#: ../content/posts/crawling_results.md:block 1 (header)
msgid ""
"title: \"RESULTS: Measurement of JavaScript API usage on the web\"\n"
"date: 2022-01-14 12:00\n"
"Series: JavaScript API usage"
msgstr ""
"название: \"РЕЗУЛЬТАТЫ: Измерение использования JavaScript API в Интернете\""
"\n"
"дата: 2022-01-14 12:00\n"
"Серия: Использование JavaScript API"

#: ../content/posts/crawling_results.md:block 2 (paragraph)
msgid ""
"A [previous blogpost](/crawling/) introduced a methodology to measure the "
"usage of JavaScript APIs on the web by crawling the web. The starting point "
"of our web crawling research is the [work of Peter "
"Snyder](https://www.peteresnyder.com/static/papers/improving-web-privacy-"
"and-security-thesis.pdf). Most importantly, we wanted to compare the "
"differences in JS API usage between browsers with and without privacy "
"extension (e.g., uBlock Origin). We have finished the development of the "
"[crawling tool](https://github.com/martinbednar/web_crawler). We crawled "
"thousands of websites and collected JavaScript calls on the visited web "
"pages."
msgstr ""
"В [предыдущем блоге](/crawling/) была представлена методология измерения "
"использования API JavaScript в Интернете путем просмотра веб-страниц. "
"Отправной точкой нашего исследования веб-ползания стала "
"[работа Питера Снайдера](https://www.peteresnyder.com/static/papers/"
"improving-web-privacy-and-security-thesis.pdf). Самое главное, мы хотели "
"сравнить разницу в использовании JS API между браузерами с расширением "
"конфиденциальности (например, uBlock Origin) и без него. Мы завершили "
"разработку [инструмента для краулинга](https://github.com/martinbednar/"
"web_crawler). Мы просмотрели тысячи веб-сайтов и собрали вызовы JavaScript "
"на посещенных веб-страницах."

#: ../content/posts/crawling_results.md:block 3 (paragraph)
msgid "This blog post introduces the methodology and results of the crawling."
msgstr "В этой записи блога представлены методология и результаты исследования."

#: ../content/posts/crawling_results.md:block 5 (paragraph)
msgid ""
"When a user opens a webpage in a JavaScript-enabled web browser, that "
"webpage can access various APIs supported by the web browser. The webpage "
"can read, for example, the value of performance.now(), battery status or "
"data from sensors (when available). All these values can be misused to "
"create a [device fingerprint](https://arxiv.org/pdf/1905.01051.pdf) that can"
" be used to identify the user."
msgstr ""
"Когда пользователь открывает веб-страницу в веб-браузере с поддержкой "
"JavaScript, эта веб-страница может получить доступ к различным API, "
"поддерживаемым веб-браузером. Веб-страница может считывать, например, "
"значение performance.now(), состояние батареи или данные с датчиков (если "
"они доступны). Все эти значения могут быть использованы для создания "
"[отпечатка пальца устройства](https://arxiv.org/pdf/1905.01051.pdf), который "
"может быть использован для идентификации пользователя."

#: ../content/posts/crawling_results.md:block 6 (paragraph)
msgid ""
"We aim to research how JS APIs are used on websites. The main research "
"questions are:"
msgstr ""
"Наша цель - изучить, как JS API используются на веб-сайтах. Основными "
"вопросами исследования являются:"

#: ../content/posts/crawling_results.md:block 7 (unordered list)
msgid "What APIs do websites use?"
msgstr "Какие API используют веб-сайты?"

#: ../content/posts/crawling_results.md:block 7 (unordered list)
msgid "How many APIs does a website use?"
msgstr "Сколько API использует сайт?"

#: ../content/posts/crawling_results.md:block 7 (unordered list)
msgid "What endpoints do websites access most often?"
msgstr "К каким конечным точкам веб-сайты обращаются чаще всего?"

#: ../content/posts/crawling_results.md:block 7 (unordered list)
msgid "How many JS calls are made?"
msgstr "Сколько звонков сделано в JS?"

#: ../content/posts/crawling_results.md:block 7 (unordered list)
msgid ""
"What are the differences in results in all the previous questions with an "
"active privacy web-browser extension (e.g., uBlock Origin)? For example, "
"What JS calls are blocked by uBlock Origin?"
msgstr ""
"Каковы различия в результатах ответов на все предыдущие вопросы при "
"использовании активного расширения для веб-браузера, обеспечивающего "
"конфиденциальность (например, uBlock Origin)? Например, какие вызовы JS "
"блокируются uBlock Origin?"

#: ../content/posts/crawling_results.md:block 8 (paragraph)
msgid ""
"The answers to these questions should help us better understand websites' "
"behaviour. Based on the obtained data, we want to define the suspicious "
"behaviour indicating that the website is trying to fingerprint the user's "
"device."
msgstr ""
"Ответы на эти вопросы должны помочь нам лучше понять поведение веб-сайтов. "
"На основе полученных данных мы хотим определить подозрительное поведение, "
"указывающее на то, что сайт пытается снять отпечатки пальцев с устройства "
"пользователя."

#: ../content/posts/crawling_results.md:block 9 (paragraph)
msgid ""
"We plan to keep the [anti-fingerprint mechanism](/fpdetection/) updated "
"based on derived heuristics. The heuristics are derived from the following "
"statistics:"
msgstr ""
"Мы планируем постоянно обновлять [механизм защиты от отпечатков пальцев](/"
"fpdetection/), основываясь на выведенных эвристиках. Эвристика выводится из "
"следующей статистики:"

#: ../content/posts/crawling_results.md:block 10 (unordered list)
msgid "How many APIs and endpoints does the website access?"
msgstr "К скольким API и конечным точкам обращается сайт?"

#: ../content/posts/crawling_results.md:block 10 (unordered list)
msgid "How many JS calls did the website make?"
msgstr "Сколько вызовов JS было сделано сайтом?"

#: ../content/posts/crawling_results.md:block 10 (unordered list)
msgid "Is the number and combination of JS APIs calls suspicious?"
msgstr "Не вызывает ли подозрений количество и сочетание вызовов JS API?"

#: ../content/posts/crawling_results.md:block 11 (paragraph)
msgid ""
"When our anti-fingerprint mechanism detects suspicious combinations or a "
"high number of used APIs, it can block communication with the webpage."
msgstr ""
"Когда наш механизм защиты от отпечатков пальцев обнаруживает подозрительные "
"комбинации или большое количество используемых API, он может заблокировать "
"связь с веб-страницей."

#: ../content/posts/crawling_results.md:block 12 (header)
msgid "Crawler"
msgstr "Гусеница"

#: ../content/posts/crawling_results.md:block 13 (paragraph)
msgid ""
"We have developed [Web "
"crawler](https://github.com/martinbednar/web_crawler/) - a tool for "
"automatically visiting websites from a given list and collecting JavaScript "
"calls made by the website. Our Web crawler is based on the "
"[OpenWPM](https://github.com/openwpm/OpenWPM) platform. A modified web "
"browser extension [Web API Manager](https://github.com/pes10k/web-api-"
"manager) collects statistics on called JS APIs."
msgstr ""
"Мы разработали [Web crawler](https://github.com/martinbednar/web_crawler/) - "
"инструмент для автоматического посещения сайтов из заданного списка и сбора "
"вызовов JavaScript, выполняемых сайтом. Наш веб-краулер основан на платформе "
"[OpenWPM](https://github.com/openwpm/OpenWPM). Модифицированное расширение "
"для браузера [Web API Manager](https://github.com/pes10k/web-api-manager) "
"собирает статистику по вызываемым JS API."

#: ../content/posts/crawling_results.md:block 14 (paragraph)
msgid "The crawling process can be described in the following steps:"
msgstr "Процесс ползания можно описать в виде следующих шагов:"

#: ../content/posts/crawling_results.md:block 15 (ordered list)
msgid ""
"The python script `start_docker_runs.py` launches the Docker image "
"[martan305/web_crawler](https://hub.docker.com/repository/docker/martan305/web_crawler)."
" The parameters set in the Python startup script are given to the Docker "
"container as environmental variables."
msgstr ""
"Python-скрипт `start_docker_runs.py` запускает Docker-образ "
"[martan305/web_crawler](https://hub.docker.com/repository/docker/martan305/"
"web_crawler). Параметры, заданные в скрипте запуска на Python, передаются "
"контейнеру Docker в качестве переменных окружения."

#: ../content/posts/crawling_results.md:block 15 (ordered list)
msgid ""
"If a privacy extension is required (in the script parameter), uBlock Origin "
"will be installed as soon as the web browser is started."
msgstr ""
"Если требуется расширение конфиденциальности (в параметре сценария), uBlock "
"Origin будет установлен сразу после запуска веб-браузера."

#: ../content/posts/crawling_results.md:block 15 (ordered list)
msgid ""
"Python script running in the container visits web pages from a given list "
"one by one."
msgstr ""
"Python-скрипт, запущенный в контейнере, поочередно посещает веб-страницы из "
"заданного списка."

#: ../content/posts/crawling_results.md:block 15 (ordered list)
msgid ""
"The browser waits for 30 seconds on each page. The customised web browser "
"extension Web API Manager intercepts JS calls and stores the stats into the "
"SQLite database."
msgstr ""
"Браузер ожидает 30 секунд на каждой странице. Настроенное расширение для "
"браузера Web API Manager перехватывает вызовы JS и сохраняет статистику в "
"базе данных SQLite."

#: ../content/posts/crawling_results.md:block 15 (ordered list)
msgid ""
"When the script finishes the crawl of assigned pages, it checks if there is "
"a batch of pages not yet visited. If there is an unprocessed batch, the "
"crawling continues with step 3 and the new list of web pages to visit. If "
"the crawler visited all sites, the crawling ends."
msgstr ""
"Когда скрипт завершает обход назначенных страниц, он проверяет, нет ли в "
"списке еще не посещенных страниц. Если есть необработанная партия, проползка "
"продолжается с шага 3 и нового списка веб-страниц для посещения. Если "
"краулер посетил все сайты, краулинг завершается."

#: ../content/posts/crawling_results.md:block 16 (paragraph)
msgid ""
"For now, we only visited the homepages because we wanted to visit as many "
"different websites as possible. In the future, we plan to launch long-term "
"crawling, which will include subpages. In particular, we want to focus on "
"visiting login pages, where we expect fingerprint scripts to be included. "
"Then, we can compare API calls on login pages and other pages."
msgstr ""
"Пока что мы посещали только главные страницы, потому что хотели посетить как "
"можно больше разных сайтов. В будущем мы планируем запустить долгосрочный "
"краулинг, который будет включать в себя подстраницы. В частности, мы хотим "
"сосредоточиться на посещении страниц входа в систему, где, как мы ожидаем, "
"будут присутствовать скрипты отпечатков пальцев. Затем мы сможем сравнить "
"вызовы API на страницах входа и других страницах."

#: ../content/posts/crawling_results.md:block 17 (paragraph)
msgid ""
"Afterwards, we analyse the collected data with a standalone [analysis "
"tool](https://github.com/martinbednar/web_crawler_data_analysis). The "
"analysis process consists of the following steps:"
msgstr ""
"После этого мы анализируем собранные данные с помощью автономного "
"[инструмента анализа] (https://github.com/martinbednar/"
"web_crawler_data_analysis). Процесс анализа состоит из следующих этапов:"

#: ../content/posts/crawling_results.md:block 18 (ordered list)
msgid ""
"Databases created by browsing with and without the web-browser extension "
"uBlock Origin are loaded separately."
msgstr ""
"Базы данных, созданные при просмотре с использованием расширения веб-"
"браузера uBlock Origin и без него, загружаются отдельно."

#: ../content/posts/crawling_results.md:block 18 (ordered list)
msgid ""
"Aggregation SQL queries are executed in databases. The results are loaded "
"into Python dictionaries."
msgstr ""
"Агрегационные SQL-запросы выполняются в базах данных. Результаты загружаются "
"в словари Python."

#: ../content/posts/crawling_results.md:block 18 (ordered list)
msgid ""
"Data sets are analysed, compared and the results are exported to CSV files."
msgstr ""
"Наборы данных анализируются, сравниваются, а результаты экспортируются в "
"файлы CSV."

#: ../content/posts/crawling_results.md:block 19 (header)
msgid "Measurement results"
msgstr "Результаты измерений"

#: ../content/posts/crawling_results.md:block 20 (paragraph)
msgid "This section presents the results of the analysis."
msgstr "В этом разделе представлены результаты анализа."

#: ../content/posts/crawling_results.md:block 21 (paragraph)
msgid ""
"We tried to visit the first 250 000 websites from the [Tranco list "
"X79N](https://tranco-list.eu/list/X79N/1000000). 211 843 homepages of "
"websites from the Tranco list were successfully visited in both modes - with"
" and without uBlock Origin. More than 4 000 000 000 JS calls were "
"intercepted and stored into 5 000 [SQLite "
"databases](https://nextcloud.fit.vutbr.cz/s/XKm3PCZnr2xkPH9) that have a "
"total size of over 880 GB."
msgstr ""
"Мы попытались посетить первые 250 000 сайтов из [списка Tranco X79N](https"
"://tranco-list.eu/list/X79N/1000000). 211 843 домашние страницы сайтов из "
"списка Tranco были успешно посещены в обоих режимах - с uBlock Origin и без "
"него. Более 4 000 000 000 JS-вызовов были перехвачены и сохранены в 5 000 "
"[SQLite баз данных](https://nextcloud.fit.vutbr.cz/s/XKm3PCZnr2xkPH9), общий "
"размер которых превышает 880 ГБ."

#: ../content/posts/crawling_results.md:block 22 (paragraph)
msgid ""
"Let us focus on the answers to the research questions on JavaScript API "
"calls made by the websites. This blog post usually lists only 10 result "
"lines for each experiment. Complete tables with all rows can be found in the"
" [results stored on the "
"server](https://nextcloud.fit.vutbr.cz/s/xDfSAe3Nx7iFSm4)."
msgstr ""
"Давайте сосредоточимся на ответах на вопросы исследования, касающиеся "
"вызовов JavaScript API, выполняемых веб-сайтами. В этой записи блога обычно "
"приводится только 10 строк результатов для каждого эксперимента. Полные "
"таблицы со всеми строками можно найти в разделе "
"[результаты хранятся на сервере](https://nextcloud.fit.vutbr.cz/s/"
"xDfSAe3Nx7iFSm4)."

#: ../content/posts/crawling_results.md:block 23 (paragraph)
msgid "The meaning of the table columns:"
msgstr "Значение столбцов таблицы:"

#: ../content/posts/crawling_results.md:block 24 (unordered list)
msgid "Endpoint = a function or a property provided by a web browser."
msgstr "Конечная точка = функция или свойство, предоставляемое веб-браузером."

#: ../content/posts/crawling_results.md:block 24 (unordered list)
msgid ""
"API = a group of functions and properties that are thematically related."
msgstr "API = группа функций и свойств, тематически связанных между собой."

#: ../content/posts/crawling_results.md:block 24 (unordered list)
msgid "Website = URL of the visited website."
msgstr "Website = URL-адрес посещенного веб-сайта."

#: ../content/posts/crawling_results.md:block 24 (unordered list)
msgid ""
"Calls without uBlock Origin = the number of JavaScript calls intercepted "
"without the uBlock Origin extension."
msgstr ""
"Звонки без uBlock Origin = количество вызовов JavaScript, перехваченных без "
"использования расширения uBlock Origin."

#: ../content/posts/crawling_results.md:block 24 (unordered list)
msgid ""
"Calls with uBlock Origin = the number of JavaScript calls intercepted with "
"the uBlock Origin extension."
msgstr ""
"Звонки с uBlock Origin = количество вызовов JavaScript, перехваченных с "
"помощью расширения uBlock Origin."

#: ../content/posts/crawling_results.md:block 24 (unordered list)
msgid ""
"Difference = the difference between the number of JavaScript calls "
"intercepted with and without the uBlock Origin extension."
msgstr ""
"Разница = разница между количеством вызовов JavaScript, перехваченных с "
"использованием расширения uBlock Origin и без него."

#: ../content/posts/crawling_results.md:block 24 (unordered list)
msgid ""
"Difference [%] = the difference expressed as a percentage. Difference [%] = "
"100 \\* Difference/Calls without uBlock Origin"
msgstr ""
"Разница [%] = разница, выраженная в процентах. Разница [%] = 100 \\* Разница/"
"Вызовы без uBlock Origin"

#: ../content/posts/crawling_results.md:block 24 (unordered list)
msgid ""
"Websites without uBlock [%] - what percentage of websites use the given API "
"(measured without the uBlock Origin extension installed)."
msgstr ""
"Веб-сайты без uBlock [%] - какой процент веб-сайтов использует данный API ("
"измеряется без установленного расширения uBlock Origin)."

#: ../content/posts/crawling_results.md:block 24 (unordered list)
msgid ""
"Websites with uBlock [%] - what percentage of websites use the given API "
"(measured with the uBlock Origin extension installed)."
msgstr ""
"Веб-сайты с uBlock [%] - какой процент веб-сайтов использует данный API ("
"измеряется с установленным расширением uBlock Origin)."

#: ../content/posts/crawling_results.md:block 25 (paragraph)
msgid ""
"All result tables are sorted by the `Difference [%]` column decreasing."
msgstr "Все таблицы результатов сортируются по убыванию столбца `Разница [%]`."

#: ../content/posts/crawling_results.md:block 26 (header)
msgid "The most blocked API"
msgstr "Самый заблокированный API"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "API"
msgstr "API"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Calls without uBlock"
msgstr "Звонки без uBlock"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Calls with uBlock"
msgstr "Звонки с помощью uBlock"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Difference"
msgstr "Разница"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Difference [%]"
msgstr "Разница [%]"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Non-Standard"
msgstr "Нестандартный"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "340 777"
msgstr "340 777"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "18 180"
msgstr "18 180"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "322 597"
msgstr "322 597"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "94,67%"
msgstr "94,67%"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Web Audio API"
msgstr "API веб-аудио"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "14 390 507"
msgstr "14 390 507"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "1 431 286"
msgstr "1 431 286"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "12 959 221"
msgstr "12 959 221"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "90,05%"
msgstr "90,05%"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Web Speech API"
msgstr "Речевой веб-интерфейс API"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "93 889"
msgstr "93 889"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "10 712"
msgstr "10 712"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "83 177"
msgstr "83 177"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "88,59%"
msgstr "88,59%"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Background Tasks API"
msgstr "API фоновых задач"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "5 950 947"
msgstr "5 950 947"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "954 740"
msgstr "954 740"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "4 996 207"
msgstr "4 996 207"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "83,96%"
msgstr "83,96%"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "High Resolution Time (Level 2)"
msgstr "Время высокого разрешения (уровень 2)"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "367 400 369"
msgstr "367 400 369"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "63 507 434"
msgstr "63 507 434"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "303 892 935"
msgstr "303 892 935"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "82,71%"
msgstr "82,71%"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Navigation Timing"
msgstr "Время навигации"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "8 160"
msgstr "8 160"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "1 749"
msgstr "1 749"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "6 411"
msgstr "6 411"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "78,57%"
msgstr "78,57%"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "CSS Animations Level 1"
msgstr "CSS-анимации Уровень 1"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "1 301"
msgstr "1 301"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "317"
msgstr "317"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "984"
msgstr "984"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "75,63%"
msgstr "75,63%"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Beacon"
msgstr "Маяк"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "223 209"
msgstr "223 209"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "62 651"
msgstr "62 651"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "160 558"
msgstr "160 558"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "71,93%"
msgstr "71,93%"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "DOM Level 2: Traversal and Range"
msgstr "Уровень 2 DOM: обход и диапазон"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "25 814 025"
msgstr "25 814 025"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "7 996 500"
msgstr "7 996 500"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "17 817 525"
msgstr "17 817 525"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "69,02%"
msgstr "69,02%"

#: ../content/posts/crawling_results.md:block 27 (table)
msgid "Indexed Database API"
msgstr "API индексированной базы данных"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "1 308 464"
msgstr "1 308 464"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "408 983"
msgstr "408 983"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "899 481"
msgstr "899 481"

#: ../content/posts/crawling_results.md:block 27 (table)
#, fuzzy
msgid "68,74%"
msgstr "68,74%"

#: ../content/posts/crawling_results.md:block 28 (header)
msgid "The most blocked API endpoints"
msgstr "Наиболее заблокированные конечные точки API"

#: ../content/posts/crawling_results.md:block 29 (table)
msgid "Endpoint"
msgstr "Конечная точка"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "Range.prototype.cloneContents"
msgstr "Range.prototype.cloneContents"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "2 603"
msgstr "2 603"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "16"
msgstr "16"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "2 587"
msgstr "2 587"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "99,39%"
msgstr "99,39%"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "Range.prototype.setStartAfter"
msgstr "Range.prototype.setStartAfter"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "1 234"
msgstr "1 234"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "9"
msgstr "9"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "1 225"
msgstr "1 225"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "99,27%"
msgstr "99,27%"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "MessagePort.prototype.close"
msgstr "MessagePort.prototype.close"

#: ../content/posts/crawling_results.md:block 29 (table)
msgid "HTML: Channel Messaging"
msgstr "HTML: Передача сообщений по каналам"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "51 802"
msgstr "51 802"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "416"
msgstr "416"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "51 386"
msgstr "51 386"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "99,20%"
msgstr "99,20%"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "SubtleCrypto.prototype.deriveBits"
msgstr "SubtleCrypto.prototype.deriveBits"

#: ../content/posts/crawling_results.md:block 29 (table)
msgid "Web Cryptography API"
msgstr "API веб-криптографии"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "208"
msgstr "208"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "2"
msgstr "2"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "206"
msgstr "206"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "99,04%"
msgstr "99,04%"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "Range.prototype.selectNode"
msgstr "Range.prototype.selectNode"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "337 795"
msgstr "337 795"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "7 384"
msgstr "7 384"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "330 411"
msgstr "330 411"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "97,81%"
msgstr "97,81%"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "Range.prototype.getBoundingClientRect"
msgstr "Range.prototype.getBoundingClientRect"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "337 650"
msgstr "337 650"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "7 565"
msgstr "7 565"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "330 085"
msgstr "330 085"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "97,76%"
msgstr "97,76%"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "Document.prototype.close"
msgstr "Document.prototype.close"

#: ../content/posts/crawling_results.md:block 29 (table)
msgid "HTML: Dynamic Markup Insertion"
msgstr "HTML: Динамическая вставка разметки"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "21 666"
msgstr "21 666"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "666"
msgstr "666"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "21 000"
msgstr "21 000"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "96,93%"
msgstr "96,93%"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "Navigator.prototype.javaEnabled"
msgstr "Navigator.prototype.javaEnabled"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "334 580"
msgstr "334 580"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "11 781"
msgstr "11 781"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "322 799"
msgstr "322 799"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "96,48%"
msgstr "96,48%"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "ServiceWorkerContainer.prototype.getRegistration"
msgstr "ServiceWorkerContainer.prototype.getRegistration"

#: ../content/posts/crawling_results.md:block 29 (table)
msgid "Service Workers"
msgstr "Работники сферы обслуживания"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "34 176"
msgstr "34 176"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "1 375"
msgstr "1 375"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "32 801"
msgstr "32 801"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "95,98%"
msgstr "95,98%"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "FormData.prototype.append"
msgstr "FormData.prototype.append"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "XMLHttpRequest"
msgstr "XMLHttpRequest"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "670 137"
msgstr "670 137"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "27 767"
msgstr "27 767"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "642 370"
msgstr "642 370"

#: ../content/posts/crawling_results.md:block 29 (table)
#, fuzzy
msgid "95,86%"
msgstr "95,86%"

#: ../content/posts/crawling_results.md:block 30 (header)
msgid "Use of APIs on websites"
msgstr "Использование API на веб-сайтах"

#: ../content/posts/crawling_results.md:block 31 (table)
msgid "Websites without uBlock [%]"
msgstr "Сайты без uBlock [%]"

#: ../content/posts/crawling_results.md:block 31 (table)
msgid "Websites with uBlock [%]"
msgstr "Сайты с uBlock [%]"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "62,06%"
msgstr "62,06%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "4,80%"
msgstr "4,80%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "57,29%"
msgstr "57,29%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "61,40%"
msgstr "61,40%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "21,98%"
msgstr "21,98%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "39,56%"
msgstr "39,56%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "32,91%"
msgstr "32,91%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "7,60%"
msgstr "7,60%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "25,36%"
msgstr "25,36%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "71,53%"
msgstr "71,53%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "47,76%"
msgstr "47,76%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "24,08%"
msgstr "24,08%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "45,58%"
msgstr "45,58%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "24,71%"
msgstr "24,71%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "21,03%"
msgstr "21,03%"

#: ../content/posts/crawling_results.md:block 31 (table)
msgid "Performance Timeline"
msgstr "Сроки выполнения"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "41,15%"
msgstr "41,15%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "21,22%"
msgstr "21,22%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "20,06%"
msgstr "20,06%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "57,37%"
msgstr "57,37%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "39,24%"
msgstr "39,24%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "18,39%"
msgstr "18,39%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "HTML 5"
msgstr "HTML 5"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "50,14%"
msgstr "50,14%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "33,45%"
msgstr "33,45%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "16,91%"
msgstr "16,91%"

#: ../content/posts/crawling_results.md:block 31 (table)
msgid "HTML: Web Storage"
msgstr "HTML: Веб-хранилище"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "65,69%"
msgstr "65,69%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "49,48%"
msgstr "49,48%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "16,53%"
msgstr "16,53%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "URL"
msgstr "URL"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "29,73%"
msgstr "29,73%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "15,79%"
msgstr "15,79%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "14,05%"
msgstr "14,05%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "14,41%"
msgstr "14,41%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "0,81%"
msgstr "0,81%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "13,61%"
msgstr "13,61%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "22,23%"
msgstr "22,23%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "9,40%"
msgstr "9,40%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "12,89%"
msgstr "12,89%"

#: ../content/posts/crawling_results.md:block 31 (table)
msgid "HTML: Canvas Element"
msgstr "HTML: Элемент холста"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "42,54%"
msgstr "42,54%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "29,89%"
msgstr "29,89%"

#: ../content/posts/crawling_results.md:block 31 (table)
#, fuzzy
msgid "12,85%"
msgstr "12,85%"

#: ../content/posts/crawling_results.md:block 32 (header)
msgid "The number of APIs used by the website"
msgstr "Количество API, используемых веб-сайтом"

#: ../content/posts/crawling_results.md:block 33 (paragraph)
msgid ""
"**Average value** - Number of APIs used without uBlock Origin: **18.78**"
msgstr ""
"**Среднее значение** - Количество API, используемых без uBlock Origin: "
"**18.78**"

#: ../content/posts/crawling_results.md:block 34 (paragraph)
msgid "![image]({attach}/images/crawling_results/APIs_without_uBlock.png)"
msgstr ""
"![ изображение]({attach}/images/crawling_results/APIs_without_uBlock.png)"

#: ../content/posts/crawling_results.md:block 35 (paragraph)
msgid "**Average value** - Number of APIs used with uBlock Origin: **14.27**"
msgstr ""
"**Среднее значение** - Количество API, используемых с uBlock Origin: "
"**14.27**"

#: ../content/posts/crawling_results.md:block 36 (paragraph)
msgid "![image]({attach}/images/crawling_results/APIs_with_uBlock.png)"
msgstr "![ изображение]({attach}/images/crawling_results/APIs_with_uBlock.png)"

#: ../content/posts/crawling_results.md:block 37 (header)
msgid "The number of JavaScript calls on websites"
msgstr "Количество вызовов JavaScript на веб-сайтах"

#: ../content/posts/crawling_results.md:block 38 (paragraph)
msgid ""
"**Average value** - Number of JavaScript calls made without uBlock Origin: "
"**10 629.92**"
msgstr ""
"**Среднее значение** - Количество вызовов JavaScript, выполненных без uBlock "
"Origin: **10 629.92**"

#: ../content/posts/crawling_results.md:block 39 (paragraph)
msgid "![image]({attach}/images/crawling_results/JScalls_without_uBlock.png)"
msgstr ""
"![ изображение]({attach}/images/crawling_results/JScalls_without_uBlock.png)"

#: ../content/posts/crawling_results.md:block 40 (paragraph)
msgid ""
"**Average value** - Number of JavaScript calls made with uBlock Origin: **7 "
"176.2**"
msgstr ""
"**Среднее значение** - Количество вызовов JavaScript, выполненных с помощью "
"uBlock Origin: **7 176.2**"

#: ../content/posts/crawling_results.md:block 41 (paragraph)
msgid "![image]({attach}/images/crawling_results/JScalls_with_uBlock.png)"
msgstr ""
"![ изображение]({attach}/images/crawling_results/JScalls_with_uBlock.png)"

#: ../content/posts/crawling_results.md:block 42 (header)
msgid "The number of endpoint calls on websites"
msgstr "Количество вызовов конечных точек на веб-сайтах"

#: ../content/posts/crawling_results.md:block 43 (table)
msgid "Website"
msgstr "Веб-сайт"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://www.woolworths.co.za/"
msgstr "https://www.woolworths.co.za/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "window.getComputedStyle"
msgstr "window.getComputedStyle"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "202 013"
msgstr "202 013"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "1"
msgstr "1"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "202 012"
msgstr "202 012"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "100,00%"
msgstr "100,00%"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://www.superkopilka.com/"
msgstr "https://www.superkopilka.com/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "Performance.prototype.now"
msgstr "Performance.prototype.now"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "158 034"
msgstr "158 034"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "158 033"
msgstr "158 033"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://www.jarir.com/"
msgstr "https://www.jarir.com/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "DOMTokenList.prototype.contains"
msgstr "DOMTokenList.prototype.contains"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "156 917"
msgstr "156 917"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "156 916"
msgstr "156 916"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://shm.ru/#"
msgstr "https://shm.ru/#"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "153 653"
msgstr "153 653"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "153 652"
msgstr "153 652"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://znanium.com/"
msgstr "https://znanium.com/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "138 465"
msgstr "138 465"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "138 464"
msgstr "138 464"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://www.soliton.az/"
msgstr "https://www.soliton.az/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "137 467"
msgstr "137 467"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "137 466"
msgstr "137 466"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://www.lasenza.com/"
msgstr "https://www.lasenza.com/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "118 945"
msgstr "118 945"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "118 944"
msgstr "118 944"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://nethouse.ru/"
msgstr "https://nethouse.ru/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "113 580"
msgstr "113 580"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "113 579"
msgstr "113 579"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://boodmo.com/"
msgstr "https://boodmo.com/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "108 376"
msgstr "108 376"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "108 375"
msgstr "108 375"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://fipi.ru/"
msgstr "https://fipi.ru/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "108 255"
msgstr "108 255"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "108 254"
msgstr "108 254"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://belregion.ru/"
msgstr "https://belregion.ru/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "105 227"
msgstr "105 227"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "105 226"
msgstr "105 226"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "https://tsargrad.tv/"
msgstr "https://tsargrad.tv/"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "99 445"
msgstr "99 445"

#: ../content/posts/crawling_results.md:block 43 (table)
#, fuzzy
msgid "99 444"
msgstr "99 444"

#: ../content/posts/crawling_results.md:block 44 (header)
msgid "Measurement results for opensource websites only"
msgstr "Результаты измерений только для веб-сайтов с открытым исходным кодом"

#: ../content/posts/crawling_results.md:block 45 (paragraph)
msgid ""
"As this project focuses on free and open source software, we compared the "
"general results with a list of pages connected to free software or open "
"source."
msgstr ""
"Поскольку этот проект посвящен свободному и открытому программному "
"обеспечению, мы сравнили общие результаты со списком страниц, связанных со "
"свободным программным обеспечением или открытым исходным кодом."

#: ../content/posts/crawling_results.md:block 46 (paragraph)
msgid ""
"We collected the list of the home pages from [Gentoo "
"repository](https://gitweb.gentoo.org/repo/gentoo.git/tree/)."
msgstr ""
"Мы собрали список домашних страниц из [репозитория Gentoo](https://"
"gitweb.gentoo.org/repo/gentoo.git/tree/)."

#: ../content/posts/crawling_results.md:block 47 (paragraph)
msgid ""
"We tried to visit all 5 271 collected websites. 4 528 homepages were "
"successfully visited in both modes, with and without uBlock Origin. More "
"than 11 000 000 JS calls were intercepted and stored into 2 [SQLite "
"databases](https://nextcloud.fit.vutbr.cz/s/yoLa5rcGzkgbSka) that have a "
"total size of over 3 GB."
msgstr ""
"Мы попытались посетить все 5 271 собранный сайт. 4 528 домашних страниц были "
"успешно посещены в обоих режимах, с uBlock Origin и без него. Более 11 000 "
"000 вызовов JS были перехвачены и сохранены в 2 [SQLite базы данных](https://"
"nextcloud.fit.vutbr.cz/s/yoLa5rcGzkgbSka) общим размером более 3 ГБ."

#: ../content/posts/crawling_results.md:block 48 (paragraph)
msgid ""
"Only the first 10 lines of the analysis results are usually listed below. "
"Complete tables with all rows can be found in the [results stored on the "
"server](https://nextcloud.fit.vutbr.cz/s/LWANmRxoXc5YYzy)."
msgstr ""
"Обычно ниже приводятся только первые 10 строк результатов анализа. Полные "
"таблицы со всеми строками можно найти в разделе "
"[результаты, хранящиеся на сервере](https://nextcloud.fit.vutbr.cz/s/"
"LWANmRxoXc5YYzy)."

#: ../content/posts/crawling_results.md:block 50 (table)
msgid "Resource Timing Level 2"
msgstr "Временные ресурсы Уровень 2"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "348"
msgstr "348"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "8"
msgstr "8"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "340"
msgstr "340"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "97,70%"
msgstr "97,70%"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "1 711"
msgstr "1 711"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "66"
msgstr "66"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "1 645"
msgstr "1 645"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "96,14%"
msgstr "96,14%"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "18 763"
msgstr "18 763"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "1 037"
msgstr "1 037"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "17 726"
msgstr "17 726"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "94,47%"
msgstr "94,47%"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "306"
msgstr "306"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "18"
msgstr "18"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "288"
msgstr "288"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "94,12%"
msgstr "94,12%"

#: ../content/posts/crawling_results.md:block 50 (table)
msgid "HTML: Plugins"
msgstr "HTML: плагины"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "13"
msgstr "13"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "11"
msgstr "11"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "84,62%"
msgstr "84,62%"

#: ../content/posts/crawling_results.md:block 50 (table)
msgid "Permissions API"
msgstr "Разрешения API"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "705"
msgstr "705"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "186"
msgstr "186"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "519"
msgstr "519"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "73,62%"
msgstr "73,62%"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "3 981"
msgstr "3 981"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "1 088"
msgstr "1 088"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "2 893"
msgstr "2 893"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "72,67%"
msgstr "72,67%"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "849 390"
msgstr "849 390"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "232 806"
msgstr "232 806"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "616 584"
msgstr "616 584"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "72,59%"
msgstr "72,59%"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "21"
msgstr "21"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "6"
msgstr "6"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "15"
msgstr "15"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "71,43%"
msgstr "71,43%"

#: ../content/posts/crawling_results.md:block 50 (table)
msgid "Performance Timeline (Level 2)"
msgstr "График работы (уровень 2)"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "2 548"
msgstr "2 548"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "745"
msgstr "745"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "1 803"
msgstr "1 803"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "70,76%"
msgstr "70,76%"

#: ../content/posts/crawling_results.md:block 50 (table)
msgid "Storage API"
msgstr "Хранение API"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "3"
msgstr "3"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "66,67%"
msgstr "66,67%"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "727"
msgstr "727"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "250"
msgstr "250"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "477"
msgstr "477"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "65,61%"
msgstr "65,61%"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "7 632"
msgstr "7 632"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "2 928"
msgstr "2 928"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "4 704"
msgstr "4 704"

#: ../content/posts/crawling_results.md:block 50 (table)
#, fuzzy
msgid "61,64%"
msgstr "61,64%"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "IdleDeadline.prototype.timeRemaining"
msgstr "IdleDeadline.prototype.timeRemaining"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "2 258"
msgstr "2 258"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "2 256"
msgstr "2 256"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "99,91%"
msgstr "99,91%"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "Element.prototype.getAttributeNames"
msgstr "Element.prototype.getAttributeNames"

#: ../content/posts/crawling_results.md:block 52 (table)
msgid "DOM"
msgstr "ДОМ"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "1 648"
msgstr "1 648"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "12"
msgstr "12"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "1 636"
msgstr "1 636"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "268"
msgstr "268"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "266"
msgstr "266"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "99,25%"
msgstr "99,25%"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "Document.prototype.elementFromPoint"
msgstr "Document.prototype.elementFromPoint"

#: ../content/posts/crawling_results.md:block 52 (table)
msgid "CSS Object Model (CSSOM)"
msgstr "Модель объекта CSS (CSSOM)"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "2 554"
msgstr "2 554"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "22"
msgstr "22"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "2 532"
msgstr "2 532"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "99,14%"
msgstr "99,14%"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "106"
msgstr "106"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "105"
msgstr "105"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "99,06%"
msgstr "99,06%"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "CanvasRenderingContext2D.prototype.createLinearGradient"
msgstr "CanvasRenderingContext2D.prototype.createLinearGradient"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "4 634"
msgstr "4 634"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "56"
msgstr "56"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "4 578"
msgstr "4 578"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "98,79%"
msgstr "98,79%"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "CanvasRenderingContext2D.prototype.transform"
msgstr "CanvasRenderingContext2D.prototype.transform"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "37 792"
msgstr "37 792"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "845"
msgstr "845"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "36 947"
msgstr "36 947"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "PerformanceResourceTiming.prototype.toJSON"
msgstr "PerformanceResourceTiming.prototype.toJSON"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "1 691"
msgstr "1 691"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "47"
msgstr "47"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "1 644"
msgstr "1 644"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "97,22%"
msgstr "97,22%"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "PerformanceObserverEntryList.prototype.getEntriesByName"
msgstr "PerformanceObserverEntryList.prototype.getEntriesByName"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "52"
msgstr "52"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "50"
msgstr "50"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "96,15%"
msgstr "96,15%"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "CanvasGradient.prototype.addColorStop"
msgstr "CanvasGradient.prototype.addColorStop"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "9 623"
msgstr "9 623"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "453"
msgstr "453"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "9 170"
msgstr "9 170"

#: ../content/posts/crawling_results.md:block 52 (table)
#, fuzzy
msgid "95,29%"
msgstr "95,29%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "26,47%"
msgstr "26,47%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "1,13%"
msgstr "1,13%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "25,26%"
msgstr "25,26%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "21,94%"
msgstr "21,94%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "7,24%"
msgstr "7,24%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "14,64%"
msgstr "14,64%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "26,42%"
msgstr "26,42%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "14,94%"
msgstr "14,94%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "11,41%"
msgstr "11,41%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "13,70%"
msgstr "13,70%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "9,08%"
msgstr "9,08%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "4,58%"
msgstr "4,58%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "6,35%"
msgstr "6,35%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "1,76%"
msgstr "1,76%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "10,07%"
msgstr "10,07%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "5,68%"
msgstr "5,68%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "4,36%"
msgstr "4,36%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "15,46%"
msgstr "15,46%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "11,12%"
msgstr "11,12%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "4,29%"
msgstr "4,29%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "10,79%"
msgstr "10,79%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "6,46%"
msgstr "6,46%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "20,60%"
msgstr "20,60%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "16,26%"
msgstr "16,26%"

#: ../content/posts/crawling_results.md:block 54 (table)
#, fuzzy
msgid "4,27%"
msgstr "4,27%"

#: ../content/posts/crawling_results.md:block 56 (paragraph)
msgid "**Average value** - Number of APIs used without uBlock Origin: **7.4**"
msgstr ""
"**Среднее значение** - Количество API, используемых без uBlock Origin: "
"**7.4**"

#: ../content/posts/crawling_results.md:block 57 (paragraph)
msgid "![image](crawling_results/APIs_without_uBlock_opensource.png)"
msgstr "![изображение](crawling_results/APIs_without_uBlock_opensource.png)"

#: ../content/posts/crawling_results.md:block 58 (paragraph)
msgid "**Average value** - Number of APIs used with uBlock Origin: **6.2**"
msgstr ""
"**Среднее значение** - Количество API, используемых с uBlock Origin: **6.2**"

#: ../content/posts/crawling_results.md:block 59 (paragraph)
msgid "![image](crawling_results/APIs_with_uBlock_opensource.png)"
msgstr "![изображение](crawling_results/APIs_with_uBlock_opensource.png)"

#: ../content/posts/crawling_results.md:block 61 (paragraph)
msgid ""
"**Average value** - Number of JavaScript calls made without uBlock Origin: "
"**1598.18**"
msgstr ""
"**Среднее значение** - Количество вызовов JavaScript, выполненных без uBlock "
"Origin: **1598.18**"

#: ../content/posts/crawling_results.md:block 62 (paragraph)
msgid "![image](crawling_results/JScalls_without_uBlock_opensource.png)"
msgstr "![изображение](crawling_results/JScalls_without_uBlock_opensource.png)"

#: ../content/posts/crawling_results.md:block 63 (paragraph)
msgid ""
"**Average value** - Number of JavaScript calls made with uBlock Origin: "
"**1304.06**"
msgstr ""
"**Среднее значение** - Количество вызовов JavaScript, выполненных с помощью "
"uBlock Origin: **1304.06**"

#: ../content/posts/crawling_results.md:block 64 (paragraph)
msgid "![image](crawling_results/JScalls_with_uBlock_opensource.png)"
msgstr "![изображение](crawling_results/JScalls_with_uBlock_opensource.png)"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "https://wci.llnl.gov/"
msgstr "https://wci.llnl.gov/"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "Element.prototype.hasAttribute"
msgstr "Element.prototype.hasAttribute"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "34 860"
msgstr "34 860"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "34 859"
msgstr "34 859"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "https://wiibrew.org/wiki/Main_Page"
msgstr "https://wiibrew.org/wiki/Main_Page"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "6 512"
msgstr "6 512"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "6 511"
msgstr "6 511"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "99,98%"
msgstr "99,98%"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "http://www.vsound.org/"
msgstr "http://www.vsound.org/"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "Document.prototype.getElementById"
msgstr "Document.prototype.getElementById"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "5 797"
msgstr "5 797"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "5 796"
msgstr "5 796"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "http://wormsofprey.org/"
msgstr "http://wormsofprey.org/"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "5 793"
msgstr "5 793"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "5 792"
msgstr "5 792"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "http://konst.org.ua/"
msgstr "http://konst.org.ua/"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "Element.prototype.setAttribute"
msgstr "Element.prototype.setAttribute"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "4 248"
msgstr "4 248"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "4 247"
msgstr "4 247"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "https://www.union.edu/mathematics"
msgstr "https://www.union.edu/mathematics"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "5 317"
msgstr "5 317"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "5 315"
msgstr "5 315"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "99,96%"
msgstr "99,96%"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "https://www.mongodb.com/"
msgstr "https://www.mongodb.com/"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "30 516"
msgstr "30 516"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "14"
msgstr "14"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "30 502"
msgstr "30 502"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "99,95%"
msgstr "99,95%"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "https://www.monotype.com/"
msgstr "https://www.monotype.com/"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "4 091"
msgstr "4 091"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "4 089"
msgstr "4 089"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "https://sylabs.io/"
msgstr "https://sylabs.io/"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "1 839"
msgstr "1 839"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "1 838"
msgstr "1 838"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "http://vlgothic.dicey.org/"
msgstr "http://vlgothic.dicey.org/"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "3 427"
msgstr "3 427"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "3 425"
msgstr "3 425"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "99,94%"
msgstr "99,94%"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "https://www.ppsspp.org/"
msgstr "https://www.ppsspp.org/"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "3 397"
msgstr "3 397"

#: ../content/posts/crawling_results.md:block 66 (table)
#, fuzzy
msgid "3 395"
msgstr "3 395"

#: ../content/posts/crawling_results.md:block 67 (header)
msgid "Measurement results for FingerPrint Detector"
msgstr "Результаты измерений для детектора отпечатков пальцев"

#: ../content/posts/crawling_results.md:block 68 (paragraph)
msgid ""
"We designed the web crawling primarily to retrieve data to create or "
"evaluate heuristics for the [FingerPrint Detector (FPD)](/fpdetection/). The"
" above results are helpful in understanding the JavaScript APIs usage on the"
" web. For FPD, only the name of the endpoint and the weight of this endpoint"
" are important. The weight expresses how often a given endpoint is used to "
"create a fingerprint."
msgstr ""
"Мы планировали использовать веб-краулинг в первую очередь для получения "
"данных, необходимых для создания или оценки эвристики для "
"[FingerPrint Detector (FPD)] (/fpdetection/). Приведенные выше результаты "
"полезны для понимания использования API JavaScript в Интернете. Для FPD "
"важны только имя конечной точки и ее вес. Вес показывает, как часто данная "
"конечная точка используется для создания отпечатка пальца."

#: ../content/posts/crawling_results.md:block 69 (paragraph)
msgid ""
"The resulting table below was created from crawled data from websites of the"
" Tranco list . Two data sets were combined to obtain more accurate results. "
"The first dataset obtained while crawling with uBlock Origin, the second one"
" obtained while crawling with uMatrix. The resulting endpoint weight (marked"
" as `average_weight`) was calculated in Python as follows:"
msgstr ""
"Приведенная ниже таблица была создана на основе данных, полученных с веб-"
"сайтов из списка Tranco. Для получения более точных результатов были "
"объединены два набора данных. Первый набор данных был получен во время "
"ползания с помощью uBlock Origin, второй - во время ползания с помощью "
"uMatrix. Результирующий вес конечной точки (обозначенный как `средний_вес`) "
"был рассчитан в Python следующим образом:"

#: ../content/posts/crawling_results.md:block 71 (paragraph)
msgid ""
"Again, only the first 10 lines of the FPD analysis result are listed below. "
"Complete table with all rows can be found in the [results stored on the "
"server](https://nextcloud.fit.vutbr.cz/s/GjkTJzweccgxw6n)."
msgstr ""
"Ниже приведены только первые 10 строк результатов анализа FPD. Полную "
"таблицу со всеми строками можно найти в [результатах, хранящихся на сервере]"
"(https://nextcloud.fit.vutbr.cz/s/GjkTJzweccgxw6n)."

#: ../content/posts/crawling_results.md:block 72 (table)
msgid "Average weight"
msgstr "Средний вес"

#: ../content/posts/crawling_results.md:block 72 (table)
msgid "uMatrix weight"
msgstr "вес uMatrix"

#: ../content/posts/crawling_results.md:block 72 (table)
msgid "uBlock weight"
msgstr "вес uBlock"

#: ../content/posts/crawling_results.md:block 72 (table)
msgid "Calls without extension"
msgstr "Звонки без расширения"

#: ../content/posts/crawling_results.md:block 72 (table)
msgid "Calls with uMatrix"
msgstr "Вызовы с помощью uMatrix"

#: ../content/posts/crawling_results.md:block 72 (table)
msgid "Difference uMatrix"
msgstr "Разница uMatrix"

#: ../content/posts/crawling_results.md:block 72 (table)
msgid "Difference uBlock"
msgstr "Разница uBlock"

#: ../content/posts/crawling_results.md:block 72 (table)
msgid "Difference uMatrix [%]"
msgstr "Разница uMatrix [%]"

#: ../content/posts/crawling_results.md:block 72 (table)
msgid "Difference uBlock [%]"
msgstr "Разница uBlock [%]"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "13,427"
msgstr "13,427"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "13,060"
msgstr "13,060"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "455"
msgstr "455"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "454"
msgstr "454"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "449"
msgstr "449"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,998"
msgstr "0,998"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,987"
msgstr "0,987"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "Range.prototype.insertNode"
msgstr "Range.prototype.insertNode"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "13,138"
msgstr "13,138"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "12,920"
msgstr "12,920"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "460"
msgstr "460"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "5"
msgstr "5"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "452"
msgstr "452"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,989"
msgstr "0,989"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,983"
msgstr "0,983"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "HTMLFormControlsCollection.prototype.namedItem"
msgstr "HTMLFormControlsCollection.prototype.namedItem"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "12,714"
msgstr "12,714"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "12,623"
msgstr "12,623"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "2 211"
msgstr "2 211"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "19"
msgstr "19"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "25"
msgstr "25"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "2 192"
msgstr "2 192"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "2 186"
msgstr "2 186"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,991"
msgstr "0,991"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "Document.prototype.open"
msgstr "Document.prototype.open"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "12,475"
msgstr "12,475"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "11,274"
msgstr "11,274"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "8 190"
msgstr "8 190"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "129"
msgstr "129"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "424"
msgstr "424"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "8 061"
msgstr "8 061"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "7 766"
msgstr "7 766"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,984"
msgstr "0,984"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,948"
msgstr "0,948"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "12,438"
msgstr "12,438"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "12,424"
msgstr "12,424"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "16 208"
msgstr "16 208"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "30"
msgstr "30"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "37"
msgstr "37"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "16 178"
msgstr "16 178"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "16 171"
msgstr "16 171"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "Document.prototype.getElementsByTagNameNS"
msgstr "Document.prototype.getElementsByTagNameNS"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "12,374"
msgstr "12,374"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "10,811"
msgstr "10,811"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "533"
msgstr "533"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "43"
msgstr "43"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "515"
msgstr "515"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "490"
msgstr "490"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,966"
msgstr "0,966"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,919"
msgstr "0,919"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "12,086"
msgstr "12,086"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "11,944"
msgstr "11,944"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "7 731"
msgstr "7 731"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "212"
msgstr "212"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "245"
msgstr "245"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "7 519"
msgstr "7 519"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "7 486"
msgstr "7 486"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,973"
msgstr "0,973"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,968"
msgstr "0,968"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "SubtleCrypto.prototype.generateKey"
msgstr "SubtleCrypto.prototype.generateKey"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "11,876"
msgstr "11,876"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "11,503"
msgstr "11,503"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "985"
msgstr "985"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "48"
msgstr "48"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "59"
msgstr "59"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "937"
msgstr "937"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "926"
msgstr "926"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,951"
msgstr "0,951"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,940"
msgstr "0,940"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "Document.prototype.elementsFromPoint"
msgstr "Document.prototype.elementsFromPoint"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "12,469"
msgstr "12,469"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "11,365"
msgstr "11,365"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "46 938"
msgstr "46 938"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "44"
msgstr "44"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "1 598"
msgstr "1 598"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "46 894"
msgstr "46 894"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "45 340"
msgstr "45 340"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,999"
msgstr "0,999"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "10,892"
msgstr "10,892"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "110 665"
msgstr "110 665"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "3 677"
msgstr "3 677"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "3 679"
msgstr "3 679"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "106 988"
msgstr "106 988"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "106 986"
msgstr "106 986"

#: ../content/posts/crawling_results.md:block 72 (table)
#, fuzzy
msgid "0,967"
msgstr "0,967"

#: ../content/posts/crawling_results.md:block 73 (paragraph)
msgid ""
"More about FingerPrint Detector is written in the [following "
"blogpost](/fpdetection/)."
msgstr ""
"Подробнее о FingerPrint Detector написано в [следующем блоге](/fpdetection/)."

#: ../content/posts/crawling_results.md:block 74 (header)
msgid "Conclusion"
msgstr "Заключение"

#: ../content/posts/crawling_results.md:block 75 (paragraph)
msgid ""
"The crawl identified JavaScript endpoints, often used to create a browser "
"fingerprint. The observed data allow assigning weights for each endpoint. "
"[FingerPrint Detector](/fpdetection/) configuration file uses the crawl "
"results."
msgstr ""
"В ходе просмотра были выявлены конечные точки JavaScript, которые часто "
"используются для создания \"отпечатка пальца\" браузера. Наблюдаемые данные "
"позволяют назначить вес для каждой конечной точки. Конфигурационный файл "
"[FingerPrint Detector](/fpdetection/) использует результаты переползания."

#: ../content/posts/farbling.md:block 1 (header)
msgid ""
"title: Farbling-based wrappers to hinder browser fingerprinting\n"
"date: 2021-08-23 09:00\n"
"Series: Browser fingerprinting"
msgstr ""
"Заголовок: Обертки на основе фарблинга препятствуют отпечаткам пальцев в "
"браузере\n"
"дата: 2021-08-23 09:00\n"
"Серия: Отпечатки пальцев браузеров"

#: ../content/posts/farbling.md:block 2 (paragraph)
msgid ""
"[Browser fingerprinting](https://arxiv.org/pdf/1905.01051.pdf) is a more and"
" more popular technique used to identify browsers. The fingerprint is "
"computed based on the results of JavaScript calls, the content of HTTP "
"headers, hardware characteristics, underlying operating system and other "
"software information. Consequently, browser fingerprints are used for cross-"
"domain tracking. However, users cannot clear their browser fingerprint as it"
" is not stored on the client-side. It is also challenging to determine "
"whether a browser is being fingerprinted."
msgstr ""
"[\"Отпечатки пальцев\" браузеров] (https://arxiv.org/pdf/1905.01051.pdf) - "
"это все более популярная техника, используемая для идентификации браузеров. "
"Отпечаток вычисляется на основе результатов вызовов JavaScript, содержимого "
"HTTP-заголовков, характеристик оборудования, базовой операционной системы и "
"другой информации о программном обеспечении. Таким образом, отпечатки "
"браузеров используются для междоменного отслеживания. Однако пользователи не "
"могут очистить отпечаток браузера, поскольку он не хранится на стороне "
"клиента. Кроме того, сложно определить, что отпечатки браузеров не "
"используются."

#: ../content/posts/farbling.md:block 3 (paragraph)
msgid ""
"Another issue that hinders fingerprinting protection is the ever-changing "
"variety of supported APIs. Browsers implement new APIs over time, and "
"existing APIs change. Consequently, it is necessary to continuously monitor "
"the APIs being used for fingerprinting purposes to block fingerprinting "
"attempts."
msgstr ""
"Еще одна проблема, мешающая защите от отпечатков пальцев, - постоянно "
"меняющееся разнообразие поддерживаемых API. Браузеры со временем внедряют "
"новые API, а существующие API меняются. Следовательно, необходимо постоянно "
"отслеживать API, используемые для отпечатков пальцев, чтобы блокировать "
"попытки отпечатков."

#: ../content/posts/farbling.md:block 4 (paragraph)
msgid ""
"Due to fingerprinting scripts being [more "
"prevalent](https://www.cs.princeton.edu/~arvindn/publications/OpenWPM_1_million_site_tracking_measurement.pdf),"
" various web browsers - for example, Tor, Brave, and Firefox - started "
"implementing fingerprinting protection to protect users and their privacy."
msgstr ""
"В связи с тем, что скрипты отпечатков пальцев стали [более распространенными]"
" (https://www.cs.princeton.edu/~arvindn/publications/"
"OpenWPM_1_million_site_tracking_measurement.pdf), различные веб-браузеры - "
"например, Tor, Brave и Firefox - начали внедрять защиту от отпечатков "
"пальцев, чтобы защитить пользователей и их конфиденциальность."

#: ../content/posts/farbling.md:block 5 (paragraph)
msgid "This post contains:"
msgstr "Этот пост содержит:"

#: ../content/posts/farbling.md:block 6 (paragraph)
msgid "[TOC]"
msgstr "[КАТАЛОГ]"

#: ../content/posts/farbling.md:block 7 (header)
msgid "Brave fingerprinting protection"
msgstr "Смелая защита от отпечатков пальцев"

#: ../content/posts/farbling.md:block 8 (paragraph)
msgid ""
"Why is Brave's Farbling special? Until recently, [Tor "
"browser](https://2019.www.torproject.org/projects/torbrowser/design/#fingerprinting-"
"linkability) had the most robust defence against fingerprinting. It (1) "
"implemented modifications in various APIs, (2) blocks some other APIs, (3) "
"runs in a window of predefined size, etc. to ensure all users have the same "
"fingerprint. This approach is very effective at producing uniform "
"fingerprint for all users, which makes it difficult for fingerprinters to "
"differentiate between browsers. Still, such fingerprint is also brittle -- "
"minor changes like resizing the window could cause the browser to have a "
"unique fingerprint. Hence, users need to follow inconvenient steps to keep "
"their fingerprint uniform."
msgstr ""
"Почему \"Фарблинг\" Brave особенный? До недавнего времени [браузер Tor]"
"(https://2019.www.torproject.org/projects/torbrowser/design/#fingerprinting-"
"linkability) обладал самой надежной защитой от отпечатков пальцев. Он (1) "
"вносил изменения в различные API, (2) блокировал некоторые другие API, (3) "
"запускался в окне заданного размера и т. д., чтобы обеспечить всем "
"пользователям одинаковые отпечатки пальцев. Такой подход очень эффективен "
"для получения единообразных отпечатков пальцев для всех пользователей, что "
"затрудняет для фингерпринтеров дифференциацию браузеров. Тем не менее, такой "
"отпечаток является хрупким - незначительные изменения, такие как изменение "
"размера окна, могут привести к тому, что браузер будет иметь уникальный "
"отпечаток. Поэтому пользователям приходится выполнять неудобные действия, "
"чтобы сохранить отпечатки пальцев неизменными."

#: ../content/posts/farbling.md:block 9 (paragraph)
msgid ""
"With all this in [mind](https://brave.com/brave-fingerprinting-and-privacy-"
"budgets/), Brave software decided to improve their fingerprinting "
"protection. They [proposed](https://brave.com/privacy-updates-3/) new "
"fingerprinting protection, Farbling, arguing that it is (almost) impossible "
"to produce uniform fingerprint without compromising user experience. Their "
"countermeasures involve randomising values based on previous research papers"
" [PriVaricator](https://www.doc.ic.ac.uk/~livshits/papers/pdf/www15.pdf) and"
" [FPRandom](https://hal.inria.fr/hal-01527580/document) Both papers have "
"shown promising results, and Brave has perfected this approach, creating "
"effective defence while retaining almost full user experience. Farbling is a"
" comprehensive collection of modifications that aim at producing a unique "
"fingerprint on every domain and in every session."
msgstr ""
"Учитывая все это, компания Brave решила усовершенствовать защиту от "
"отпечатков пальцев. Они [предложили](https://brave.com/privacy-updates-3/) "
"новую защиту от отпечатков пальцев, Farbling, утверждая, что (почти) "
"невозможно создать однородный отпечаток пальца без ущерба для "
"пользовательского опыта. Их контрмеры включают рандомизацию значений, "
"основанную на предыдущих исследовательских работах [PriVaricator](https://"
"www.doc.ic.ac.uk/~livshits/papers/pdf/www15.pdf) и [FPRandom](https://"
"hal.inria.fr/hal-01527580/document) Обе работы показали многообещающие "
"результаты, и Brave усовершенствовал этот подход, создав эффективную защиту "
"при сохранении почти полного пользовательского опыта. Farbling - это "
"обширная коллекция модификаций, направленных на создание уникального "
"отпечатка пальца на каждом домене и в каждой сессии."

#: ../content/posts/farbling.md:block 10 (header)
msgid "How does farbling work?"
msgstr "Как работает фарблинг?"

#: ../content/posts/farbling.md:block 11 (paragraph)
msgid ""
"Farbling uses generated session and [eTLD+1](https://web.dev/same-site-same-"
"origin/) keys to deterministically change outputs of certain APIs commonly "
"used for browser fingerprinting. These little lies result in different "
"websites calculating different fingerprints. Moreover, a previously visited "
"website calculates a different fingerprint in a new browsing session."
msgstr ""
"Фарблинг использует сгенерированные сессионные ключи и ключи [eTLD+1]"
"(https://web.dev/same-site-same-origin/) для детерминированного изменения "
"результатов работы некоторых API, обычно используемых для отпечатков пальцев "
"браузеров. Эта маленькая ложь приводит к тому, что разные сайты вычисляют "
"разные отпечатки пальцев. Более того, ранее посещенный сайт вычисляет другой "
"отпечаток в новой сессии просмотра."

#: ../content/posts/farbling.md:block 12 (paragraph)
msgid ""
"Farbling implementation is publicly available on Github "
"[issue](https://github.com/brave/brave-browser/issues/8787) with discussions"
" on design decisions, future plans and possible changes in a separate "
"[issue](https://github.com/brave/brave-browser/issues/11770)."
msgstr ""
"Реализация Farbling находится в открытом доступе на Github [issue](https://"
"github.com/brave/brave-browser/issues/8787) с обсуждением проектных решений, "
"планов на будущее и возможных изменений в отдельном [issue](https://"
"github.com/brave/brave-browser/issues/11770)."

#: ../content/posts/farbling.md:block 13 (paragraph)
msgid "Farbling operates on three levels:"
msgstr "Фарблинг действует на трех уровнях:"

#: ../content/posts/farbling.md:block 14 (ordered list)
msgid "**Off** - countermeasures are not active"
msgstr "**Выкл** - контрмеры не активны"

#: ../content/posts/farbling.md:block 14 (ordered list)
msgid ""
"**Balanced** - various APIs have modified values based on domain/session "
"keys"
msgstr ""
"**Сбалансированный** - в различных API изменены значения, основанные на "
"ключах домена/сеанса"

#: ../content/posts/farbling.md:block 14 (ordered list)
msgid ""
"**Maximum** - various APIs values replaced by randomised values based on "
"domain/session keys"
msgstr ""
"**Максимум** - различные значения API заменены на случайные значения, "
"основанные на ключах домена/сеанса"

#: ../content/posts/farbling.md:block 15 (paragraph)
msgid "Now, what changes did actually Brave implement to specific APIs?"
msgstr "Итак, какие изменения в конкретных API были внесены в Brave?"

#: ../content/posts/farbling.md:block 16 (header)
#, fuzzy
msgid "Canvas"
msgstr "Canvas"

#: ../content/posts/farbling.md:block 17 (paragraph)
msgid ""
"Canvas modifications are tracked in a separate "
"[issue](https://github.com/brave/brave-browser/issues/9186). Both *balanced*"
" and *maximum* approach modify API calls "
"`CanvasRendering2dContext.getImageData`, `HTMLCanvasElement.toDataURL`, "
"`HTMLCanvasElement.toBlob`, and `OffscreenCanvas.convertToBlob`. A [Filter "
"function](https://github.com/brave/brave-"
"core/blob/master/chromium_src/third_party/blink/renderer/core/execution_context/execution_context.cc)"
" changes values of certain pixels chosen based on session/domain keys, "
"resulting in a unique canvas fingerprint. On *maximum* level, methods "
"`CanvasRenderingContext2D.isPointInPath` and "
"`CanvasRenderingContext2D.isPointInStroke` always return *false*."
msgstr ""
"Модификации холста отслеживаются в отдельном [issue](https://github.com/"
"brave/brave-browser/issues/9186). Как *сбалансированный*, так и "
"*максимальный* подход модифицируют вызовы API "
"`CanvasRendering2dContext.getImageData`, `HTMLCanvasElement.toDataURL`, "
"`HTMLCanvasElement.toBlob`, и `OffscreenCanvas.convertToBlob`. Функция "
"[Filter function](https://github.com/brave/brave-core/blob/master/"
"chromium_src/third_party/blink/renderer/core/execution_context/"
"execution_context.cc) изменяет значения определенных пикселей, выбранных на "
"основе ключей сессии/домена, в результате чего создается уникальный "
"отпечаток холста. На *максимальном* уровне методы "
"`CanvasRenderingContext2D.isPointInPath` и "
"`CanvasRenderingContext2D.isPointInStroke` всегда возвращают *false*."

#: ../content/posts/farbling.md:block 18 (header)
#, fuzzy
msgid "WebGL"
msgstr "WebGL"

#: ../content/posts/farbling.md:block 19 (paragraph)
msgid ""
"Modifications for both WebGL and WebGL2 are described in issues "
"[webgl](https://github.com/brave/brave-browser/issues/9188) , "
"[webgl2](https://github.com/brave/brave-browser/issues/9189). On *balanced* "
"level `WebGLRenderingContext.getParameter` and other methods return slightly"
" modified values. `WebGLRenderingContext.readPixels` is modified similarly "
"to canvas methods. On *maximum* level, `WebGLRenderingContext.getParameter` "
"returns random strings for unmasked vendor and renderer, bottom values for "
"other arguments. Other modified calls return bottom values. All "
"modifications can be found in the issues mentioned above or directly in the "
"[code](https://github.com/brave/brave-"
"core/tree/master/chromium_src/third_party/blink/renderer/modules/webgl)."
msgstr ""
"Модификации для WebGL и WebGL2 описаны в выпусках [webgl](https://github.com/"
"brave/brave-browser/issues/9188) , [webgl2](https://github.com/brave/"
"brave-browser/issues/9189). На *сбалансированном* уровне "
"`WebGLRenderingContext.getParameter` и другие методы возвращают слегка "
"измененные значения. `WebGLRenderingContext.readPixels` модифицируется "
"аналогично методам canvas. На *максимальном* уровне "
"`WebGLRenderingContext.getParameter` возвращает случайные строки для "
"немаскированных вендора и рендерера, нижние значения для остальных "
"аргументов. Другие модифицированные вызовы возвращают нижние значения. Все "
"модификации можно найти в упомянутых выше выпусках или непосредственно в "
"[коде](https://github.com/brave/brave-core/tree/master/chromium_src/"
"third_party/blink/renderer/modules/webgl)."

#: ../content/posts/farbling.md:block 20 (header)
msgid "Web Audio"
msgstr "Веб-аудио"

#: ../content/posts/farbling.md:block 21 (paragraph)
msgid ""
"The [issue](https://github.com/brave/brave-browser/issues/9187) modifies "
"several endpoints of `AnalyserNode` and `AudioBuffer` APIs used for audio "
"data handling are modified. On the *balanced* level, the amplitude of "
"returned audio data is slightly changed based on the domain key. However, "
"data are replaced by white noise generated from domain hash on the maximum "
"level, so there is no relation with original data."
msgstr ""
"В [issue](https://github.com/brave/brave-browser/issues/9187) изменены "
"несколько конечных точек API `AnalyserNode` и `AudioBuffer`, используемых "
"для обработки аудиоданных. На *сбалансированном* уровне амплитуда "
"возвращаемых аудиоданных слегка изменяется в зависимости от ключа домена. "
"Однако на максимальном уровне данные заменяются белым шумом, сгенерированным "
"из хэша домена, поэтому связи с исходными данными нет."

#: ../content/posts/farbling.md:block 22 (header)
msgid "Plugins"
msgstr "Плагины"

#: ../content/posts/farbling.md:block 23 (paragraph)
msgid ""
"Currently, `navigator.plugins` and `navigator.mimeTypes` are modified on "
"*balanced* level to return an array with altered plugins and two fake "
"plugins. On *maximum* level, the returned array contains only two fake "
"plugins. See [issue1](https://github.com/brave/brave-browser/issues/9435) "
"and [issue2](https://github.com/brave/brave-browser/issues/10597) for more "
"details."
msgstr ""
"В настоящее время `navigator.plugins` и `navigator.mimeTypes` модифицированы "
"на *сбалансированном* уровне, чтобы возвращать массив с измененными "
"плагинами и двумя фальшивыми плагинами. На *максимальном* уровне "
"возвращаемый массив содержит только два фальшивых плагина. Подробнее см. в "
"[issue1](https://github.com/brave/brave-browser/issues/9435) и [issue2]"
"(https://github.com/brave/brave-browser/issues/10597)."

#: ../content/posts/farbling.md:block 24 (header)
msgid "User agent"
msgstr "Пользовательский агент"

#: ../content/posts/farbling.md:block 25 (paragraph)
msgid ""
"Brave employs the default Chrome UA and the newest OS version as the user "
"agent string. Also, a random number of blank spaces (up to 5) appended to "
"the end of the user agent string. For more details, see the [GitHub "
"issue](https://github.com/brave/brave-browser/issues/9190)."
msgstr ""
"В качестве строки агента пользователя Brave использует UA Chrome по "
"умолчанию и новейшую версию ОС. Кроме того, в конец строки агента "
"пользователя добавляется случайное количество пробелов (до 5). Более "
"подробную информацию можно найти в [GitHub issue](https://github.com/brave/"
"brave-browser/issues/9190)."

#: ../content/posts/farbling.md:block 26 (header)
#, fuzzy
msgid "EnumerateDevices"
msgstr "EnumerateDevices"

#: ../content/posts/farbling.md:block 27 (paragraph)
msgid ""
"This API is used to list I/O media devices like microphone or speakers. When"
" fingerprinting protection is active, Brave returns a shuffled list of "
"devices. For more details, see [issue1](https://github.com/brave/brave-"
"browser/issues/11271) and [issue2](https://github.com/brave/brave-"
"browser/issues/8666)."
msgstr ""
"Этот API используется для получения списка мультимедийных устройств ввода/"
"вывода, таких как микрофон или динамики. Если защита от отпечатков пальцев "
"активна, Brave возвращает перемешанный список устройств. Для получения более "
"подробной информации смотрите [issue1](https://github.com/brave/"
"brave-browser/issues/11271) и [issue2](https://github.com/brave/"
"brave-browser/issues/8666)."

#: ../content/posts/farbling.md:block 28 (header)
#, fuzzy
msgid "HardwareConcurrency"
msgstr "HardwareConcurrency"

#: ../content/posts/farbling.md:block 29 (paragraph)
msgid ""
"The number of logical processors returned by this interface is modified as "
"follows -- on *balanced* level, a valid value between 2 and the true value, "
"on *maximum* level, a valid value between 2 and 8. See the [GitHub "
"issue](https://github.com/brave/brave-browser/issues/10808) for more "
"details."
msgstr ""
"Количество логических процессоров, возвращаемое этим интерфейсом, изменяется "
"следующим образом - на уровне *balanced* допустимое значение между 2 и "
"истинным значением, на уровне *maximum* допустимое значение между 2 и 8. "
"Более подробную информацию см. в [GitHub issue](https://github.com/brave/"
"brave-browser/issues/10808)."

#: ../content/posts/farbling.md:block 30 (header)
msgid "Porting Farbling to JShelter"
msgstr "Перенос Farbling на JShelter"

#: ../content/posts/farbling.md:block 31 (paragraph)
msgid ""
"Our goal was to extend JShelter anti-fingerprinting protections with similar"
" measures to those available in Brave's Farbling. We decided to implement "
"Brave Farbling with minor tweaks. As Brave is an open-source project based "
"on [Chromium](https://www.chromium.org/Home), core changes are available in "
"the public [repository](https://github.com/brave/brave-core). Furthermore, "
"as Brave is licensed under [MPL 2.0](https://www.mozilla.org/en-US/MPL/2.0/)"
" license, its countermeasures can be ported to JShelter. Similarly to Brave,"
" JShelter utilises session and domain hashes (currently, we use a different "
"domain hash based on origin, however, we consider switching to the eTLD+1 "
"approach used by Brave). Nevertheless, we ported only those changes that an "
"extension can reasonably apply. So we do not plan to change system fonts as "
"the true set of fonts can leak in several ways (e.g., CSS, canvas). We will "
"keep a close eye on anti-fingerprining techniquest applied by Brave in the "
"future."
msgstr ""
"Нашей целью было расширить защиту JShelter от отпечатков пальцев с помощью "
"мер, аналогичных тем, что доступны в Brave's Farbling. Мы решили реализовать "
"Brave Farbling с небольшими изменениями. Поскольку Brave - это проект с "
"открытым исходным кодом, основанный на [Chromium](https://www.chromium.org/"
"Home), основные изменения доступны в публичном [репозитории](https://"
"github.com/brave/brave-core). Более того, поскольку Brave лицензирован под "
"лицензией [MPL 2.0](https://www.mozilla.org/en-US/MPL/2.0/), его контрмеры "
"могут быть перенесены на JShelter. Как и Brave, JShelter использует хэши "
"сессий и доменов (в настоящее время мы используем разные хэши доменов в "
"зависимости от происхождения, однако мы рассматриваем возможность перехода "
"на подход eTLD+1, используемый Brave). Тем не менее, мы перенесли только те "
"изменения, которые расширение может разумно применить. Так, мы не планируем "
"менять системные шрифты, поскольку истинный набор шрифтов может утечь "
"несколькими способами (например, через CSS, canvas). Мы будем внимательно "
"следить за техникой борьбы с отпечатками пальцев, применяемой Brave в "
"будущем."

#: ../content/posts/farbling.md:block 32 (paragraph)
msgid ""
"Former JShelter defences were left as an option so user can choose which "
"protection they want. For example, for **Canvas API**, JShelter retains the "
"old defence that returns a white image, but it is also possible to use "
"Farbling and slightly modify the image."
msgstr ""
"Прежние защиты JShelter были оставлены в качестве опции, чтобы пользователь "
"мог выбрать, какая защита ему нужна. Например, для **Canvas API** JShelter "
"сохраняет старую защиту, которая возвращает белое изображение, но также "
"можно использовать Farbling и немного изменить изображение."

#: ../content/posts/farbling.md:block 33 (paragraph)
msgid ""
"`CanvasRenderingContext2D.isPointInPath` and "
"`CanvasRenderingContext2D.isPointInStroke` are modified to return *false* "
"with 5% probability, returning *false* to every call seems to be easily "
"identifiable and it limits the usablity of the calls."
msgstr ""
"`CanvasRenderingContext2D.isPointInPath` и "
"`CanvasRenderingContext2D.isPointInStroke` модифицированы так, чтобы "
"возвращать *false* с вероятностью 5%, возврат *false* в каждом вызове "
"кажется легко идентифицируемым, и это ограничивает удобство использования "
"вызовов."

#: ../content/posts/farbling.md:block 34 (paragraph)
msgid ""
"**WebGL**, **Web audio**, **plugins**, **hardwareConcurrency** and "
"**deviceMemory** have been changed accordingly to Brave. API "
"**enumerateDevices** has the same functionality as in Brave. In addition, we"
" add fake devices to the list. **User agent** wasn't modified because it can"
" cause compatibility issues as we support multiple browsers. Adding empty "
"spaces at the end of UAS seems to be quite a weak countermeasure. We will "
"continue to watch changes in the user agent and may implement some defence "
"in future, although it looks like a [better "
"solution](https://datatracker.ietf.org/doc/html/rfc8942) is on the way."
msgstr ""
"**WebGL**, **Web audio**, **plugins**, **hardwareConcurrency** и "
"**deviceMemory** были изменены в соответствии с Brave. API "
"**enumerateDevices** имеет ту же функциональность, что и в Brave. Кроме "
"того, мы добавили в список поддельные устройства. **User agent** не был "
"изменен, так как это может вызвать проблемы с совместимостью, поскольку мы "
"поддерживаем несколько браузеров. Добавление пустых пробелов в конце UAS "
"кажется довольно слабой контрмерой. Мы продолжим следить за изменениями в "
"пользовательском агенте и, возможно, в будущем внедрим какую-нибудь защиту, "
"хотя, похоже, что [лучшее решение](https://datatracker.ietf.org/doc/html/"
"rfc8942) уже на подходе."

#: ../content/posts/farbling.md:block 35 (paragraph)
msgid ""
"JShelter 0.5 changes the default level -- **level 2** to apply the farbling-"
"based defence for all covered APIs, and it will be very similar to the "
"*balanced* level of *Brave*. **Level 3** is redesigned to partly apply new "
"and partly old countermeasures to provide as little information as possible."
" Please report websites that does not work correctly with Farbling."
msgstr ""
"В JShelter 0.5 изменен уровень по умолчанию -- **уровень 2**, на котором "
"будет применяться защита на основе фарблинга для всех покрываемых API, и он "
"будет очень похож на *сбалансированный* уровень в *Brave*. **Уровень 3** "
"переделан таким образом, чтобы частично применять новые, а частично старые "
"контрмеры, чтобы предоставить как можно меньше информации. Пожалуйста, "
"сообщайте о сайтах, которые некорректно работают с Farbling."

#: ../content/posts/farbling.md:block 36 (paragraph)
msgid ""
"During the examination of the ported code, we [identified and "
"reported](https://github.com/brave/brave-browser/issues/15882) an issue in "
"the original Brave implementation. The issue was acknowledged and fixed by "
"Brave. This is the beauty of the free software: several projects can benefit"
" from the same code-base and mutualy improve the quality."
msgstr ""
"Во время изучения портированного кода мы [выявили и сообщили](https://"
"github.com/brave/brave-browser/issues/15882) о проблеме в оригинальной "
"реализации Brave. Проблема была признана и исправлена Brave. В этом и "
"заключается прелесть свободного программного обеспечения: несколько проектов "
"могут извлекать пользу из одной и той же кодовой базы и взаимно улучшать "
"качество."

#: ../content/posts/farbling.md:block 38 (paragraph)
msgid ""
"Farbling-based wrappers produce very similar outputs to Brave. So with "
"JShelter, Farbling-like capabilities are available in multiple browsers. "
"Nevertheless, keep in mind that the best anti-fingerprinting techniques are "
"still a research question, fingerprinting techniques are deployed for "
"security reasons (and farbling-like anti-fingerprinting masking may "
"complicate some log in processes), so it is not completely clear what "
"defences are the best and the choice of the defences also depends on "
"specific use cases. We will investigate fingerprinting scripts further "
"during the future work on this project."
msgstr ""
"Обертки на основе Farbling дают результаты, очень похожие на Brave. Таким "
"образом, с JShelter возможности, подобные Farbling, доступны в нескольких "
"браузерах. Тем не менее, не забывайте, что лучшие методы борьбы с "
"отпечатками пальцев все еще являются вопросом исследования, методы борьбы с "
"отпечатками пальцев применяются в целях безопасности (а маскировка "
"отпечатков пальцев, подобная Farbling, может усложнить некоторые процессы "
"входа в систему), поэтому не совсем ясно, какие средства защиты являются "
"лучшими, и выбор средств защиты также зависит от конкретных случаев "
"использования. Мы будем изучать скрипты отпечатков пальцев и дальше в ходе "
"дальнейшей работы над этим проектом."

#: ../content/posts/fingerprinting.md:block 1 (header)
msgid ""
"title: Browser fingerprinting and JShelter\n"
"date: 2022-01-14 13:00\n"
"modified: 2023-04-14 14:00\n"
"Series: Browser fingerprinting\n"
"series_index: 1"
msgstr ""
"Название: Отпечатки пальцев браузеров и JShelter\n"
"дата: 2022-01-14 13:00\n"
"изменено: 2023-04-14 14:00\n"
"Серия: Отпечатки пальцев браузера\n"
"series_index: 1"

#: ../content/posts/fingerprinting.md:block 2 (paragraph)
msgid ""
"This post introduces [browser "
"fingerprinting](https://arxiv.org/pdf/1905.01051.pdf) and anti-"
"fingerprinting mechanisms. We explain what JShelter implements and the "
"strengths and downsides of the anti-fingerprinting mechanisms."
msgstr ""
"В этой заметке рассказывается о механизмах [отпечатков пальцев браузера] "
"(https://arxiv.org/pdf/1905.01051.pdf) и анти-отпечатков пальцев. Мы "
"объясняем, что реализует JShelter, а также сильные и слабые стороны "
"механизмов защиты от отпечатков пальцев."

#: ../content/posts/fingerprinting.md:block 3 (paragraph)
msgid ""
"In short, browser fingerprinting is a stateless tracking method vastly "
"prevalent on the web in recent years. Similarly to a human *fingerprint*, "
"browser fingerprinting tries to find a set of features that make (almost) "
"every fingerprint unique and the browser uniquely identifiable."
msgstr ""
"Вкратце, отпечатки пальцев браузеров - это метод отслеживания без "
"статистики, получивший широкое распространение в Интернете в последние годы. "
"Подобно отпечаткам пальцев человека, браузерная дактилоскопия пытается найти "
"набор характеристик, которые делают (почти) каждый отпечаток уникальным, а "
"браузер - однозначно идентифицируемым."

#: ../content/posts/fingerprinting.md:block 4 (paragraph)
msgid ""
"The fingerprinting features contain various sources, mostly accessible "
"through browser application interfaces, APIs. The APIs provide essential "
"functionality for modern websites; however, they leak sensitive information "
"about the browser, operating system, or device itself. Many different "
"devices are connected to the internet — most of them with a very specific "
"configuration. Leaking hardware and software properties may result in a "
"sufficiently identifiable browser fingerprint. Furthermore, do not forget "
"about the possibility of leaking information that may uncover "
"vulnerabilities of your system for the sake of potential attackers."
msgstr ""
"Функции дактилоскопии содержат различные источники, доступные в основном "
"через интерфейсы приложений браузеров - API. API обеспечивают необходимую "
"функциональность для современных веб-сайтов, но при этом они передают "
"конфиденциальную информацию о браузере, операционной системе или самом "
"устройстве. К интернету подключено множество различных устройств, "
"большинство из которых имеют весьма специфическую конфигурацию. Утечка "
"информации об аппаратном и программном обеспечении может привести к тому, "
"что отпечаток браузера можно будет достаточно точно идентифицировать. Кроме "
"того, не стоит забывать о возможности утечки информации, которая может "
"раскрыть уязвимости вашей системы в интересах потенциальных злоумышленников."

#: ../content/posts/fingerprinting.md:block 5 (paragraph)
msgid ""
"At first glance, browser fingerprinting seems to be a great evil in the "
"world full of privacy concerns. However, we should be aware of two distinct "
"purposes for using browser fingerprinting."
msgstr ""
"На первый взгляд отпечатки браузеров кажутся большим злом в мире, полном "
"проблем с конфиденциальностью. Однако следует помнить о двух различных целях "
"использования отпечатков пальцев в браузере."

#: ../content/posts/fingerprinting.md:block 6 (paragraph)
msgid ""
"Firstly, there is *a negative or destructive use case* during which websites"
" profile cross-domain user activities without user consent. Trackers use the"
" fingerprint as a cross-domain identifier."
msgstr ""
"Во-первых, существует *негативный или деструктивный вариант использования*, "
"при котором веб-сайты профилируют междоменные действия пользователей без их "
"согласия. Отслеживающие устройства используют отпечаток пальца в качестве "
"междоменного идентификатора."

#: ../content/posts/fingerprinting.md:block 7 (paragraph)
msgid ""
"Secondly, there is *a positive or constructive use case*, where websites "
"tend to collect information about your system to improve the usability or "
"security of their application. For example, applications can recommend "
"installing critical security updates based on your system properties. Some "
"websites collect browser fingerprints to verify known devices of their users"
" to prevent fraud. The JShelter.org website offers the download link in the "
"extension store based on the user agent."
msgstr ""
"Во-вторых, существует *положительный или конструктивный вариант "
"использования*, когда веб-сайты собирают информацию о вашей системе, чтобы "
"улучшить удобство использования или безопасность своего приложения. "
"Например, приложения могут рекомендовать установку критических обновлений "
"безопасности на основе свойств вашей системы. Некоторые веб-сайты собирают "
"отпечатки пальцев браузера, чтобы проверить известные устройства своих "
"пользователей для предотвращения мошенничества. Сайт JShelter.org предлагает "
"ссылку на загрузку в магазине расширений на основе агента пользователя."

#: ../content/posts/fingerprinting.md:block 8 (paragraph)
msgid ""
"Many browser vendors have already introduced changes to the cookie policy. "
"Browsers such as Firefox, Safari, and Brave block third-party cookies, often"
" abused for stateful tracking. Chrome developers [recently "
"announced](https://blog.google/products/chrome/updated-timeline-privacy-"
"sandbox-milestones/) that they will jump on the bandwagon too. The counter-"
"measures against stateful tracking techniques result in a substantial "
"increase in the usage of browser fingerprinting."
msgstr ""
"Многие производители браузеров уже внесли изменения в политику использования "
"файлов cookie. Такие браузеры, как Firefox, Safari и Brave, блокируют "
"сторонние файлы cookie, которыми часто злоупотребляют для отслеживания "
"состояния. Разработчики Chrome [недавно объявили](https://blog.google/"
"products/chrome/updated-timeline-privacy-sandbox-milestones/), что они тоже "
"присоединятся к этой инициативе. Меры противодействия техникам "
"государственного отслеживания приводят к значительному росту использования "
"отпечатков пальцев в браузерах."

#: ../content/posts/fingerprinting.md:block 9 (header)
msgid "Counter-measures to browser fingerprinting"
msgstr "Меры борьбы с \"отпечатками пальцев\" браузеров"

#: ../content/posts/fingerprinting.md:block 10 (paragraph)
msgid ""
"Unlike cookies, browser fingerprinting does not require storing an "
"identifier on the device. Instead, the identifier is recomputed with each "
"visited page. Once the fingerprint is obtained, it can be sent to a tracking"
" server in a subsequent request. Moreover, the whole process of fingerprint "
"extraction is invisible to a user. There are many sources of potentially "
"identifiable information from which a fingerprint can be constructed. A "
"fingerprint is considered *passive* when it contains natively accessible "
"information from HTTP headers or network traffic. On the other hand, "
"*active* fingerprint runs JavaScript code to retrieve data from browser "
"APIs. JShelter focuses on detecting and preventing active fingerprinting."
msgstr ""
"В отличие от файлов cookie, отпечатки пальцев браузера не требуют хранения "
"идентификатора на устройстве. Вместо этого идентификатор пересчитывается при "
"каждом посещении страницы. После получения отпечатка пальца он может быть "
"отправлен на сервер отслеживания при последующем запросе. Более того, весь "
"процесс извлечения отпечатка пальца незаметен для пользователя. Существует "
"множество источников потенциально идентифицируемой информации, на основе "
"которой может быть построен отпечаток пальца. Отпечаток считается *пассивным*"
", если он содержит информацию, доступную из заголовков HTTP или сетевого "
"трафика. С другой стороны, *активный* отпечаток запускает JavaScript-код для "
"получения данных из API браузера. JShelter фокусируется на обнаружении и "
"предотвращении активного фингерпринтинга."

#: ../content/posts/fingerprinting.md:block 11 (paragraph)
msgid ""
"Nowadays, there are many solutions to mitigate the effects of browser "
"fingerprinting to improve internet privacy."
msgstr ""
"В настоящее время существует множество решений, позволяющих смягчить "
"последствия \"отпечатков пальцев\" браузеров и повысить уровень "
"конфиденциальности в Интернете."

#: ../content/posts/fingerprinting.md:block 12 (paragraph)
msgid ""
"[Modifying the content of fingerprints](/farbling/) is a valid choice to "
"resist a fingerprinting attempt. However, each modification may create an "
"inconsistency that may improve the fingerprintability of the browser. Many "
"protection tools use predefined or real fingerprints instead of the user's "
"one to counter this issue."
msgstr ""
"[Модификация содержимого отпечатков пальцев](/farbling/) - это правильный "
"выбор, чтобы противостоять попыткам отпечатков пальцев. Однако каждая "
"модификация может создать несоответствие, которое может улучшить возможность "
"отпечатка браузера. Многие средства защиты используют предопределенные или "
"реальные отпечатки вместо отпечатков пользователя, чтобы противостоять этой "
"проблеме."

#: ../content/posts/fingerprinting.md:block 13 (paragraph)
msgid ""
"Another approach is to create homogeneous fingerprints. If every fingerprint"
" is the same, there is no way to tell the users behind the browsers apart. "
"The leading representative of this approach is the [Tor "
"browser](https://www.torproject.org/). Level 3 of JShelter aims to create a "
"homogenous fingerprint. Unfortunately, homogeneous fingerprints have an "
"inherent downside of following specific rules to be effective. Most "
"importantly, the effectiveness of the approach depends on the broad coverage"
" of the blocked APIs and the size of the population employing the counter-"
"measures. All browsers with the same fingerprint form an anonymity set. An "
"observer cannot distinguish between browsers in the anonymity set. With "
"every missed fingerprintable attribute, the anonymity set breaks into "
"smaller sets. For example, the Tor browser strongly recommends using a "
"specific window size. Suppose you use a window size different from all other"
" Tor browser users. In that case, a fingerprinter can identify you solely by"
" this attribute. Also, keep in mind that Tor browser hides your IP address, "
"which JShelter does not do. Hence we see Level 3 protections more as leak "
"prevention than an anti-fingerprinting measure. If you like the idea of "
"homogeneous fingerprints, install Tor browser."
msgstr ""
"Другой подход заключается в создании однородных отпечатков пальцев. Если все "
"отпечатки будут одинаковыми, то невозможно будет различить пользователей "
"браузеров. Ведущим представителем этого подхода является браузер [Tor]"
"(https://www.torproject.org/). Уровень 3 JShelter направлен на создание "
"однородных отпечатков пальцев. К сожалению, однородные отпечатки имеют "
"недостаток, связанный с необходимостью следовать определенным правилам, "
"чтобы быть эффективными. Самое главное, что эффективность подхода зависит от "
"широкого охвата блокируемых API и размера группы, использующей контрмеры. "
"Все браузеры с одинаковыми отпечатками пальцев образуют набор анонимности. "
"Наблюдатель не может отличить браузеры из набора анонимности. С каждым "
"пропущенным атрибутом отпечатка пальца набор анонимности разбивается на "
"более мелкие наборы. Например, браузер Tor настоятельно рекомендует "
"использовать определенный размер окна. Предположим, что вы используете "
"размер окна, отличный от всех остальных пользователей браузера Tor. В этом "
"случае специалист по отпечатку пальца сможет идентифицировать вас только по "
"этому атрибуту. Также следует помнить, что браузер Tor скрывает ваш IP-"
"адрес, чего не делает JShelter. Таким образом, мы рассматриваем защиту "
"третьего уровня скорее как предотвращение утечек, чем как меру по борьбе с "
"отпечатками пальцев. Если вам нравится идея однородных отпечатков пальцев, "
"установите браузер Tor."

#: ../content/posts/fingerprinting.md:block 14 (paragraph)
msgid ""
"[Brave browser](https://brave.com/) modifies the readings from APIs misused "
"to create fingerprints. Nevertheless, the goal is to [create a unique "
"fingerprint for each domain and session](/farbling/). As the fingerprint "
"changes for every visited domain, its use for linking cross-domain "
"activities is smaller. JShelter already [implements the farbling protection "
"of Brave](/farbling/) and uses them as the default anti-fingerprinting "
"approach."
msgstr ""
"[Браузер Brave](https://brave.com/) изменяет показания API, неправильно "
"используемых для создания отпечатков пальцев. Тем не менее, цель состоит в "
"том, чтобы [создать уникальный отпечаток для каждого домена и сессии](/"
"farbling/). Поскольку отпечаток меняется для каждого посещенного домена, его "
"использование для связывания междоменных действий меньше. JShelter уже "
"[реализует защиту от отпечатков пальцев Brave](/farbling/) и использует их в "
"качестве подхода по умолчанию для защиты от отпечатков пальцев."

#: ../content/posts/fingerprinting.md:block 15 (paragraph)
msgid ""
"Recently, we added [Fingerprint detector (FPD)](/fpdetection/) to JShelter. "
"FPD does not modify the fingerprint. Instead, FPD monitors APIs that are "
"often misused by fingerprinters. When FPD detects a fingerprinting attempt, "
"it warns the user. You can also allow FPD to block all subsequent "
"transmissions of the page and remove stored data to prevent storing the "
"fingerprint and loading it after a page reload. Hence, FPD allows the page "
"to compute the fingerprint but (if allowed) blocks the page from uploading "
"the fingerprint away from your computer."
msgstr ""
"Недавно мы добавили [Детектор отпечатков пальцев (FPD)](/fpdetection/) в "
"JShelter. FPD не изменяет отпечаток пальца. Вместо этого FPD отслеживает "
"API, которые часто используются злоумышленниками. Когда FPD обнаруживает "
"попытку отпечатка пальца, он предупреждает пользователя. Вы также можете "
"разрешить FPD блокировать все последующие передачи страницы и удалять "
"сохраненные данные, чтобы предотвратить сохранение отпечатка и его загрузку "
"после перезагрузки страницы. Таким образом, FPD позволяет странице вычислить "
"отпечаток пальца, но (если это разрешено) блокирует загрузку отпечатка "
"пальца с вашего компьютера."

#: ../content/posts/fingerprinting.md:block 16 (paragraph)
msgid ""
"Other approaches include blocking JavaScript code from suspicious sources or"
" decreasing the surface of browser APIs with explicit permission control. "
"Extensions like [NoScript Suite](https://noscript.net/) are perfect "
"complementary measures to JShelter."
msgstr ""
"Другие подходы включают блокировку JavaScript-кода из подозрительных "
"источников или уменьшение поверхности API-интерфейсов браузера с явным "
"контролем разрешений. Такие расширения, как [NoScript Suite](https://"
"noscript.net/), являются прекрасным дополнением к JShelter."

#: ../content/posts/fingerprinting.md:block 17 (paragraph)
msgid ""
"Despite all the efforts, there is no ultimate approach that can prevent "
"fingerprinting while keeping a high level of usability in mind. Every "
"approach has its strengths and weaknesses, so the challenge is to find a "
"balance between privacy and usability."
msgstr ""
"Несмотря на все усилия, не существует окончательного подхода, который "
"позволил бы предотвратить отпечатки пальцев и при этом сохранить высокий "
"уровень удобства использования. У каждого подхода есть свои сильные и слабые "
"стороны, поэтому задача состоит в том, чтобы найти баланс между "
"конфиденциальностью и удобством использования."

#: ../content/posts/fpdetection.md:block 1 (header)
msgid ""
"title: Catch websites red-handed fingerprinting your browser\n"
"date: 2022-01-14 14:00\n"
"Series: Browser fingerprinting"
msgstr ""
"Название: Ловите сайты с поличным, снимая отпечатки пальцев с вашего "
"браузера\n"
"дата: 2022-01-14 14:00\n"
"Серия: Отпечатки пальцев браузера"

#: ../content/posts/fpdetection.md:block 2 (paragraph)
msgid ""
"We want to identify [fingerprinting](/fingerprinting/) attempts by counting "
"the number of different APIs employed by a page, especially those not "
"frequently used for benign purposes. This blog post introduces a new "
"fingerprinting protection mechanism - FingerPrint Detector (FPD) available "
"in JShelter 0.6. This tool allows users to gain more control over browser "
"fingerprinting, which has become an invisible threat to our privacy."
msgstr ""
"Мы хотим выявить попытки [fingerprinting](/fingerprinting/) путем подсчета "
"количества различных API, используемых страницей, особенно тех, которые не "
"часто используются в доброкачественных целях. В этой записи блога "
"представлен новый механизм защиты от фингерпринтинга - FingerPrint Detector "
"(FPD), доступный в JShelter 0.6. Этот инструмент позволяет пользователям "
"получить больше контроля над отпечатками браузера, которые стали невидимой "
"угрозой для нашей конфиденциальности."

#: ../content/posts/fpdetection.md:block 3 (header)
msgid "Heuristics as a template for the fingerprinting detection"
msgstr "Эвристика как шаблон для обнаружения отпечатков пальцев"

#: ../content/posts/fpdetection.md:block 4 (paragraph)
msgid ""
"[Mitigation of browser fingerprinting is not "
"straightforward](/fingerprinting/). FPD does not attempt to prevent a script"
" from taking a fingerprint. Neither does FPD falsify a fingerprint. Instead,"
" FPD monitors the APIs that a web page accesses and detects suspicious "
"activities. FPD quickly reacts in case of fingerprint extraction and blocks "
"further web page communication, including storing information."
msgstr ""
"[Устранение отпечатков пальцев браузера не является простым] (/"
"fingerprinting/). FPD не пытается помешать скрипту снять отпечаток пальца. "
"FPD также не подделывает отпечатки пальцев. Вместо этого FPD отслеживает "
"API, к которым обращается веб-страница, и обнаруживает подозрительные "
"действия. FPD быстро реагирует в случае извлечения отпечатка пальца и "
"блокирует дальнейшее взаимодействие с веб-страницей, включая хранение "
"информации."

#: ../content/posts/fpdetection.md:block 5 (paragraph)
msgid ""
"Several studies over the last decade detected fingerprinting attempts. Many "
"of them used a simple heuristic approach to create a set of conditions. If "
"these conditions are met, suspicious activity is detected. Studies like [The"
" Web Never "
"Forgets](https://securehomes.esat.kuleuven.be/~gacar/persistent/the_web_never_forgets.pdf)"
" and [A 1-million-site Measurement and "
"Analysis](https://www.cs.princeton.edu/~arvindn/publications/OpenWPM_1_million_site_tracking_measurement.pdf)"
" used this approach to measure the real-world occurrence of web tracking. At"
" the same time, they verified the usability of heuristic-based detection. "
"They found the detection effective with a very low false-positive rate. The "
"most challenging part of this approach is a careful selection of detection "
"conditions. Later, studies began to experiment with more sophisticated "
"methods. For example, [Fingerprinting the "
"Fingerprinters](https://web.cs.ucdavis.edu/~zubair/files/fpinspector-"
"sp2021.pdf) used machine learning for fingerprinting detection. They managed"
" to achieve even better precision, but at the cost of demanding model "
"training."
msgstr ""
"В нескольких исследованиях, проведенных в последнее десятилетие, были "
"обнаружены попытки снятия отпечатков пальцев. Во многих из них использовался "
"простой эвристический подход для создания набора условий. Если эти условия "
"выполняются, обнаруживается подозрительная активность. Такие исследования, "
"как [The Web Never Forgets] (https://securehomes.esat.kuleuven.be/~gacar/"
"persistent/the_web_never_forgets.pdf) и "
"[A 1-million-site Measurement and Analysis] (https://www.cs.princeton.edu/~"
"arvindn/publications/OpenWPM_1_million_site_tracking_measurement.pdf), "
"использовали этот подход для измерения реальной распространенности веб-"
"слежки. В то же время они проверили удобство обнаружения на основе "
"эвристики. Обнаружение оказалось эффективным с очень низким уровнем ложных "
"срабатываний. Наиболее сложной частью этого подхода является тщательный "
"выбор условий обнаружения. Позже в исследованиях начали экспериментировать с "
"более сложными методами. Например, в работе "
"[Fingerprinting the Fingerprinters] (https://web.cs.ucdavis.edu/~zubair/"
"files/fpinspector-sp2021.pdf) для обнаружения отпечатков пальцев "
"использовалось машинное обучение. Им удалось добиться еще большей точности, "
"но ценой больших затрат на обучение модели."

#: ../content/posts/fpdetection.md:block 6 (paragraph)
msgid ""
"For JShelter, we settled down on using a simple heuristic approach, but with"
" a little twist to it. Internet technology is constantly changing, so we "
"want to make our heuristics as flexible as possible. Instead of hard-coding "
"them, we propose a declarative way to describe the heuristics. This concept "
"allows us to make changes with a new release and progressively [adapt to the"
" latest changes in the field](/crawling_results/). For this purpose, we "
"defined JSON configuration files, which contain all the information required"
" for fingerprinting detection. As these files make an input for our "
"evaluation/detection logic, their content directly reflects how JShelter "
"should evaluate websites in terms of fingerprinting."
msgstr ""
"Для JShelter мы остановились на использовании простого эвристического "
"подхода, но с небольшой изюминкой. Интернет-технологии постоянно меняются, "
"поэтому мы хотим сделать наши эвристики как можно более гибкими. Вместо того "
"чтобы жестко кодировать их, мы предлагаем декларативный способ описания "
"эвристик. Эта концепция позволяет нам вносить изменения с выходом нового "
"релиза и постепенно [адаптироваться к последним изменениям в этой области](/"
"crawling_results/). Для этого мы определили конфигурационные файлы JSON, "
"которые содержат всю информацию, необходимую для обнаружения отпечатков "
"пальцев. Поскольку эти файлы являются входными данными для нашей логики "
"оценки/обнаружения, их содержимое напрямую отражает то, как JShelter должен "
"оценивать веб-сайты с точки зрения фингерпринтинга."

#: ../content/posts/fpdetection.md:block 7 (paragraph)
msgid ""
"On closer inspection, the configuration files contain two basic types of "
"entries. Firstly, they define JavaScript endpoints, which are relevant for "
"fingerprinting detection. Secondly, they group related endpoints. For "
"example, we group endpoints according to their semantic properties. Imagine "
"that there are two different endpoints. Both provide hardware information "
"about the device. We can assign both endpoints to a group that covers access"
" to hardware properties in this scenario. The configuration allows "
"clustering groups to other groups and creating a hierarchy of groups. "
"Ultimately, the configuration is a tree-like structure whose evaluation can "
"detect browser fingerprinting."
msgstr ""
"При ближайшем рассмотрении конфигурационные файлы содержат два основных типа "
"записей. Во-первых, они определяют конечные точки JavaScript, которые важны "
"для обнаружения отпечатков пальцев. Во-вторых, они группируют связанные "
"конечные точки. Например, мы группируем конечные точки в соответствии с их "
"семантическими свойствами. Представьте, что есть две разные конечные точки. "
"Обе предоставляют информацию об аппаратном обеспечении устройства. В этом "
"случае мы можем отнести обе конечные точки к группе, которая охватывает "
"доступ к свойствам оборудования. Конфигурация позволяет группировать группы "
"с другими группами и создавать иерархию групп. В конечном итоге конфигурация "
"представляет собой древовидную структуру, оценка которой позволяет "
"обнаружить \"отпечатки пальцев\" браузера."

#: ../content/posts/fpdetection.md:block 8 (paragraph)
msgid ""
"The whole evaluation process dynamically observes the API calls performed by"
" a web page. Note that we analyse the calls themselves. Hence, the dynamic "
"analysis overcomes any obfuscation of fingerprinting scripts."
msgstr ""
"Весь процесс оценки динамически наблюдает за вызовами API, выполняемыми веб-"
"страницей. Обратите внимание, что мы анализируем сами вызовы. Таким образом, "
"динамический анализ преодолевает любую обфускацию скриптов отпечатков "
"пальцев."

#: ../content/posts/fpdetection.md:block 9 (paragraph)
msgid ""
"The current heuristics are based on many prior studies, [our own "
"crawl](/crawling_results/), and available tools focused on browser "
"fingerprinting."
msgstr ""
"Текущие эвристики основаны на множестве предыдущих исследований, "
"[нашем собственном ползунке](/crawling_results/) и доступных инструментах, "
"ориентированных на отпечатки браузеров."

#: ../content/posts/fpdetection.md:block 10 (unordered list)
msgid "We extracted and modified detection rules from studies like:"
msgstr ""
"Мы извлекли и модифицировали правила обнаружения из таких исследований, как:"

#: ../content/posts/fpdetection.md:block 10 (unordered list)
msgid ""
"[Fingerprinting the "
"Fingerprinters](https://web.cs.ucdavis.edu/~zubair/files/fpinspector-"
"sp2021.pdf)"
msgstr ""
"[Отпечатки пальцев](https://web.cs.ucdavis.edu/~zubair/files/fpinspector-"
"sp2021.pdf)"

#: ../content/posts/fpdetection.md:block 10 (unordered list)
msgid ""
"[A 1-million-site Measurement and "
"Analysis](https://www.cs.princeton.edu/~arvindn/publications/OpenWPM_1_million_site_tracking_measurement.pdf)"
msgstr ""
"[Измерение и анализ 1 миллиона сайтов](https://www.cs.princeton.edu/~arvindn/"
"publications/OpenWPM_1_million_site_tracking_measurement.pdf)"

#: ../content/posts/fpdetection.md:block 10 (unordered list)
msgid ""
"[The Web Never "
"Forgets](https://securehomes.esat.kuleuven.be/~gacar/persistent/the_web_never_forgets.pdf)"
msgstr ""
"[[Веб никогда не забывает](https://securehomes.esat.kuleuven.be/~gacar/"
"persistent/the_web_never_forgets.pdf)"

#: ../content/posts/fpdetection.md:block 10 (unordered list)
msgid "We reflected traits of known fingerprinting tools like:"
msgstr "Мы отразили черты известных инструментов дактилоскопии, таких как:"

#: ../content/posts/fpdetection.md:block 10 (unordered list)
#, fuzzy
msgid "[FingerprintJS](https://github.com/fingerprintjs)"
msgstr "[FingerprintJS](https://github.com/fingerprintjs)"

#: ../content/posts/fpdetection.md:block 10 (unordered list)
msgid "[Am I Unique](https://amiunique.org/)"
msgstr "[Я уникален](https://amiunique.org/)"

#: ../content/posts/fpdetection.md:block 10 (unordered list)
msgid "[Cover Your Tracks](https://coveryourtracks.eff.org/)"
msgstr "[Прикрой свои следы](https://coveryourtracks.eff.org/)"

#: ../content/posts/fpdetection.md:block 10 (unordered list)
msgid "We utilized knowledge of existing detection tools like:"
msgstr "Мы использовали знания о существующих средствах обнаружения, таких как:"

#: ../content/posts/fpdetection.md:block 10 (unordered list)
msgid ""
"[A Fingerprinting Monitor For Chrome "
"(FPMON)](https://fpmon.github.io/fingerprinting-monitor/)"
msgstr ""
"[ Монитор отпечатков пальцев для Chrome (FPMON)](https://fpmon.github.io/"
"fingerprinting-monitor/)"

#: ../content/posts/fpdetection.md:block 10 (unordered list)
msgid "[Don't FingerPrint Me (DFPM)](https://github.com/freethenation/DFPM)"
msgstr ""
"[Не ставьте на мне отпечатки пальцев (DFPM)](https://github.com/"
"freethenation/DFPM)"

#: ../content/posts/fpdetection.md:block 11 (header)
msgid "Keep your fingerprint for yourself"
msgstr "Сохраните отпечатки пальцев для себя"

#: ../content/posts/fpdetection.md:block 12 (paragraph)
msgid ""
"FPD works in three basic phases, *monitoring*, *evaluation* and *reactive*."
msgstr "FPD работает в трех основных фазах: *мониторинг*, *оценка* и *реакция*."

#: ../content/posts/fpdetection.md:block 13 (header)
msgid "Monitoring phase"
msgstr "Этап мониторинга"

#: ../content/posts/fpdetection.md:block 14 (paragraph)
msgid ""
"If the FPD module is active, it locally logs all accesses to crucial "
"JavaScript API endpoints during the monitoring phase. FPD injects custom "
"wrapping code of all suspicious APIs (properties or methods) into the "
"browser when a user visits a page. Hence, the extension observes API calls "
"initiated by the website."
msgstr ""
"Если модуль FPD активен, он локально регистрирует все обращения к критически "
"важным конечным точкам JavaScript API на этапе мониторинга. FPD внедряет "
"пользовательский код-обертку всех подозрительных API (свойств или методов) в "
"браузер, когда пользователь посещает страницу. Таким образом, расширение "
"наблюдает за вызовами API, инициированными веб-сайтом."

#: ../content/posts/fpdetection.md:block 15 (paragraph)
msgid ""
"FPD stores the number of accessed calls in the context of a displayed page. "
"It contains all the metadata needed for evaluation. This metadata includes "
"the number of calls for each logged endpoint with a corresponding argument "
"value. Consequently, FPD can tell how often the visited web page called a "
"particular endpoint and the arguments for these calls."
msgstr ""
"FPD хранит количество обращений в контексте отображаемой страницы. Он "
"содержит все метаданные, необходимые для оценки. Эти метаданные включают "
"количество вызовов для каждой зарегистрированной конечной точки с "
"соответствующим значением аргумента. Таким образом, FPD может определить, "
"как часто посещаемая веб-страница вызывала определенную конечную точку и "
"аргументы для этих вызовов."

#: ../content/posts/fpdetection.md:block 16 (header)
msgid "Evaluation phase"
msgstr "Этап оценки"

#: ../content/posts/fpdetection.md:block 17 (paragraph)
msgid ""
"The evaluation phase starts whenever a new HTTP request occurs. FPD counts "
"the fingerprinting score from the observed calls in the past. If the "
"fingerprinting score is above a specified threshold, FPD considers a web "
"page to perform fingerprinting. In this case, FPD warns the user with a "
"notification."
msgstr ""
"Фаза оценки начинается всякий раз, когда появляется новый HTTP-запрос. FPD "
"подсчитывает показатели фингерпринтинга по наблюдаемым в прошлом вызовам. "
"Если показатель fingerprinting score превышает заданный порог, FPD считает, "
"что веб-страница подверглась fingerprinting. В этом случае FPD предупреждает "
"пользователя уведомлением."

#: ../content/posts/fpdetection.md:block 18 (paragraph)
msgid ""
"![Notification example for Chrome (left) and Firefox "
"(right).]({attach}/images/fpdetection/notifications.png)"
msgstr ""
"![Пример уведомления для Chrome (слева) и Firefox (справа).]({attach}/images/"
"fpdetection/notifications.png)"

#: ../content/posts/fpdetection.md:block 19 (header)
msgid "Reactive phase"
msgstr "Реактивная фаза"

#: ../content/posts/fpdetection.md:block 20 (paragraph)
msgid ""
"FPD blocks all subsequent asynchronous HTTP requests initiated by the "
"fingerprinting page in the reaction phase. After that, FPD cleans all "
"supported browser storage mechanisms such as `cookies` and `localStorage`. "
"This measure prevents web pages from caching already extracted fingerprints "
"for later transmission. To be clear, blocking of subsequent requests **may "
"result in breakage** of the visited page. The user can create an exception "
"for the page and add it to a whitelist in this situation. FPD is not active "
"on whitelisted domains for browser fingerprinting. Users can opt in to be "
"fingerprinted on the pages they trust."
msgstr ""
"На этапе реакции FPD блокирует все последующие асинхронные HTTP-запросы, "
"инициированные страницей с отпечатками пальцев. После этого FPD очищает все "
"поддерживаемые браузером механизмы хранения данных, такие как `cookies` и "
"`localStorage`. Эта мера не позволяет веб-страницам кэшировать уже "
"извлеченные отпечатки пальцев для последующей передачи. Для ясности, "
"блокировка последующих запросов **может привести к поломке** посещаемой "
"страницы. В такой ситуации пользователь может создать исключение для "
"страницы и добавить ее в белый список. FPD не активна на доменах из белого "
"списка для отпечатков браузера. Пользователи могут выбрать отпечатки пальцев "
"на страницах, которым они доверяют."

#: ../content/posts/fpdetection.md:block 21 (paragraph)
msgid ""
"For now, we only support whitelisting of the visited domains. However, as "
"fingerprinting is often performed for security reasons and it is more "
"prevalent on login pages, we plan to evaluate if adding a specific behaviour"
" for a URL is a better choice."
msgstr ""
"Пока мы поддерживаем только белые списки посещаемых доменов. Однако, "
"поскольку отпечатки пальцев часто используются в целях безопасности и чаще "
"всего на страницах входа в систему, мы планируем оценить, является ли "
"добавление определенного поведения для URL лучшим выбором."

#: ../content/posts/fpdetection.md:block 22 (header)
msgid "Testing fingerprinting detection in the wild"
msgstr "Тестирование обнаружения отпечатков пальцев в дикой природе"

#: ../content/posts/fpdetection.md:block 23 (paragraph)
msgid ""
"The line between fingerprinting and non-fingerprinting behaviour is very "
"thin. Defining the fixed threshold can easily result in very doubtful "
"results. Hence, the heuristics approach needs careful fine-tuning."
msgstr ""
"Грань между отпечатками пальцев и не отпечатками пальцев очень тонка. "
"Определение фиксированного порога может легко привести к очень сомнительным "
"результатам. Поэтому эвристический подход нуждается в тщательной настройке."

#: ../content/posts/fpdetection.md:block 24 (paragraph)
msgid ""
"We have made significant efforts to tailor the heuristics in such a way as "
"to target mainly excessive fingerprints that identify users. We also focused"
" on achieving a very low number of false positives for a better user "
"experience. Because of the radical step of blocking subsequent requests, we "
"must ensure that this blocking occurs only in the necessary cases when there"
" is a high probability of fingerprinting."
msgstr ""
"Мы приложили значительные усилия, чтобы настроить эвристику таким образом, "
"чтобы она была нацелена в основном на чрезмерные отпечатки пальцев, по "
"которым идентифицируются пользователи. Мы также сосредоточились на "
"достижении очень низкого числа ложных срабатываний для улучшения "
"пользовательского опыта. Из-за радикального шага по блокированию последующих "
"запросов мы должны убедиться, что это блокирование происходит только в "
"необходимых случаях, когда существует высокая вероятность отпечатков пальцев."

#: ../content/posts/fpdetection.md:block 25 (paragraph)
msgid ""
"Additionally, it is very hard to differentiate between benign and "
"fingerprinting usage of a JavaScript endpoint. From the heuristic point of "
"view, setting a higher threshold for fingerprinting behaviour helps FPD "
"reduce false positives. We decided to verify all these assumptions in "
"practice. We tested FPD on real-world web pages and refined heuristics "
"accordingly."
msgstr ""
"Кроме того, очень трудно отличить доброкачественное использование конечной "
"точки JavaScript от \"отпечатков пальцев\". С эвристической точки зрения, "
"установка более высокого порога для поведения \"отпечатков пальцев\" "
"помогает FPD уменьшить количество ложных срабатываний. Мы решили проверить "
"все эти предположения на практике. Мы протестировали FPD на реальных веб-"
"страницах и соответствующим образом доработали эвристику."

#: ../content/posts/fpdetection.md:block 26 (paragraph)
msgid ""
"In terms of methodology, we manually visited homepages and login pages of "
"the top 100 websites from [the Tranco list](https://tranco-"
"list.eu/list/23W9/1000000). For inaccessible websites at the time of "
"testing, we replaced them with random websites from the top 200 list."
msgstr ""
"Что касается методики, то мы вручную посетили домашние страницы и страницы "
"входа в систему 100 лучших сайтов из [списка Tranco](https://tranco-list.eu/"
"list/23W9/1000000). В случае недоступных на момент тестирования сайтов мы "
"заменяли их случайными сайтами из списка 200 лучших."

#: ../content/posts/fpdetection.md:block 27 (paragraph)
msgid ""
"With each access to the tested page, we wiped browser settings to ensure "
"determinism of initial access. As the erasure removed any previously-stored "
"identifier, the visited pages may have deployed fingerprinting scripts more "
"aggressively to identify the user and reinstall the identifier."
msgstr ""
"При каждом обращении к тестируемой странице мы стирали настройки браузера, "
"чтобы обеспечить детерминированность первоначального доступа. Поскольку в "
"результате стирания удалялся любой ранее сохраненный идентификатор, на "
"посещенных страницах могли быть развернуты более агрессивные скрипты "
"отпечатков пальцев для идентификации пользователя и повторной установки "
"идентификатора."

#: ../content/posts/fpdetection.md:block 28 (paragraph)
msgid ""
"To boost the probability of fingerprinting even more, we switched off all "
"protection mechanisms offered by the browser. However, we blocked third-"
"party cookies because our previous experience suggests that the missing "
"possibility to store a permanent identifier tempts trackers to start "
"fingerprinting. To see an impact of a browser on the detection process, we "
"used both [Google Chrome](https://www.google.com/chrome/) and [Mozzila "
"Firefox](https://www.mozilla.org/en-US/firefox/)."
msgstr ""
"Чтобы еще больше увеличить вероятность отпечатков пальцев, мы отключили все "
"защитные механизмы, предлагаемые браузером. Однако мы заблокировали "
"сторонние cookies, поскольку наш предыдущий опыт подсказывает, что "
"отсутствие возможности сохранить постоянный идентификатор подталкивает "
"трекеры к началу фингерпринтинга. Чтобы увидеть влияние браузера на процесс "
"обнаружения, мы использовали как [Google Chrome] (https://www.google.com/"
"chrome/), так и [Mozzila Firefox] (https://www.mozilla.org/en-US/firefox/)."

#: ../content/posts/fpdetection.md:block 29 (paragraph)
msgid ""
"We needed the ground truth for web pages employing fingerprinting. We used "
"[FPMON](https://fpmon.github.io/fingerprinting-monitor/) and "
"[DFPM](https://github.com/freethenation/DFPM) to create the ground truth. We"
" selected these two extensions because they are the only ones capable of "
"real-time fingerprinting detection. FPMON reports fingerprinting pages with "
"colour. We assigned Yellow colour 1 point and red colour 3 points. DFPM "
"reports danger warnings. If DFPM reports one danger warning, we assign 1 "
"point to the page. For a higher number of danger warnings, we assign 3 "
"points to the page. Therefore, each page gets a fingerprinting score from 0 "
"to 6."
msgstr ""
"Нам нужна была базовая истина для веб-страниц, использующих отпечатки "
"пальцев. Мы использовали [FPMON](https://fpmon.github.io/"
"fingerprinting-monitor/) и [DFPM](https://github.com/freethenation/DFPM), "
"чтобы создать базовую истину. Мы выбрали эти два расширения, потому что "
"только они способны обнаруживать отпечатки пальцев в режиме реального "
"времени. FPMON сообщает о страницах с отпечатками пальцев с помощью цвета. "
"Желтому цвету мы присвоили 1 балл, а красному - 3 балла. DFPM сообщает о "
"предупреждениях об опасности. Если DFPM сообщает об одном предупреждении об "
"опасности, мы присваиваем странице 1 балл. При большем количестве "
"предупреждений об опасности мы присваиваем странице 3 балла. Таким образом, "
"каждая страница получает оценку отпечатков пальцев от 0 до 6."

#: ../content/posts/fpdetection.md:block 30 (paragraph)
msgid ""
"The score of 6 means that both extensions detected excessive fingerprinting "
"behaviour. Web pages with the score of 6 certainly deploy fingerprinting, "
"and FPD must detect such pages. FPD does not detect fingerprinting on "
"*Google login* pages since FPD heuristics evaluate *Google login* pages just"
" below its threshold. FPMON and DFPM detect fingerprinting on *Google login*"
" pages but just above their thresholds. *Google login* pages occurred six "
"times in total during testing. According to the methodology, these are false"
" negatives. Nevertheless, the final fingerprint is not aggressive enough to "
"provide enough entropy to identify most users uniquely."
msgstr ""
"Оценка 6 означает, что оба расширения обнаружили чрезмерное поведение "
"отпечатков пальцев. Веб-страницы с показателем 6, безусловно, используют "
"фингерпринтинг, и FPD должен обнаружить такие страницы. FPD не обнаруживает "
"фингерпринтинг на страницах *Google login*, поскольку эвристика FPD "
"оценивает страницы *Google login* чуть ниже своего порога. FPMON и DFPM "
"обнаруживают отпечатки пальцев на страницах *Google login*, но чуть выше "
"своих пороговых значений. Страницы *Google login* встречались в общей "
"сложности шесть раз за время тестирования. Согласно методологии, это ложные "
"срабатывания. Тем не менее, итоговый отпечаток недостаточно агрессивен, "
"чтобы обеспечить достаточную энтропию для однозначной идентификации "
"большинства пользователей."

#: ../content/posts/fpdetection.md:block 31 (paragraph)
msgid ""
"The score of 4 means that one extension detected fingerprinting and the "
"other suspects. We classify these web pages as deploying fingerprinting. FPD"
" managed to detect all web pages with two exceptions, *Facebook login* page "
"and `yandex.ru`. Both are border-line cases that do not obtain enough "
"entropy, similarly to *Google login* pages."
msgstr ""
"Оценка 4 означает, что одно расширение обнаружило fingerprinting, а другое - "
"подозревает. Мы классифицируем эти веб-страницы как использующие "
"fingerprinting. FPD удалось обнаружить все веб-страницы за двумя "
"исключениями, *страница входа в Facebook* и `yandex.ru`. Оба случая являются "
"пограничными и не получили достаточной энтропии, как и страницы *Google "
"login*."

#: ../content/posts/fpdetection.md:block 32 (paragraph)
msgid ""
"The score of 3 means that one extension detected fingerprinting and the "
"other did not detect fingerprinting at all. FPMON and DFPM treat browser "
"fingerprinting differently, so we observed a few web pages with this score. "
"It is questionable how to classify these pages when the reference extensions"
" conflict. FPD does not detect most of these pages. FPD detected "
"fingerprinting only on one of these pages, *Paypal login* page. We consider "
"this detection justified as we manually checked FPD logs and found clear "
"tracks of [canvas fingerprinting](https://fingerprintjs.com/blog/canvas-"
"fingerprinting/). In contrast, FPMON reported negligible fingerprinting "
"signs and did not recognise the fingerprinting attempt."
msgstr ""
"Оценка 3 означает, что одно расширение обнаружило отпечатки пальцев, а "
"другое не обнаружило их вообще. FPMON и DFPM по-разному относятся к "
"отпечаткам браузеров, поэтому мы наблюдали несколько веб-страниц с такой "
"оценкой. Не совсем понятно, как классифицировать эти страницы, если "
"эталонные расширения противоречат друг другу. FPD не обнаруживает "
"большинство таких страниц. FPD обнаружил отпечатки пальцев только на одной "
"из этих страниц, странице *Paypal login*. Мы считаем это обнаружение "
"оправданным, так как мы вручную проверили логи FPD и обнаружили четкие следы "
"[canvas fingerprinting](https://fingerprintjs.com/blog/canvas-fingerprinting/"
"). В отличие от этого, FPMON сообщил о незначительных признаках отпечатков "
"пальцев и не распознал попытку отпечатка."

#: ../content/posts/fpdetection.md:block 33 (paragraph)
msgid ""
"The score of 2 means that both extensions suspect fingerprinting. We assume "
"that web pages with this score may or may not fingerprint. Nevertheless, the"
" fingerprint is likely not extensive enough to serve as a unique identifier "
"if they do. Moreover, these web pages are prone to misclassification because"
" they may be close to the heuristic threshold. FPD detected two web pages "
"with this score, namely *Cloudflare login* page and *Washingtonpost login* "
"page. A closer analysis revealed that both pages use canvas fingerprinting "
"in conjunction with other fingerprinting methods. Interestingly, the "
"reference extensions could not detect such fingerprinting with enough "
"certainty."
msgstr ""
"Оценка 2 означает, что оба расширения подозревают наличие отпечатков "
"пальцев. Мы предполагаем, что веб-страницы с такой оценкой могут быть, а "
"могут и не быть отпечатками. Тем не менее отпечатки, скорее всего, "
"недостаточно обширны, чтобы служить уникальным идентификатором, если они "
"есть. Более того, эти веб-страницы подвержены ошибочной классификации, "
"поскольку они могут быть близки к эвристическому порогу. FPD обнаружил две "
"веб-страницы с таким показателем, а именно страницу *Cloudflare login* и "
"страницу *Washingtonpost login*. Более тщательный анализ показал, что обе "
"страницы используют отпечаток холста в сочетании с другими методами "
"отпечатка. Интересно, что эталонные расширения не смогли обнаружить такой "
"фингерпринтинг с достаточной уверенностью."

#: ../content/posts/fpdetection.md:block 34 (paragraph)
msgid ""
"The score of 1 means that only one extension suspects fingerprinting, and "
"the other extension does not detect anything. Similarly, for the score of 0 "
"where neither reference extension does detect fingerprinting. According to "
"our testing methodology, FPD should not detect such web pages as "
"fingerprinting. However, FPD detected fingerprinting on `ebay.com`. Manual "
"inspection showed that `ebay.com` did fingerprint indeed using canvas "
"fingerprinting, [audio fingerprinting](https://fingerprintjs.com/blog/audio-"
"fingerprinting/) and other techniques. Amusingly, the string used by canvas "
"fingerprint says `\"@Browsers~%fingGPRint$&,<canvas>\"`."
msgstr ""
"Оценка 1 означает, что только одно расширение подозревает наличие отпечатков "
"пальцев, а другое расширение ничего не обнаруживает. Аналогично, оценка 0 "
"означает, что ни одно из эталонных расширений не обнаруживает отпечатки "
"пальцев. Согласно нашей методологии тестирования, FPD не должен обнаруживать "
"отпечатки пальцев на таких веб-страницах. Однако FPD обнаружил отпечатки "
"пальцев на `ebay.com`. Ручная проверка показала, что на `ebay.com` "
"действительно были обнаружены отпечатки пальцев с помощью canvas "
"fingerprinting, [audio fingerprinting](https://fingerprintjs.com/blog/"
"audio-fingerprinting/) и других техник. Забавно, что строка, используемая в "
"canvas fingerprint, гласит `\"@Browsers~%fingGPRint$&,<canvas>\"`."

#: ../content/posts/fpdetection.md:block 35 (paragraph)
msgid ""
"We decided to classify web pages as follows. We considered a page to be "
"fingerprinting when its score is above or equal to 4. We did not count pages"
" with the score of 3 or 2 as fingerprinting because they may not be engaged "
"in fingerprinting in reality. It means that FPD may or may not detect such "
"pages; we do not count such classification as an error in both cases. As "
"discussed above, we manually inspected FPD in these situations. Finally, we "
"consider anything below the score of 2 as not fingerprinting."
msgstr ""
"Мы решили классифицировать веб-страницы следующим образом. Мы считали "
"страницу фингерпринтом, если ее оценка выше или равна 4. Мы не считали "
"фингерпринтом страницы с оценкой 3 или 2, поскольку в действительности они "
"могут не заниматься фингерпринтом. Это означает, что FPD может обнаружить "
"или не обнаружить такие страницы; мы не считаем такую классификацию ошибкой "
"в обоих случаях. Как говорилось выше, мы вручную проверяли FPD в таких "
"ситуациях. Наконец, мы считаем, что все, что ниже 2 баллов, не является "
"отпечатками пальцев."

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "Number of fingerprinting web pages identified by *our ground truth*."
msgstr ""
"Количество веб-страниц с отпечатками пальцев, идентифицированных *нашей "
"истиной*."

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "Homepages: **20**"
msgstr "Домашние страницы: **20**"

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "Login pages: **34**"
msgstr "Страницы входа: **34**"

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "Number of fingerprinting web pages identified by *JShelter*."
msgstr ""
"Количество веб-страниц с отпечатками пальцев, идентифицированных *JShelter*."

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "Login pages: **30**"
msgstr "Страницы входа: **30**"

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "Number of wrong identifications by *JShelter*."
msgstr "Количество ошибочных опознаний *JShelter*."

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "Homepages: **2**"
msgstr "Домашние страницы: **2**"

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "False positives: **1**"
msgstr "Ложные срабатывания: **1**"

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "False negatives: **1**"
msgstr "Ложноотрицательные результаты: **1**"

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "Login pages: **7**"
msgstr "Страницы входа: **30**"

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "False positives: **0**"
msgstr "Ложные срабатывания: **0**"

#: ../content/posts/fpdetection.md:block 36 (unordered list)
msgid "False negatives: **7**"
msgstr "Ложноотрицательные результаты: **7**"

#: ../content/posts/fpdetection.md:block 37 (paragraph)
msgid ""
"At first glance, the numbers are close but not the same. Different heuristic"
" thresholds of the extensions caused the main difference. However, as we "
"found out, the ground truth is far from being flawless. We encountered many "
"exceptions during testing and examined them in detail. In many cases, FPD "
"detects fingerprinting, but the reference extensions do not. For `ebay.com`,"
" neither FPMON nor DPFM identified the ongoing fingerprinting. We got a very"
" low false positive rate and an acceptable false negative rate in terms of "
"methodology."
msgstr ""
"На первый взгляд, цифры близки, но не одинаковы. Основную разницу вызвали "
"разные эвристические пороги расширений. Однако, как мы выяснили, истинное "
"положение дел далеко не безупречно. В ходе тестирования мы столкнулись с "
"множеством исключений и подробно их изучили. Во многих случаях FPD "
"обнаруживает отпечатки пальцев, а эталонные расширения - нет. Так, для сайта "
"`ebay.com` ни FPMON, ни DPFM не выявили отпечатки пальцев. Мы получили очень "
"низкий процент ложных срабатываний и приемлемый процент ложных отрицаний с "
"точки зрения методологии."

#: ../content/posts/fpdetection.md:block 38 (paragraph)
msgid ""
"We also observed other notable behaviour during the testing. The asymmetry "
"between detection on different browsers was minor but did occur sometimes. "
"However, the difference between browsers should be minimal. We had "
"implemented a mechanism that automatically recalculates heuristics to "
"compensate unsupported APIs. Finally, note that blocking tools like "
"*adblockers* can significantly reduce the number of positive detections. "
"These tools use filter lists to block tracking scripts before their "
"execution. Using FPD with a filter-based blocking tool can significantly "
"improve user experience and privacy."
msgstr ""
"Во время тестирования мы наблюдали и другие примечательные особенности "
"поведения. Асимметрия между обнаружением в разных браузерах была "
"незначительной, но иногда возникала. Однако разница между браузерами должна "
"быть минимальной. Мы реализовали механизм, который автоматически "
"пересчитывает эвристику, чтобы компенсировать неподдерживаемые API. Наконец, "
"обратите внимание, что блокирующие инструменты, такие как *adblockers*, "
"могут значительно снизить количество положительных обнаружений. Эти "
"инструменты используют списки фильтров для блокировки скриптов отслеживания "
"до их выполнения. Использование FPD с инструментами блокировки на основе "
"фильтров может значительно улучшить пользовательский опыт и "
"конфиденциальность."

#: ../content/posts/fpdetection.md:block 39 (header)
#, fuzzy
msgid "TL;DR"
msgstr "TL;DR"

#: ../content/posts/fpdetection.md:block 40 (paragraph)
msgid ""
"We have developed a JShelter module dedicated to browser fingerprinting "
"detection called *FingerPrint Detector (FPD)*. FPD applies a heuristic "
"approach to detect fingerprinting behaviour in real-time. FPD counts calls "
"to JavaScript APIs often employed by fingerprinting scripts. When FPD "
"detects fingerprinting attempt, it will (1) inform the user, (2) prevent "
"uploading of the fingerprint to the server, (3) prevent storing the "
"fingerprint for later usage. We tested FPD on the top 100 homepages and "
"login pages. The results show that FPD identifies excessive fingerprinting "
"behaviour and takes the necessary measures against fingerprint leakage."
msgstr ""
"Мы разработали модуль JShelter, предназначенный для обнаружения отпечатков "
"пальцев в браузере, под названием *FingerPrint Detector (FPD)*. FPD "
"применяет эвристический подход для обнаружения фингерпринтов в режиме "
"реального времени. FPD подсчитывает вызовы API JavaScript, часто "
"используемые скриптами для отпечатков пальцев. Когда FPD обнаруживает "
"попытку снятия отпечатков пальцев, он (1) сообщает об этом пользователю, (2) "
"предотвращает загрузку отпечатка пальца на сервер, (3) предотвращает "
"хранение отпечатка пальца для последующего использования. Мы протестировали "
"FPD на 100 лучших домашних страницах и страницах входа в систему. Результаты "
"показали, что FPD выявляет чрезмерное поведение, связанное с отпечатками "
"пальцев, и принимает необходимые меры против утечки отпечатков."

#: ../content/posts/fpdetection.md:block 41 (paragraph)
msgid ""
"Nevertheless, there is always more work to do. The detection heuristics "
"still have room for improvement. The real-world testing yields stimulating "
"research questions. How to define an excessive fingerprint? What "
"fingerprints should be blocked by the extension, and what fingerprints "
"should not? What is the best behaviour (threshold) so that the users find "
"the extension helpful?"
msgstr ""
"Тем не менее, всегда есть над чем работать. Эвристики обнаружения все еще "
"нуждаются в улучшении. Тестирование в реальных условиях порождает "
"стимулирующие исследовательские вопросы. Как определить чрезмерный "
"отпечаток? Какие отпечатки должны блокироваться расширением, а какие - нет? "
"Каково наилучшее поведение (порог), чтобы пользователи считали расширение "
"полезным?"

#: ../content/posts/i18n_developers.md:block 1 (header)
msgid ""
"title: What should a JShelter developer know about internationalization?\n"
"date: 2023-08-31 15:00\n"
"Series: i18n"
msgstr ""
"Название: Что должен знать разработчик JShelter об интернационализации?\n"
"дата: 2023-08-31 15:00\n"
"Серия: i18n"

#: ../content/posts/i18n_developers.md:block 2 (paragraph)
msgid ""
"We are working to improve the internationalization of JShelter. While the "
"webextension API already contains [APIs](https://developer.mozilla.org/en-"
"US/docs/Mozilla/Add-ons/WebExtensions/API/i18n) for internationalization, "
"not everything works great. This post is written for webextension developers"
" as well as JShelter developers working with strings presented to our users."
" Please see our [other post](/i18n/) if you are looking for ways to "
"translate JShelter."
msgstr ""
"Мы работаем над улучшением интернационализации JShelter. Хотя API "
"webextension уже содержит [APIs](https://developer.mozilla.org/en-US/docs/"
"Mozilla/Add-ons/WebExtensions/API/i18n) для интернационализации, не все "
"работает хорошо. Этот пост написан для разработчиков webextension, а также "
"для разработчиков JShelter, работающих со строками, представляемыми нашим "
"пользователям. Пожалуйста, посмотрите наш [другой пост](/i18n/), если вы "
"ищете способы перевода JShelter."

#: ../content/posts/i18n_developers.md:block 4 (header)
msgid "Translating manifest, CSS files, and JS files"
msgstr "Перевод манифеста, CSS-файлов и JS-файлов"

#: ../content/posts/i18n_developers.md:block 5 (paragraph)
msgid ""
"Let us start with the simple and easy items. Adding your translated strings "
"to the [manifest](https://developer.mozilla.org/en-US/docs/Mozilla/Add-"
"ons/WebExtensions/Internationalization#internationalizing_manifest.json) and"
" [CSS](https://developer.mozilla.org/en-US/docs/Mozilla/Add-"
"ons/WebExtensions/Internationalization#locale-dependent_css) files is really"
" simple and straightforward. For example, if you want to provide a "
"translatable description of your extension, you would change your "
"`manifest.json` to contain a line like:"
msgstr ""
"Начнем с самого простого и легкого. Добавление переведенных строк в файлы "
"[manifest](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/"
"WebExtensions/Internationalization#internationalizing_manifest.json) и [CSS]"
"(https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/"
"Internationalization#locale-dependent_css) очень простое и понятное. "
"Например, если вы хотите предоставить переводимое описание вашего "
"расширения, вы должны изменить ваш `manifest.json`, чтобы он содержал такую "
"строку, как:"

#: ../content/posts/i18n_developers.md:block 7 (paragraph)
msgid ""
"You add the description as `extensionDescription` to your `messages.json`:"
msgstr ""
"Вы добавляете описание как `extensionDescription` в ваш `messages.json`:"

#: ../content/posts/i18n_developers.md:block 9 (paragraph)
msgid "Similarly, you can localize CSS files like:"
msgstr "Аналогичным образом можно локализовать файлы CSS, например:"

#: ../content/posts/i18n_developers.md:block 11 (paragraph)
msgid "Afterward, you define `ShieldOnSlider`, and you are done."
msgstr "После этого вы определяете `ShieldOnSlider`, и все готово."

#: ../content/posts/i18n_developers.md:block 12 (paragraph)
msgid ""
"Translations in JavaScript files work a little bit differently, but it is "
"easy to adapt your JavaScript files. You just use the "
"`browser.i18n.getMessage` [API](https://developer.mozilla.org/en-"
"US/docs/Mozilla/Add-ons/WebExtensions/API/i18n/getMessage). You provide the "
"key in the `messages.json`. This time, you can add parameters that can be "
"utilized inside the `messages.json` file. For example, you can pass a string"
" that should appear inside the translated string:"
msgstr ""
"Переводы в файлах JavaScript работают немного по-другому, но адаптировать "
"ваши файлы JavaScript несложно. Вы просто используете "
"`browser.i18n.getMessage` [API](https://developer.mozilla.org/en-US/docs/"
"Mozilla/Add-ons/WebExtensions/API/i18n/getMessage). Вы указываете ключ в "
"файле `messages.json`. На этот раз вы можете добавить параметры, которые "
"могут быть использованы внутри файла `messages.json`. Например, вы можете "
"передать строку, которая должна появиться внутри переведенной строки:"

#: ../content/posts/i18n_developers.md:block 14 (paragraph)
msgid "and the `message.json` can contain something like:"
msgstr "и `message.json` может содержать что-то вроде:"

#: ../content/posts/i18n_developers.md:block 16 (paragraph)
msgid ""
"If you like the placeholders, for example, because you read in the best "
"practices that placeholder substitutions help specify parts that you [do not"
" want translated](https://developer.mozilla.org/en-US/docs/Mozilla/Add-"
"ons/WebExtensions/Internationalization#hardcoded_substitution). You are out "
"of luck if you want to add parameters to your manifest or CSS files. "
"Luckily, JShelter does not need parameters in manifest and CSS files, and "
"such a need is rare."
msgstr ""
"Если вам нравятся плейсхолдеры, например, потому что вы прочитали в лучших "
"практиках, что замена плейсхолдеров помогает указать части, которые вы "
"[не хотите переводить](https://developer.mozilla.org/en-US/docs/Mozilla/"
"Add-ons/WebExtensions/Internationalization#hardcoded_substitution). Вам не "
"повезло, если вы хотите добавить параметры в манифест или CSS-файлы. К "
"счастью, JShelter не нуждается в параметрах в файлах манифеста и CSS, и "
"такая необходимость возникает редко."

#: ../content/posts/i18n_developers.md:block 17 (header)
msgid "Translating HTML files"
msgstr "Перевод HTML-файлов"

#: ../content/posts/i18n_developers.md:block 18 (paragraph)
msgid ""
"Webextensions contain HTML pages. For example, you can configure "
"`options_ui` or `default_popup` in `manifest.json`. Even so, the "
"[internationalization page on MDN](https://developer.mozilla.org/en-"
"US/docs/Mozilla/Add-ons/WebExtensions/Internationalization) is quiet about "
"the internationalization of HTML files. Let us have a [look at what others "
"do](https://stackoverflow.com/questions/25467009/internationalization-of-"
"html-pages-for-my-google-chrome-extension)."
msgstr ""
"Веб-расширения содержат HTML-страницы. Например, вы можете настроить "
"`options_ui` или `default_popup` в `manifest.json`. Несмотря на это, на "
"[странице интернационализации на MDN](https://developer.mozilla.org/en-US/"
"docs/Mozilla/Add-ons/WebExtensions/Internationalization) ничего не говорится "
"об интернационализации HTML-файлов. Давайте посмотрим "
"[на то, что делают другие](https://stackoverflow.com/questions/25467009/"
"internationalization-of-html-pages-for-my-google-chrome-extension)."

#: ../content/posts/i18n_developers.md:block 19 (paragraph)
msgid ""
"In essence, others add some markup to the HTML file and later process that "
"markup in JS files. For example, in JShelter, we add `data-localize` "
"attribute to each element we want to translate. The attribute holds the key "
"in the `message.json`. For example, JShelter defines:"
msgstr ""
"По сути, другие добавляют разметку в HTML-файл, а затем обрабатывают эту "
"разметку в JS-файлах. Например, в JShelter мы добавляем атрибут `data-"
"localize` к каждому элементу, который хотим перевести. Атрибут содержит ключ "
"в файле `message.json`. Например, JShelter определяет:"

#: ../content/posts/i18n_developers.md:block 21 (paragraph)
msgid ""
"We added a [translation "
"file](https://pagure.io/JShelter/webextension/blob/bff8ce9c69ca28c1952898125983429c1f7f8a32/f/common/i18n_translate_dom.js)"
" `i18n_translate_dom.js` to all HTML pages with translatable elements. The "
"script is simple. It finds elements with the correct attributes and forwards"
" the strings to the `browser.i18n.getMessage` "
"[API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-"
"ons/WebExtensions/API/i18n/getMessage)."
msgstr ""
"Мы добавили [файл перевода](https://pagure.io/JShelter/webextension/blob/"
"bff8ce9c69ca28c1952898125983429c1f7f8a32/f/common/i18n_translate_dom.js) "
"`i18n_translate_dom.js` на все HTML-страницы с переводимыми элементами. "
"Скрипт прост. Он находит элементы с нужными атрибутами и передает строки в "
"`browser.i18n.getMessage` [API](https://developer.mozilla.org/en-US/docs/"
"Mozilla/Add-ons/WebExtensions/API/i18n/getMessage)."

#: ../content/posts/i18n_developers.md:block 22 (paragraph)
msgid ""
"Still, one needs to take care of special sections in the pages, like "
"[templates](https://pagure.io/JShelter/webextension/blob/bff8ce9c69ca28c1952898125983429c1f7f8a32/f/common/i18n_translate_dom.js#_43)."
msgstr ""
"Тем не менее, необходимо позаботиться о специальных разделах на страницах, "
"таких как [templates](https://pagure.io/JShelter/webextension/blob/"
"bff8ce9c69ca28c1952898125983429c1f7f8a32/f/common/i18n_translate_dom.js#_43)."

#: ../content/posts/i18n_developers.md:block 23 (paragraph)
msgid ""
"The lack of a standard way to cope with HTML translations means that if you "
"go to different webextension, they will likely have a similar script, but "
"the details would be different. That is not optimal."
msgstr ""
"Отсутствие стандартного способа работы с HTML-переводами означает, что если "
"вы обратитесь к разным веб-расширениям, то у них, скорее всего, будет "
"похожий скрипт, но детали будут отличаться. Это неоптимально."

#: ../content/posts/i18n_developers.md:block 24 (header)
msgid "Language priorities"
msgstr "Языковые приоритеты"

#: ../content/posts/i18n_developers.md:block 25 (paragraph)
msgid ""
"Webextension manifest file specifies `default_locale` as the default "
"language. This language is used as the last resort to pick untranslated "
"strings. Each language can have variants like `en_US` and `en_UK`. "
"Translators can create `message.json` for variants and the base language "
"(like `en`). Browsers select translations based on [the algorithm documented"
" on MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-"
"ons/WebExtensions/Internationalization#localized_string_selection). First, "
"they look for the variant, then for the base language, and if they are not "
"successful, they go to the `default_locale`. The API returns an empty string"
" if the default language does not contain the key."
msgstr ""
"В файле манифеста Webextension в качестве языка по умолчанию указывается "
"`default_locale`. Этот язык используется в качестве последнего средства для "
"выбора непереведенных строк. Каждый язык может иметь варианты, например "
"`en_US` и `en_UK`. Переводчики могут создавать `message.json` для вариантов "
"и базового языка (например, `en`). Браузеры выбирают переводы на основе "
"[алгоритма, задокументированного на MDN](https://developer.mozilla.org/en-US/"
"docs/Mozilla/Add-ons/WebExtensions/"
"Internationalization#localized_string_selection). Сначала они ищут вариант, "
"затем базовый язык, и если они не достигли успеха, они переходят к "
"`default_locale`. API возвращает пустую строку, если язык по умолчанию не "
"содержит ключа."

#: ../content/posts/i18n_developers.md:block 26 (paragraph)
msgid ""
"Unfortunately, there is no way to tweak the algorithm. For example, some "
"languages are similar. Czech speakers mostly understand Slovaks and vice-"
"versa. However, JShelter cannot tweak the algorithm to look at the Czech "
"translation if a Slovak translation is missing."
msgstr ""
"К сожалению, нет возможности подстроить алгоритм. Например, некоторые языки "
"похожи. Носители чешского языка в основном понимают словацкий, и наоборот. "
"Однако JShelter не может настроить алгоритм таким образом, чтобы он "
"обращался к чешскому переводу, если словацкий перевод отсутствует."

#: ../content/posts/i18n_developers.md:block 27 (header)
msgid "Handling plurals"
msgstr "Работа с множественным числом"

#: ../content/posts/i18n_developers.md:block 28 (paragraph)
msgid ""
"Plurals in English are simple for cardinal numbers. There is just the "
"singular and plural version. However, English has several forms for ordinal "
"numbers, like 1st, 2nd, 3rd, 4th, or 21st. Other languages behave "
"[differently](https://www.unicode.org/cldr/charts/43/supplemental/language_plural_rules.html)."
" In essence, almost every language has a specific handling of plurals."
msgstr ""
"Множественное число в английском языке просто для кардинальных чисел. "
"Существует только единственное и множественное число. Однако в английском "
"языке есть несколько форм для порядковых чисел, например 1st, 2nd, 3rd, 4th "
"или 21st. Другие языки ведут себя [по-другому] (https://www.unicode.org/cldr/"
"charts/43/supplemental/language_plural_rules.html). По сути, почти в каждом "
"языке есть свои особенности работы с множественным числом."

#: ../content/posts/i18n_developers.md:block 29 (paragraph)
msgid ""
"Although there is the `Intl.PluralRules()` "
"[API](https://developer.mozilla.org/en-"
"US/docs/Web/JavaScript/Reference/Global_Objects/Intl/PluralRules) in "
"JavaScript that is available to webextensions, there is no direct support "
"for plural messages in the `browser.i18n` API."
msgstr ""
"Хотя в JavaScript существует `Intl.PluralRules()` [API](https://"
"developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/"
"Intl/PluralRules), доступный для веб-расширений, в API `browser.i18n` нет "
"прямой поддержки множественных сообщений."

#: ../content/posts/i18n_developers.md:block 30 (paragraph)
msgid ""
"We considered creating several keys for the plural forms. For example, "
"suppose that JShelter needs to translate a string with `message.json` key "
"`pluralExample`. We would create a code like:"
msgstr ""
"Мы рассмотрели возможность создания нескольких ключей для множественных "
"форм. Например, предположим, что JShelter нужно перевести строку с "
"`message.json` ключом `pluralExample`. Мы создадим код типа:"

#: ../content/posts/i18n_developers.md:block 32 (paragraph)
msgid ""
"At first sight, this is a straightforward solution. However, English defines"
" only categories \"one\" and \"other.\" Imagine that the user uses a "
"different locale with the category \"few.\" If JShelter supports that "
"language and that language defines `pluralExamplefew`, great, everything "
"works. But imagine the key `pluralExamplefew` is missing for that language. "
"The [string selection algorithm](https://developer.mozilla.org/en-"
"US/docs/Mozilla/Add-"
"ons/WebExtensions/Internationalization#localized_string_selection) would "
"search for `pluralExamplefew` in English `message.json`. However, that key "
"would not be defined in English. So, the string selection algorithm would "
"yield an empty string."
msgstr ""
"На первый взгляд, это простое решение. Однако английский язык определяет "
"только категории \"один\" и \"другой\". Представьте, что пользователь "
"использует другую локаль с категорией \"несколько\". Если JShelter "
"поддерживает этот язык и в нем определено `pluralExamplefew`, то все "
"работает. Но представьте, что ключ `pluralExamplefew` отсутствует для этого "
"языка. Алгоритм [string selection algorithm](https://developer.mozilla.org/"
"en-US/docs/Mozilla/Add-ons/WebExtensions/"
"Internationalization#localized_string_selection) будет искать "
"`pluralExamplefew` в английском `message.json`. Однако в английском языке "
"этот ключ не определен. Поэтому алгоритм выбора строки выдаст пустую строку."

#: ../content/posts/i18n_developers.md:block 33 (paragraph)
msgid "There are several solutions to the problem:"
msgstr "Существует несколько решений этой проблемы:"

#: ../content/posts/i18n_developers.md:block 34 (unordered list)
msgid ""
"Define all variants for the default locale language. We do not like that "
"idea because it would be confusing for the translators — why is there "
"`pluralExamplefew` and other categories if only `one` and `other` are used "
"in English? They might attempt to remove the unused variants. Moreover, we "
"would unnecessarily overload the translators as they would need to provide "
"the default translation even if that is the same as \"other.\" Finally, "
"translators of other languages would likely be confused and add their "
"translations that would overwhelm them as well."
msgstr ""
"Определите все варианты для языка локали по умолчанию. Нам не нравится эта "
"идея, потому что она запутает переводчиков - зачем нужны `pluralExamplefew` "
"и другие категории, если в английском языке используются только `one` и "
"`other`? Они могли бы попытаться удалить неиспользуемые варианты. Кроме "
"того, мы излишне перегрузим переводчиков, поскольку им придется "
"предоставлять перевод по умолчанию, даже если это будет то же самое, что и "
"\"other\". Наконец, переводчики других языков, скорее всего, запутаются и "
"добавят свои переводы, что также перегрузит их."

#: ../content/posts/i18n_developers.md:block 34 (unordered list)
msgid ""
"We could create code that handles the missing translations. For example, the"
" program should check that `message` is not empty. If empty, it would get "
"the plural category for the English locale and the English translation. We "
"might opt for this path in the future."
msgstr ""
"Мы можем создать код, который будет обрабатывать недостающие переводы. "
"Например, программа должна проверять, что `message` не пуст. Если оно "
"пустое, то будет получена категория множественного числа для английской "
"локали и английский перевод. Возможно, в будущем мы выберем этот путь."

#: ../content/posts/i18n_developers.md:block 34 (unordered list)
msgid ""
"There are libraries like [webextension-"
"plural](https://github.com/joelspadin/webextension-plural) that specialize "
"in this task. However, `webextension-plural` has not been developed for "
"several years."
msgstr ""
"Существуют библиотеки типа [webextension-plural](https://github.com/"
"joelspadin/webextension-plural), которые специализируются на решении этой "
"задачи. Однако `webextension-plural` не разрабатывалась уже несколько лет."

#: ../content/posts/i18n_developers.md:block 35 (paragraph)
msgid ""
"As JShelter would benefit from plurals only in notifications of Network "
"Boundary Shield that we might be forced to remove in Manifest v3, we decided"
" not to write complex code to handle all exceptions and not to add "
"additional dependencies. We decided to generate messages like \"Blocked "
"messages: 5\"."
msgstr ""
"Поскольку JShelter будет использовать множественные числа только в "
"уведомлениях о Network Boundary Shield, которые мы можем быть вынуждены "
"удалить в Manifest v3, мы решили не писать сложный код для обработки всех "
"исключений и не добавлять дополнительных зависимостей. Мы решили "
"генерировать сообщения типа \"Заблокировано сообщений: 5\"."

#: ../content/posts/i18n_developers.md:block 36 (header)
msgid "Placeholders used in complex messages"
msgstr "Местоимения, используемые в сложных сообщениях"

#: ../content/posts/i18n_developers.md:block 37 (paragraph)
msgid ""
"[Developers should not make assumptions about the composition of the "
"sentences](https://mozilla-l10n.github.io/documentation/localization/dev_best_practices.html#splitting-"
"and-composing-sentences). However, some texts need special rules."
msgstr ""
"[Разработчики не должны делать предположений о составе предложений] (https"
"://mozilla-l10n.github.io/documentation/localization/dev_best_practices.html"
"#splitting-and-composing-sentences). Однако некоторые тексты нуждаются в "
"особых правилах."

#: ../content/posts/i18n_developers.md:block 38 (paragraph)
msgid ""
"Consider the buttons for adding and removing exceptions for Network Boundary"
" Shield and Fingerprint Detector. For example, the \"Enable for the selected"
" domains\" button caption. We want to give the user a full and clear "
"explanation; hence, the text is long. But we also want to emphasize the word"
" \"Enable.\" So the button caption uses HTML markup: "
"`<strong>Enable</strong> for the selected domains`."
msgstr ""
"Рассмотрим кнопки для добавления и удаления исключений для Сетевого "
"пограничного щита и Детектора отпечатков пальцев. Например, надпись на "
"кнопке \"Включить для выбранных доменов\". Мы хотим дать пользователю полное "
"и понятное объяснение, поэтому текст получился длинным. Но мы также хотим "
"подчеркнуть слово \"Включить\". Поэтому надпись на кнопке использует "
"разметку HTML: `<strong>Включить</strong> для выбранных доменов`."

#: ../content/posts/i18n_developers.md:block 39 (paragraph)
msgid ""
"We decided to use placeholders to describe to translators how to handle the "
"translation:"
msgstr ""
"Мы решили использовать местоимения, чтобы описать переводчикам, как работать "
"с переводом:"

#: ../content/posts/i18n_developers.md:block 41 (paragraph)
msgid ""
"This way, translators are free to change the structure of the message. For "
"example, consider that the translator decides that an appropriate "
"translation to Czech is \"Vybrané domény "
"&lt;strong&gt;povol&lt;/strong&gt;\". The word \"enable\" is translated as "
"\"povol\". The translator can generate text like:"
msgstr ""
"Таким образом, переводчики могут свободно изменять структуру сообщения. "
"Например, переводчик решает, что подходящим переводом на чешский будет "
"\"Vybrané domény &lt;strong&gt;povol&lt;/strong&gt;\". Слово \"enable\" "
"переводится как \"povol\". Переводчик может создать текст типа:"

#: ../content/posts/i18n_developers.md:block 43 (paragraph)
msgid ""
"All perfect until we decided to use "
"[Weblate](https://hosted.weblate.org/projects/jshelter/webextension/) to "
"help with the translation, for example, to notify translators about new and "
"changed strings that need translations. According to the "
"[docs](https://docs.weblate.org/en/latest/formats/webextension.html), "
"Weblate does support Webextension JSON. [Weblate "
"manual](https://readthedocs.org/projects/weblate/downloads/pdf/weblate-3.9.1/)"
" lists `placeholders as supported. The Weblate UI does not properly display "
"placeholders. Translators [do not see the "
"description](https://github.com/WeblateOrg/weblate/issues/3398) and example "
"content of the placeholders. They cannot translate the content of the "
"placeholder."
msgstr ""
"Все было прекрасно, пока мы не решили использовать [Weblate](https://"
"hosted.weblate.org/projects/jshelter/webextension/) для помощи в переводе, "
"например, для оповещения переводчиков о новых и измененных строках, "
"нуждающихся в переводе. Согласно [docs](https://docs.weblate.org/en/latest/"
"formats/webextension.html), Weblate поддерживает Webextension JSON. В "
"руководстве [Weblate manual](https://readthedocs.org/projects/weblate/"
"downloads/pdf/weblate-3.9.1/) указано, что поддерживаются `placeholders`. "
"Пользовательский интерфейс Weblate не отображает placeholders должным "
"образом. Переводчики [не видят описание](https://github.com/WeblateOrg/"
"weblate/issues/3398) и примеры содержимого placeholders. Они не могут "
"перевести содержимое плейсхолдера."

#: ../content/posts/i18n_developers.md:block 44 (paragraph)
msgid "In this case, we could change the definition to something like:"
msgstr "В этом случае мы можем изменить определение на что-то вроде:"

#: ../content/posts/i18n_developers.md:block 46 (paragraph)
msgid ""
"However, we have other complex cases where dividing the message into "
"placeholders makes sense. For example, we suggest different rules for "
"translating a part of the message, like API names. Hence, we created "
"[scripts](https://pagure.io/JShelter/webextension/blob/main/f/tools/i18n) to"
" help synchronize the strings between the repository and Weblate so that all"
" strings can be translated in Weblate. A developer needs to run the "
"synchronization scripts manually. The expected order is to first propagate "
"changes from Grammarly to main (or other branch), and after that, propagate "
"the changes from that branch in the repository to Weblate."
msgstr ""
"Однако есть и другие сложные случаи, когда разделение сообщения на вставки "
"имеет смысл. Например, мы предлагаем разные правила для перевода части "
"сообщения, например имен API. Поэтому мы создали [scripts](https://pagure.io/"
"JShelter/webextension/blob/main/f/tools/i18n) для синхронизации строк между "
"репозиторием и Weblate, чтобы все строки могли быть переведены в Weblate. "
"Разработчику необходимо запускать скрипты синхронизации вручную. "
"Предполагаемый порядок - сначала распространить изменения из Grammarly в "
"main (или другую ветку), а затем распространить изменения из этой ветки в "
"репозитории в Weblate."

#: ../content/posts/i18n_developers.md:block 47 (header)
msgid "Additional reading"
msgstr "Дополнительное чтение"

#: ../content/posts/i18n_developers.md:block 48 (paragraph)
msgid ""
"If you are a JShelter developer or are interested in helping JShelter's "
"internationalization development, please read [localization best practices "
"for "
"developers](https://mozilla-l10n.github.io/documentation/localization/dev_best_practices.html),"
" [MDN guide on webextension "
"internationalization](https://developer.mozilla.org/en-US/docs/Mozilla/Add-"
"ons/WebExtensions/Internationalization), and the [i18n API "
"documentation](https://developer.mozilla.org/en-US/docs/Mozilla/Add-"
"ons/WebExtensions/API/i18n)."
msgstr ""
"Если вы являетесь разработчиком JShelter или хотите помочь развитию "
"интернационализации JShelter, пожалуйста, прочитайте "
"[Лучшие практики локализации для разработчиков](https://mozilla-"
"l10n.github.io/documentation/localization/dev_best_practices.html), "
"[Руководство MDN по интернационализации веб-расширений](https://"
"developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/"
"Internationalization) и [Документацию i18n API](https://"
"developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/i18n)."

#: ../content/posts/i18n.md:block 1 (header)
msgid ""
"title: JShelter can be translated into different languages\n"
"date: 2023-09-08 14:00\n"
"Series: i18n\n"
"series_index: 1"
msgstr ""
"Название: JShelter может быть переведен на разные языки\n"
"дата: 2023-09-08 14:00\n"
"Серия: i18n\n"
"series_index: 1"

#: ../content/posts/i18n.md:block 2 (paragraph)
msgid ""
"JShelter's audience is international. As not all people speak English, "
"JShelter is now adding support for internationalization. Hence, it can be "
"translated into languages other than English."
msgstr ""
"Аудитория JShelter является международной. Поскольку не все люди говорят по-"
"английски, JShelter теперь поддерживает интернационализацию. Таким образом, "
"он может быть переведен на другие языки, кроме английского."

#: ../content/posts/i18n.md:block 3 (paragraph)
msgid ""
"The webextension API already contains "
"[APIs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-"
"ons/WebExtensions/API/i18n) that help to [translate "
"extensions](https://developer.mozilla.org/en-US/docs/Mozilla/Add-"
"ons/WebExtensions/Internationalization). This way we can localize not only "
"the interface of the extension but also its description and even the name."
msgstr ""
"API webextension уже содержит [API](https://developer.mozilla.org/en-US/docs/"
"Mozilla/Add-ons/WebExtensions/API/i18n), которые помогают "
"[переводить расширения](https://developer.mozilla.org/en-US/docs/Mozilla/"
"Add-ons/WebExtensions/Internationalization). Таким образом, мы можем "
"локализовать не только интерфейс расширения, но и его описание и даже "
"название."

#: ../content/posts/i18n.md:block 5 (header)
msgid "Status"
msgstr "Статус"

#: ../content/posts/i18n.md:block 6 (paragraph)
msgid ""
"JShelter can be translated to other languages as of version 0.14. Besides "
"English, Czech and Russian translations are also available."
msgstr ""
"Начиная с версии 0.14 JShelter может быть переведен на другие языки. Помимо "
"английского, доступны также чешский и русский переводы."

#: ../content/posts/i18n.md:block 7 (paragraph)
msgid ""
"Nevertheless, we are looking for translators in other languages. If you are "
"willing to translate JShelter to a language that you know, please read on. "
"We suggest that you contact us early so that we have information about "
"ongoing translations and that we can tell you if someone else is already "
"interested in the same language as you."
msgstr ""
"Тем не менее, мы ищем переводчиков на другие языки. Если вы готовы перевести "
"JShelter на язык, который вы знаете, пожалуйста, читайте дальше. Мы советуем "
"вам связаться с нами заранее, чтобы у нас была информация о текущих "
"переводах и чтобы мы могли сообщить вам, если кто-то уже заинтересован в том "
"же языке, что и вы."

#: ../content/posts/i18n.md:block 8 (header)
msgid "How can I translate JShelter? Option 1: Weblate"
msgstr "Как я могу перевести JShelter? Вариант 1: Weblate"

#: ../content/posts/i18n.md:block 9 (paragraph)
msgid ""
"We use [Weblate](https://github.com/WeblateOrg/weblate) to manage the "
"translations. This software helps us monitor the status of the translations,"
" providing suggestions and improving the lives of the translators. If you "
"want to help, visit [JShelter on "
"Weblate](https://hosted.weblate.org/projects/jshelter/webextension/). You "
"can send us suggestions without registration. However, some features, like "
"notifications, are only available to registered users."
msgstr ""
"Для управления переводами мы используем [Weblate](https://github.com/"
"WeblateOrg/weblate). Это программное обеспечение помогает нам следить за "
"состоянием переводов, вносить предложения и улучшать жизнь переводчиков. "
"Если вы хотите помочь, зайдите на сайт [JShelter on Weblate](https://"
"hosted.weblate.org/projects/jshelter/webextension/). Вы можете отправлять "
"нам предложения без регистрации. Однако некоторые функции, например "
"уведомления, доступны только зарегистрированным пользователям."

#: ../content/posts/i18n.md:block 10 (paragraph)
msgid "When you start translating, you should see a form like:"
msgstr "Когда вы начнете перевод, вы увидите форму, похожую на эту:"

#: ../content/posts/i18n.md:block 11 (paragraph)
msgid "![A screenshot from Weblate]({attach}/images/i18n/webly.png)"
msgstr "![Скриншот из Weblate]({attach}/images/i18n/webly.png)"

#: ../content/posts/i18n.md:block 12 (paragraph)
msgid "The interface shows:"
msgstr "На экране отображается интерфейс:"

#: ../content/posts/i18n.md:block 13 (ordered list)
msgid "The name of the key of the currently translated string,"
msgstr "Имя ключа текущей переведенной строки,"

#: ../content/posts/i18n.md:block 13 (ordered list)
msgid "the original English translation,"
msgstr "оригинальный английский перевод,"

#: ../content/posts/i18n.md:block 13 (ordered list)
msgid "the description of the usage of the string,"
msgstr "описание использования строки,"

#: ../content/posts/i18n.md:block 13 (ordered list)
msgid "the translation to the current target language,"
msgstr "перевод на текущий целевой язык,"

#: ../content/posts/i18n.md:block 13 (ordered list)
msgid ""
"the information on similar and nearby strings that might be handy to grasp "
"the context of the string,"
msgstr ""
"информация о похожих и соседних строках, которая может быть полезна для "
"понимания контекста строки,"

#: ../content/posts/i18n.md:block 13 (ordered list)
msgid "glossary containing key terms used in the project."
msgstr "глоссарий, содержащий основные термины, используемые в проекте."

#: ../content/posts/i18n.md:block 14 (paragraph)
msgid ""
"Most of the strings that translators face are simple, as shown above. "
"However, some strings are composed with `placeholders` (see the translation "
"option 2 for more details on placeholders). For example, consider [string "
"`defaultLevelSelection`](https://hosted.weblate.org/translate/jshelter/webextension/en/?checksum=a11db49ff616c6f0&sort_by=-priority,position)."
" Its English translation is `Default level ($levelName$)`. Strings enclosed "
"by `$` signs (`levelName` in this case) are `placeholders`. Each placeholder"
" is in the database with the key composed as `the base key "
"###placeholders### placeholder name`. So, in this case, the key of the "
"placeholder is `defaultLevelSelection###placeholders###levelName`."
msgstr ""
"Большинство строк, с которыми сталкиваются переводчики, являются простыми, "
"как показано выше. Однако некоторые строки состоят из `заместителей` ("
"подробнее о заполнителях см. в варианте перевода 2). Например, рассмотрим "
"[строку `defaultLevelSelection`](https://hosted.weblate.org/translate/"
"jshelter/webextension/en/"
"?checksum=a11db49ff616c6f0&sort_by=-priority,position). Его английский "
"перевод - `Уровень по умолчанию ($levelName$)`. Строки, окруженные знаками "
"`$` (в данном случае `levelName`), являются `плейсхолдерами`. Каждый "
"плейсхолдер находится в базе данных с ключом, составленным как `базовый ключ "
"###placeholders## имя плейсхолдера`. Таким образом, в данном случае ключ "
"местодержателя - это `defaultLevelSelection###placeholders###levelName`."

#: ../content/posts/i18n.md:block 15 (paragraph)
msgid ""
"Most placeholders should not be changed. The typical content of such "
"placeholders is like `$1`. It means that the extension generates the "
"content, and typically, translators are supposed to keep the string intact. "
"Always read carefully the description of the usage of the string that "
"indicates how the string should be translated."
msgstr ""
"Большинство заполнителей не следует изменять. Типичное содержимое таких "
"плейсхолдеров - `$1`. Это означает, что расширение генерирует содержимое, и, "
"как правило, переводчики должны сохранять строку в неизменном виде. Всегда "
"внимательно читайте описание использования строки, в котором указано, как ее "
"следует переводить."

#: ../content/posts/i18n.md:block 16 (paragraph)
msgid ""
"Some placeholder strings contain the names of APIs or other technical terms."
" For example, `jssgroupTimePrecisionDescription2###placeholders###apis` in "
"English contains `(Date, Performance, events, Gamepad API, and Web VR API)`."
" Please read the instructions for each string carefully. In this case, "
"translators should keep the names of the APIs but translate the punctuation "
"and conjunctions."
msgstr ""
"Некоторые строки placeholder содержат названия API или другие технические "
"термины. Например, `jssgroupTimePrecisionDescription2###placeholders###apis` "
"на английском языке содержит `( Дата, Производительность, События, Gamepad "
"API и Web VR API)`. Пожалуйста, внимательно прочитайте инструкции для каждой "
"строки. В данном случае переводчики должны сохранить названия API, но "
"перевести пунктуацию и союзы."

#: ../content/posts/i18n.md:block 17 (paragraph)
msgid ""
"Please consider the translations of each placeholder in the context of the "
"base string so that the whole string makes sense. It should be easy to find "
"the base key. Look at the start of the placeholder key or to the "
"instructions. Weblate should show the base string and its placeholders in "
"the *Nearby strings* section."
msgstr ""
"Пожалуйста, учитывайте переводы каждого плейсхолдера в контексте базовой "
"строки, чтобы вся строка имела смысл. Найти базовый ключ должно быть легко. "
"Посмотрите на начало ключа-заместителя или на инструкцию. Weblate должен "
"показывать базовую строку и ее заменители в разделе *Строки поблизости*."

#: ../content/posts/i18n.md:block 18 (paragraph)
msgid ""
"Strings containing URLs should not be translated. However, occasionally, "
"there is a localized version of the content at the original URL. In such "
"cases, it makes sense to provide URL to the localized version."
msgstr ""
"Строки, содержащие URL-адреса, не следует переводить. Однако иногда по "
"исходному URL существует локализованная версия контента. В таких случаях "
"имеет смысл указать URL на локализованную версию."

#: ../content/posts/i18n.md:block 19 (paragraph)
msgid ""
"As we explain below, we do not support plural forms due to technical "
"limitations and our decisions. So, use phrasing that does not need plurals. "
"See the example for option 2 for more details."
msgstr ""
"Как мы объясним ниже, мы не поддерживаем формы множественного числа из-за "
"технических ограничений и наших решений. Поэтому используйте фразы, в "
"которых не нужны множественные числа. Подробнее см. пример для варианта 2."

#: ../content/posts/i18n.md:block 20 (header)
msgid "How can I translate JShelter? Option 2: JSON files in the repository"
msgstr "Как я могу перевести JShelter? Вариант 2: JSON-файлы в хранилище"

#: ../content/posts/i18n.md:block 21 (paragraph)
msgid ""
"Technically, translations are strings located in JSON files, one JSON file "
"per language. The languages are stored in the "
"[`common/_locales`](https://pagure.io/JShelter/webextension/blob/i18n/f/common/_locales)"
" directory. If you do not see your language there, you can add a new "
"language by creating a new directory with the [language "
"code](https://www.unicode.org/cldr/charts/43/supplemental/language_plural_rules.html)"
" as the name, see the [docs](https://developer.mozilla.org/en-"
"US/docs/Mozilla/Add-"
"ons/WebExtensions/Internationalization#localized_string_selection)."
msgstr ""
"Технически, переводы - это строки, расположенные в JSON-файлах, по одному "
"JSON-файлу на каждый язык. Языки хранятся в директории [`common/_locales`]"
"(https://pagure.io/JShelter/webextension/blob/i18n/f/common/_locales). Если "
"вы не видите там своего языка, вы можете добавить новый язык, создав новый "
"каталог с [кодом языка](https://www.unicode.org/cldr/charts/43/supplemental/"
"language_plural_rules.html) в качестве имени, смотрите [docs](https://"
"developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/"
"Internationalization#localized_string_selection)."

#: ../content/posts/i18n.md:block 22 (paragraph)
msgid ""
"Then, copy the `en/messages.json` to the just created directory, and you "
"have the basis for the translation."
msgstr ""
"Затем скопируйте `en/messages.json` в только что созданный каталог, и у вас "
"есть основа для перевода."

#: ../content/posts/i18n.md:block 23 (paragraph)
msgid "Next, go through all the strings and translate them to your language."
msgstr "Затем просмотрите все строки и переведите их на свой язык."

#: ../content/posts/i18n.md:block 24 (paragraph)
msgid "Typically, a translation entry looks like this:"
msgstr "Как правило, запись перевода выглядит следующим образом:"

#: ../content/posts/i18n.md:block 26 (paragraph)
msgid ""
"The first line (`javascriptShield`) displays the name of the string. "
"JShelter pairs the name of the string with the locations in the source code "
"where this translation should appear. So, do not change that line."
msgstr ""
"Первая строка (`javascriptShield`) отображает имя строки. JShelter "
"сопоставляет название строки с местами в исходном коде, где должен появиться "
"этот перевод. Поэтому не изменяйте эту строку."

#: ../content/posts/i18n.md:block 27 (paragraph)
msgid ""
"The second line (key `message`) shows the actual translation. Usually, "
"translators are supposed to change that line."
msgstr ""
"Вторая строка (ключ `message`) показывает фактический перевод. Обычно "
"переводчики должны изменять эту строку."

#: ../content/posts/i18n.md:block 28 (paragraph)
msgid ""
"The third line is the description of the context of the string. So, for "
"example, the translator would learn where and how the extension uses the "
"message. Please do not translate the description."
msgstr ""
"Третья строка - это описание контекста строки. Так, например, переводчик "
"узнает, где и как расширение использует сообщение. Пожалуйста, не переводите "
"описание."

#: ../content/posts/i18n.md:block 29 (paragraph)
msgid "So, for example, in the Czech translation, the entry becomes:"
msgstr "Так, например, в чешском переводе запись выглядит следующим образом:"

#: ../content/posts/i18n.md:block 31 (paragraph)
msgid "However, some entries are more tricky, let us look at:"
msgstr "Однако некоторые записи являются более сложными, давайте рассмотрим их:"

#: ../content/posts/i18n.md:block 33 (paragraph)
msgid ""
"The `message` contains a variable enclosed by the dollar sign (in this case,"
" `levelName`). Note that the `placeholders` section contains the "
"specification of the variable. We add substrings with special properties to "
"the `placeholders` section. Such substrings are either filled automatically "
"or hold data that should be translated according to the different rules than"
" the `message`. Follow the `description` to learn the rules."
msgstr ""
"В `message` содержится переменная, заключенная в знак доллара (в данном "
"случае `levelName`). Обратите внимание, что секция `placeholders` содержит "
"спецификацию переменной. Мы добавляем в секцию `placeholders` подстроки со "
"специальными свойствами. Такие подстроки либо заполняются автоматически, "
"либо содержат данные, которые должны быть переведены по правилам, отличным "
"от правил `message`. Чтобы узнать правила, следуйте `описанию`."

#: ../content/posts/i18n.md:block 34 (paragraph)
msgid ""
"In this case, the single `placeholders` entry contains three keys: "
"`content`, `description`, and `example`. The meaning of the description is "
"the same as in the original case. It explains the context of the variable. "
"Additionally, `example` gives example strings or their description to "
"provide the translator with more information about the possible content. The"
" `content` controls how the content is created. If the file does not give "
"translators any further instructions (like in this case), please do not "
"translate the `placeholder` section. So the translated entry becomes:"
msgstr ""
"В данном случае одна запись `placeholders` содержит три ключа: `content`, "
"`description` и `example`. Значение описания такое же, как и в исходном "
"случае. Оно объясняет контекст переменной. Кроме того, в `example` "
"приводятся примеры строк или их описание, чтобы предоставить переводчику "
"больше информации о возможном содержимом. Параметр `content` управляет "
"процессом создания содержимого. Если файл не дает переводчику никаких "
"дополнительных инструкций (как в данном случае), пожалуйста, не переводите "
"секцию `placeholder`. Таким образом, переведенная запись становится:"

#: ../content/posts/i18n.md:block 36 (paragraph)
msgid "See that only the `message` string changed."
msgstr "Убедитесь, что изменилась только строка `message`."

#: ../content/posts/i18n.md:block 37 (paragraph)
msgid "A more complicated example is:"
msgstr "Более сложный пример:"

#: ../content/posts/i18n.md:block 39 (paragraph)
msgid ""
"This string holds two placeholders: `apis` and "
"`jssgroupPhysicalLocationGeolocation`. Let us start from the end. "
"`jssgroupPhysicalLocationGeolocation` should not be touched by the "
"translator. The text explains that `jssgroupPhysicalLocationGeolocation` "
"will hold the translation of the string with the same name during the "
"execution of the extension (\"Physical location (geolocation)\" in this "
"case). Do not change anything in entries like "
"`jssgroupPhysicalLocationGeolocation` during the translation."
msgstr ""
"Эта строка содержит два заполнителя: `apis` и "
"`jssgroupPhysicalLocationGeolocation`. Давайте начнем с конца. Переводчик не "
"должен трогать `jssgroupPhysicalLocationGeolocation`. В тексте поясняется, "
"что `jssgroupPhysicalLocationGeolocation` будет хранить перевод одноименной "
"строки во время выполнения расширения ("
"\"Физическое местоположение (геолокация)\" в данном случае). Не изменяйте "
"ничего в записях типа `jssgroupPhysicalLocationGeolocation` во время "
"перевода."

#: ../content/posts/i18n.md:block 40 (paragraph)
msgid ""
"Then, there is the entry called `apis`. If you look at the content, it does "
"not refer to any automatically filled string like the previous examples. "
"Instead, the string holds the names of several APIs. The `desription` "
"provides instructions on how to handle the translation. In this case, we "
"suggest keeping the APIs' names in English. That way, the user can search "
"for the APIs for more information. If you translate the API names, the user "
"would likely be unable to find any information about the API. However, "
"different languages have different rules for punctuation, and the "
"conjunction *and* must be translated. So the translation can look like:"
msgstr ""
"Далее, есть запись под названием `apis`. Если посмотреть на ее содержимое, "
"то она не ссылается на какую-либо автоматически заполняемую строку, как в "
"предыдущих примерах. Вместо этого в строке содержатся имена нескольких API. "
"В `desription` содержатся инструкции по обработке перевода. В данном случае "
"мы предлагаем оставить названия API на английском языке. Таким образом, "
"пользователь сможет найти API для получения дополнительной информации. Если "
"вы переведете названия API, пользователь, скорее всего, не сможет найти "
"никакой информации об API. Однако в разных языках существуют разные правила "
"постановки знаков препинания, и связка *и* должна быть переведена. Поэтому "
"перевод может выглядеть следующим образом:"

#: ../content/posts/i18n.md:block 42 (paragraph)
msgid ""
"Note that the original translation used a different kind of quotation marks."
" The English original uses the same character as the JSON delimiter. Hence, "
"the character '' precedes the quotation mark. The Czech translation does not"
" use quotation marks conflicting with the JSON quotation marks, so it does "
"not need the '' sign."
msgstr ""
"Обратите внимание, что в оригинальном переводе использовался другой вид "
"кавычек. В английском оригинале используется тот же символ, что и в "
"разделителе JSON. Следовательно, символ '' предшествует кавычкам. В чешском "
"переводе не используются кавычки, конфликтующие с кавычками JSON, поэтому "
"знак '' не нужен."

#: ../content/posts/i18n.md:block 43 (paragraph)
msgid ""
"Occasionally, we extract URLs to the `placeholders` section to highlight "
"that they should not be translated like:"
msgstr ""
"Иногда мы извлекаем URL в раздел `placeholders`, чтобы подчеркнуть, что их "
"не следует переводить, например:"

#: ../content/posts/i18n.md:block 45 (paragraph)
msgid ""
"Note that strings for translation can hold HTML markup in some cases. In "
"that case, we suggest keeping the same markup. However, if other languages "
"handle such texts differently, translators are free to apply such rules. The"
" translation can look like:"
msgstr ""
"Обратите внимание, что в некоторых случаях строки для перевода могут "
"содержать HTML-разметку. В этом случае мы рекомендуем оставить ту же "
"разметку. Однако если в других языках подобные тексты обрабатываются иначе, "
"переводчики могут применять такие правила. Перевод может выглядеть следующим "
"образом:"

#: ../content/posts/i18n.md:block 47 (paragraph)
msgid ""
"On rare occasions, we do not expect the translators to touch the `message` "
"itself but rather work with the placeholders. For example, see:"
msgstr ""
"В редких случаях мы ожидаем, что переводчики не будут трогать само "
"`сообщение`, а будут работать с заполнителями. Например, см:"

#: ../content/posts/i18n.md:block 49 (paragraph)
msgid ""
"You can see that the message holds a template with an HTML markup. In this "
"case, we opted for this approach for several reasons:"
msgstr ""
"Вы можете видеть, что сообщение содержит шаблон с HTML-разметкой. В данном "
"случае мы выбрали этот подход по нескольким причинам:"

#: ../content/posts/i18n.md:block 50 (unordered list)
msgid ""
"We expect translators to preserve the same template (`message`) in most, if "
"not all, languages."
msgstr ""
"Мы ожидаем, что переводчики сохранят один и тот же шаблон (`сообщение`) в "
"большинстве, если не во всех, языках."

#: ../content/posts/i18n.md:block 50 (unordered list)
msgid "Each paragraph (`placeholders` entry) can have specific instructions."
msgstr ""
"Каждый параграф (запись `placeholders`) может содержать определенные "
"инструкции."

#: ../content/posts/i18n.md:block 50 (unordered list)
msgid ""
"The text blocks are not as long as a single block containing all text would "
"be."
msgstr "Текстовые блоки не такие длинные, как один блок, содержащий весь текст."

#: ../content/posts/i18n.md:block 51 (paragraph)
msgid ""
"English has a single plural form for cardinal numbers (usually a suffix `s` "
"or `es` appended to the singular form) and several forms of ordinal numbers "
"(1st, 2nd, 3rd, 4th). [Other languages behave "
"differently.](https://www.unicode.org/cldr/charts/43/supplemental/language_plural_rules.html)"
" Unfortunately, the [Webextension APIs do not handle plurals "
"well](/i18n_developers/) and JShelter could use plurals only in "
"notifications of Network Boundary Shield, so we decided to rephrase the "
"messages so plurals are not needed:"
msgstr ""
"В английском языке существует единственная форма множественного числа для "
"кардинальных чисел (обычно к форме единственного числа добавляется суффикс "
"`s` или `es`) и несколько форм порядковых чисел (1st, 2nd, 3rd, 4th). "
"[Другие языки ведут себя по-другому.](https://www.unicode.org/cldr/charts/43/"
"supplemental/language_plural_rules.html) К сожалению, "
"[API Webextension не очень хорошо обрабатывают множественное число](/"
"i18n_developers/), а JShelter может использовать множественное число только "
"в уведомлениях Network Boundary Shield, поэтому мы решили перефразировать "
"сообщения, чтобы множественное число не требовалось:"

#: ../content/posts/i18n.md:block 53 (header)
msgid "Final remarks"
msgstr "Заключительные замечания"

#: ../content/posts/i18n.md:block 54 (paragraph)
msgid ""
"If you want to start translating a new language, let us know. For example, "
"you can open an issue in the [issue "
"tracker](https://pagure.io/JShelter/webextension/issues) or send us "
"[e-mail](mailto:jshelter@gnu.org). If you are in doubt about how to "
"translate a string or do not understand its meaning, let us know in an "
"[issue](https://pagure.io/JShelter/webextension/issues) or send us "
"[e-mail](mailto:jshelter@gnu.org)."
msgstr ""
"Если вы хотите начать перевод на новый язык, сообщите нам об этом. Например, "
"вы можете открыть проблему в [issue tracker](https://pagure.io/JShelter/"
"webextension/issues) или отправить нам [e-mail](mailto:jshelter@gnu.org). "
"Если вы сомневаетесь в том, как перевести строку, или не понимаете ее "
"смысла, сообщите нам об этом в [issue](https://pagure.io/JShelter/"
"webextension/issues) или отправьте нам [e-mail](mailto:jshelter@gnu.org)."

#: ../content/posts/jsrfinal.md:block 1 (header)
msgid ""
"title: Final remarks on the JSR project\n"
"date: 2022-05-10 18:00\n"
"Series: JShelter background"
msgstr ""
"Название: Заключительные замечания по проекту JSR\n"
"дата: 2022-05-10 18:00\n"
"Серия: JShelter справочник"

#: ../content/posts/jsrfinal.md:block 2 (paragraph)
msgid ""
"The [JavaScript Restrictor](https://nlnet.nl/project/JSRestrictor/) "
"([JSR](/support/)) project (supported by [NGI0 PET "
"Fund](https://nlnet.nl/PET), a fund established by "
"[NLnet](https://nlnet.nl/) with financial support from the European "
"Commission's [Next Generation Internet](https://ngi.eu/) programme, under "
"the aegis of DG Communications Networks, Content and Technology under grant "
"agreement No 825310) is heading towards its end, and we summarize what the "
"project gave JShelter and reiterate the chosen approaches."
msgstr ""
"Проект [JavaScript Restrictor](https://nlnet.nl/project/JSRestrictor/) ([JSR]"
"(/support/)) (поддерживаемый [NGI0 PET Fund](https://nlnet.nl/PET), фондом, "
"созданным [NLnet](https://nlnet.nl/) при финансовой поддержке программы "
"Европейской комиссии [[Интернет следующего поколения](https://ngi.eu/)], под "
"эгидой DG коммуникационных сетей, контента и технологий в рамках грантового "
"соглашения № 825310) подходит к концу, и мы подводим итоги того, что дал "
"проект JShelter, и подтверждаем выбранные подходы."

#: ../content/posts/jsrfinal.md:block 3 (header)
msgid "What are the steps that JShelter takes to protect users?"
msgstr "Какие меры предпринимает JShelter для защиты пользователей?"

#: ../content/posts/jsrfinal.md:block 4 (paragraph)
msgid ""
"During the NGI0 PET Fund JSR project, we investigated fingerprinting scripts"
" and prepared wrappers, developed Fingerprint Detector, ported anti-"
"fingerprinting mechanisms from Brave, and improved the reliability of the "
"code-injection mechanisms (the credit for the relaible injection goes to "
"[the parallel NGI0 PET project](https://nlnet.nl/project/JShelter/)). Let us"
" go through the list in more detail:"
msgstr ""
"В ходе проекта NGI0 PET Fund JSR мы исследовали скрипты отпечатков пальцев и "
"подготовили обёртки, разработали Детектор отпечатков пальцев, портировали "
"механизмы борьбы с отпечатками пальцев из Brave и повысили надёжность "
"механизмов инъекции кода (заслуга релаьной инъекции принадлежит "
"[параллельному проекту NGI0 PET](https://nlnet.nl/project/JShelter/)). "
"Давайте пройдемся по списку более подробно:"

#: ../content/posts/jsrfinal.md:block 5 (paragraph)
msgid ""
"We reviewed literature focusing on the fingerprinting scripts and studied "
"APIs [declined by Apple](https://github.com/polcak/jsrestrictor/issues/66). "
"During the project, we added or improved wrappers to JavaScript Shield for:"
msgstr ""
"Мы изучили литературу, посвященную скриптам для снятия отпечатков пальцев, и "
"изучили API [от которых отказалась Apple] (https://github.com/polcak/"
"jsrestrictor/issues/66). В ходе проекта мы добавили или улучшили обертки для "
"JavaScript Shield для:"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
msgid "All API calls providing timestamps,"
msgstr "Все вызовы API предоставляют временные метки,"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`window.name`,"
msgstr "`window.name`,"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`MediaDevices.prototype.enumerateDevices`"
msgstr "`MediaDevices.prototype.enumerateDevices`"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
msgid "Beacon API,"
msgstr "API маячков,"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
msgid "Canvas API and Web GL API,"
msgstr "API Canvas и API Web GL,"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
msgid "Audio API,"
msgstr "Аудио API,"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`Navigator.prototype.hardwareConcurrency`"
msgstr "`Navigator.prototype.hardwareConcurrency`"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`Navigator.prototype.deviceMemory`"
msgstr "`Navigator.prototype.deviceMemory`"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`Navigator.prototype.getGamepads`"
msgstr "`Navigator.prototype.getGamepads`"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`Navigator.prototype.activeVRDisplays`"
msgstr "`Navigator.prototype.activeVRDisplays`"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`Navigator.prototype.plugins`"
msgstr "`Navigator.prototype.plugins`"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
msgid ""
"Sensor API: Magnetometer, Accelerometer, LinearAccelerationSensor, "
"GravitySensor, Gyroscope,"
msgstr ""
"API датчиков: Магнитометр, Акселерометр, Датчик линейного ускорения, Датчик "
"гравитации, Гироскоп,"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
msgid ""
"AbsoluteOrientationSensor, RelativeOrientationSensor, and AmbientLightSensor"
msgstr ""
"AbsoluteOrientationSensor, RelativeOrientationSensor и AmbientLightSensor"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
msgid "BigInt typed arrays"
msgstr "Типизированные массивы BigInt"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`Navigator.prototype.requestMediaKeySystemAccess`"
msgstr "`Navigator.prototype.requestMediaKeySystemAccess`"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`MediaCapabilities.prototype.encodingInfo`"
msgstr "`MediaCapabilities.prototype.encodingInfo`"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`MediaCapabilities.prototype.decodingInfo`"
msgstr "`MediaCapabilities.prototype.decodingInfo`"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "`HTMLMediaElement.prototype.canPlayType`"
msgstr "`HTMLMediaElement.prototype.canPlayType`"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
msgid "Network Information API"
msgstr "API сетевой информации"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
#, fuzzy
msgid "Web NFC API"
msgstr "Web NFC API"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
msgid "Cooperative Scheduling of Background Tasks API"
msgstr "API совместного планирования фоновых задач"

#: ../content/posts/jsrfinal.md:block 6 (unordered list)
msgid "User idle detection"
msgstr "Обнаружение бездействия пользователя"

#: ../content/posts/jsrfinal.md:block 7 (paragraph)
msgid ""
"Note that JShelter modifies APIs depending on the selected JavaScript Shield"
" level and the tweaks for the visited domain."
msgstr ""
"Обратите внимание, что JShelter изменяет API в зависимости от выбранного "
"уровня JavaScript Shield и настроек для посещаемого домена."

#: ../content/posts/jsrfinal.md:block 8 (paragraph)
msgid ""
"Previous literature modifies outputs of some APIs differently during "
"repeated calls. JShelter [adopted the model of Brave](/farbling/). Hence, "
"different origins read different values from the same APIs. One origin reads"
" the same values for each repeated reading in the same browser session. "
"Therefore, a fingerprint computed from these values is different for each "
"origin and session, making cross-site correlation harder. Note that some "
"identifiers like an IP address are outside of JShelter reach. JShelter "
"provides different readings to the same origin in a new browser session."
msgstr ""
"В предыдущей литературе выходы некоторых API модифицируются по-разному при "
"повторных вызовах. JShelter [принял модель Brave](/farbling/). Таким "
"образом, разные источники считывают разные значения из одних и тех же API. "
"Один источник считывает одни и те же значения при каждом повторном чтении в "
"одной и той же сессии браузера. Поэтому отпечаток пальца, вычисленный по "
"этим значениям, отличается для каждого источника и сессии, что затрудняет "
"межсайтовую корреляцию. Обратите внимание, что некоторые идентификаторы, "
"например IP-адрес, находятся вне зоны действия JShelter. JShelter "
"предоставляет разные показания одному и тому же источнику в новой сессии "
"браузера."

#: ../content/posts/jsrfinal.md:block 9 (paragraph)
msgid ""
"[FP-Random](https://github.com/plaperdr/fprandom) modifies data inserted "
"into the canvas. For example, if the page wants to draw with orange colour, "
"FP-Random draws with a different shade of orange. We do not think that this "
"is a good strategy for JShelter:"
msgstr ""
"[FP-Random](https://github.com/plaperdr/fprandom) изменяет данные, "
"вставленные в холст. Например, если страница хочет нарисовать оранжевый "
"цвет, FP-Random рисует другой оттенок оранжевого. Мы не считаем, что это "
"хорошая стратегия для JShelter:"

#: ../content/posts/jsrfinal.md:block 10 (unordered list)
msgid ""
"JShelter currently does not modify what users see in canvases (i.e. the "
"browser does not modify the visual representation). JShelter only modifies "
"read data - so each script sees different values than users. In other words,"
" while FP-Random breaks both visual representation and export functions, "
"JShelter breaks only export functions."
msgstr ""
"В настоящее время JShelter не изменяет то, что пользователи видят на "
"полотнах (т.е. браузер не изменяет визуальное представление). JShelter "
"изменяет только данные чтения - поэтому каждый скрипт видит свои значения, а "
"не пользовательские. Другими словами, если FP-Random нарушает как визуальное "
"представление, так и функции экспорта, то JShelter нарушает только функции "
"экспорта."

#: ../content/posts/jsrfinal.md:block 10 (unordered list)
msgid ""
"Web GL offers visual effects produced by lighting, textures and other "
"techniques. Identifying all mechanisms that need to be wrapped and modified "
"seem to be too complex and out of the reach of this project."
msgstr ""
"Web GL предлагает визуальные эффекты, создаваемые с помощью освещения, "
"текстур и других техник. Выявление всех механизмов, которые необходимо "
"обернуть и модифицировать, представляется слишком сложным и непосильным для "
"данного проекта."

#: ../content/posts/jsrfinal.md:block 11 (paragraph)
msgid ""
"JShelter provides [Fingerprint Detector](/fpdetection/) (FPD), a module that"
" heuristically detects fingerprinting and notifies users with an option to "
"block future communications. This anti-fingerprinting mechanism is "
"orthogonal to the little lies anti-fingerprinting mechanisms in JavaScript "
"Shield, and we advise using both mechanisms. Little lies help if the "
"fingerprinting scripts upload some readings before FPD detects the attempt "
"or the user deactivates FPD for a website. FPD provides an additional safety"
" net for fingerprinters trying to nullify the little lies. FPD also provides"
" a report page that can educate users about the APIs misused for "
"fingerprinting. We developed code for crawling websites and detecting APIs "
"often blocked by uBlock Origin with the goal of gradually improving "
"heuristics. We do not have an automatic generation of heuristics, and manual"
" oversight is needed."
msgstr ""
"JShelter предоставляет [Fingerprint Detector](/fpdetection/) (FPD), модуль, "
"который эвристически обнаруживает отпечатки пальцев и уведомляет "
"пользователей с возможностью блокировки будущих сообщений. Этот механизм "
"борьбы с отпечатками пальцев ортогонален механизму борьбы с отпечатками "
"пальцев с помощью маленькой лжи в JavaScript Shield, и мы советуем "
"использовать оба механизма. Маленькая ложь помогает, если скрипты отпечатков "
"пальцев загружают некоторые показания до того, как FPD обнаружит попытку, "
"или пользователь отключает FPD для веб-сайта. FPD обеспечивает "
"дополнительную защиту для фингерпринтеров, пытающихся свести на нет "
"маленькую ложь. FPD также предоставляет страницу с отчетом, на которой "
"пользователи могут узнать о неправильно используемых API для снятия "
"отпечатков пальцев. Мы разработали код для просмотра веб-сайтов и "
"обнаружения API, часто блокируемых uBlock Origin, с целью постепенного "
"улучшения эвристики. У нас нет автоматической генерации эвристик, поэтому "
"необходим ручной контроль."

#: ../content/posts/jsrfinal.md:block 12 (paragraph)
msgid ""
"The badge icon does not show level ID anymore. It shows the number of "
"wrapping groups accessed by the current page as a number; the colour informs"
" the user about the likelihood that the current page tries to fingerprint "
"the user. The user can see more details about the activated wrappers and FPD"
" findings in the popup window."
msgstr ""
"Значок значка больше не показывает идентификатор уровня. Он показывает "
"количество групп обёрток, к которым обращается текущая страница, в виде "
"числа; цвет информирует пользователя о вероятности того, что текущая "
"страница пытается снять отпечатки пальцев пользователя. Во всплывающем окне "
"пользователь может увидеть более подробную информацию об активированных "
"обертках и результатах FPD."

#: ../content/posts/jsrfinal.md:block 13 (paragraph)
msgid ""
"JShelter depends on [NSCL](https://github.com/hackademix/nscl/) (developed "
"outside JSR project) that provides reliable cross-browser support to inject "
"scripts before page scripts can access original APIs. That solved several "
"long-standing bugs and allowed the extension to be used with confidence. "
"However, NSCL does not implement reliable code injections into WebWorkers, "
"so we apply Strict WebWorker protection by default. The protection disables "
"WebWorkers and replaces them with a polyfill."
msgstr ""
"JShelter зависит от [NSCL](https://github.com/hackademix/nscl/) ("
"разработанного вне проекта JSR), который обеспечивает надежную "
"кроссбраузерную поддержку инъекции скриптов до того, как скрипты страницы "
"получат доступ к оригинальным API. Это позволило решить несколько давних "
"ошибок и уверенно использовать расширение. Однако в NSCL не реализована "
"надежная инъекция кода в WebWorkers, поэтому по умолчанию мы применяем "
"защиту Strict WebWorker. Эта защита отключает WebWorkers и заменяет их "
"полифиллом."

#: ../content/posts/jsrfinal.md:block 14 (header)
msgid "Issues"
msgstr "Проблемы"

#: ../content/posts/jsrfinal.md:block 15 (paragraph)
msgid ""
"During the final stages of the NGI0 PET Fund project JSR project, we "
"investigated the consistency of the mechanisms and their real-world "
"deployment. We closed [6 issues on "
"Pagure](https://pagure.io/JShelter/webextension/issues?status=Closed&milestone=NLNet+evaluation)"
" and [13 issues on "
"Github](https://github.com/polcak/jsrestrictor/issues?q=is%3Aissue+label%3A%22NLNet+project+evaluation+phase%22+is%3Aclosed)."
msgstr ""
"На заключительных этапах проекта JSR проекта NGI0 PET Fund мы исследовали "
"согласованность механизмов и их применение в реальном мире. Мы закрыли "
"[6 вопросов на Pagure](https://pagure.io/JShelter/webextension/"
"issues?status=Closed&milestone=NLNet+evaluation) и [13 вопросов на Github]"
"(https://github.com/polcak/jsrestrictor/"
"issues?q=is%3Aissue+label%3A%22NLNet+project+evaluation+phase%22+is%3Aclosed)."
""

#: ../content/posts/jsrfinal.md:block 16 (paragraph)
msgid ""
"5 investigated issues remain open on "
"[Github](https://github.com/polcak/jsrestrictor/issues?q=is%3Aissue+label%3A%22NLNet+project+evaluation+phase%22+is%3Aopen)."
" For three we need more details or cannot reproduce the issue, two refer to "
"bugs that we are trying to fix (the issues were delegated to other JShelter "
"developer outside the JSR project)."
msgstr ""
"5 исследованных проблем остаются открытыми на [Github] (https://github.com/"
"polcak/jsrestrictor/"
"issues?q=is%3Aissue+label%3A%22NLNet+project+evaluation+phase%22+is%3Aopen). "
"Для трех нам нужно больше деталей или мы не можем воспроизвести проблему, "
"две относятся к ошибкам, которые мы пытаемся исправить (вопросы были "
"переданы другому разработчику JShelter вне проекта JSR)."

#: ../content/posts/jsrfinal.md:block 17 (paragraph)
msgid ""
"We opened [8 "
"issues](https://pagure.io/JShelter/webextension/issues?status=Open&tags=enhancement&milestone=NLNet+evaluation&close_status=)"
" that cover possible enhancement of the JShelter, future directions, and "
"possible ideas for future projects. We have additional [5 opened issues on "
"Pagure](https://pagure.io/JShelter/webextension/issues?status=Open&milestone=NLNet+evaluation&close_status=)"
" that we investigated during the evaluation phase. "
"[One](https://pagure.io/JShelter/webextension/issue/55) is a duplicate of "
"the issue opened at Github, "
"[another](https://pagure.io/JShelter/webextension/issue/37) is almost "
"closed. We are working on all 5 issues outside the JSR project."
msgstr ""
"Мы открыли [8 вопросов](https://pagure.io/JShelter/webextension/"
"issues?status=Open&tags=enhancement&milestone=NLNet+evaluation&close_status=)"
", которые касаются возможных улучшений JShelter, будущих направлений и "
"возможных идей для будущих проектов. У нас есть дополнительные "
"[5 открытых вопросов на Pagure](https://pagure.io/JShelter/webextension/"
"issues?status=Open&milestone=NLNet+evaluation&close_status=), которые мы "
"исследовали на этапе оценки. [Одна](https://pagure.io/JShelter/webextension/"
"issue/55) является дубликатом проблемы, открытой на Github, [другая](https://"
"pagure.io/JShelter/webextension/issue/37) почти закрыта. Мы работаем над "
"всеми 5 вопросами вне проекта JSR."

#: ../content/posts/jsrfinal.md:block 19 (paragraph)
msgid ""
"JShelter is not perfect, but we believe that we are heading in the right "
"direction. We want to continue to work on this project. However, be patient "
"with some issues that need time and a lot of work to be solved. The JSR "
"project and the [parallel NGI0 PET Fund "
"project](https://nlnet.nl/project/JShelter/) transformed the original "
"JavaScript Restrictor extension to JShelter, suitable for everyday "
"protection."
msgstr ""
"JShelter не идеален, но мы считаем, что движемся в правильном направлении. "
"Мы хотим продолжать работать над этим проектом. Однако будьте терпеливы к "
"некоторым проблемам, для решения которых нужно время и много работы. Проект "
"JSR и [параллельный проект NGI0 PET Fund] (https://nlnet.nl/project/JShelter/"
") преобразовали оригинальное расширение JavaScript Restrictor в JShelter, "
"пригодный для повседневной защиты."

#: ../content/posts/jsrfinal.md:block 20 (paragraph)
msgid ""
"If you have not noticed yet, we created a [FAQ section](/faq/) and the page "
"describing [JShelter threat model](/threatmodel/) during the final stages of"
" the JSR project."
msgstr ""
"Если вы еще не заметили, мы создали раздел [FAQ](/faq/) и страницу с "
"описанием [JShelter threat model](/threatmodel/) на финальных стадиях "
"проекта JSR."

#: ../content/posts/localportscanning.md:block 1 (header)
msgid ""
"title: How JShelter prevents other parties from sniffing on your local applications?\n"
"date: 2021-06-15 09:00"
msgstr ""
"Название: Как JShelter предотвращает проникновение других сторон в ваши "
"локальные приложения?\n"
"дата: 2021-06-15 09:00"

#: ../content/posts/localportscanning.md:block 2 (paragraph)
msgid ""
"We recently found a [blog post](https://blog.nem.ec/2020/05/24/ebay-port-"
"scanning/) about ThreatMetrix Inc. (a part of LexisNexis) scanning locally "
"open ports for about 30,000 web sites, including eBay. The figure below "
"shows that a browser tries to connect to ports commonly used for remote "
"access to the computer (e.g., RDesktop, VNC, TeamViewer) and other "
"applications."
msgstr ""
"Недавно мы обнаружили [запись в блоге](https://blog.nem.ec/2020/05/24/"
"ebay-port-scanning/) о том, что компания ThreatMetrix Inc. (часть LexisNexis)"
" сканирует локально открытые порты для около 30 000 веб-сайтов, включая "
"eBay. На рисунке ниже показано, что браузер пытается подключиться к портам, "
"обычно используемым для удаленного доступа к компьютеру (например, RDesktop, "
"VNC, TeamViewer) и других приложений."

#: ../content/posts/localportscanning.md:block 3 (paragraph)
msgid ""
"![A screenshot of the browser being used as a proxy to scan locally open "
"ports]({attach}/images/portscan-1_captured_traffic.png)"
msgstr ""
"![Снимок экрана браузера, используемого в качестве прокси для сканирования "
"локально открытых портов]({attach}/images/portscan-1_captured_traffic.png)"

#: ../content/posts/localportscanning.md:block 4 (paragraph)
msgid ""
"The obvious question is, what is the reason for such behaviour? The simple "
"answer is security. See additional links to [Security "
"Boulevard](https://securityboulevard.com/2020/05/is-ebay-port-scanning-your-"
"pc-probably/), [Avast](https://blog.avast.com/why-is-ebay-port-scanning-my-"
"computer-avast), and [The "
"register](https://www.theregister.com/2020/05/26/ebay_port_scans_your_pc/)."
msgstr ""
"Возникает очевидный вопрос: в чем причина такого поведения? Простой ответ - "
"безопасность. См. дополнительные ссылки на [Security Boulevard](https://"
"securityboulevard.com/2020/05/is-ebay-port-scanning-your-pc-probably/), "
"[Avast](https://blog.avast.com/why-is-ebay-port-scanning-my-computer-avast) "
"и [The register](https://www.theregister.com/2020/05/26/"
"ebay_port_scans_your_pc/)."

#: ../content/posts/localportscanning.md:block 5 (paragraph)
msgid ""
"One possibility is that ThreatMetrix creates a "
"[fingerprint](https://arxiv.org/pdf/1905.01051.pdf), and locally running "
"applications are a part of the fingerprint. Consequently, the authentication"
" algorithm stores attributes about your device(s) and compare them during "
"each log in with the previous values. Seeing that you are logging in using a"
" previously seen device, the algorithm can let you in with just a password "
"without additional proves. However, should you use a new device, the "
"algorithm might decide that additional authentication steps are required and"
" send you an SMS."
msgstr ""
"Возможно, ThreatMetrix создает [отпечаток пальца](https://arxiv.org/pdf/"
"1905.01051.pdf), и локально запущенные приложения являются частью отпечатка. "
"Следовательно, алгоритм аутентификации хранит атрибуты вашего устройства "
"(устройств) и сравнивает их при каждом входе в систему с предыдущими "
"значениями. Видя, что вы входите в систему с помощью ранее виденного "
"устройства, алгоритм может пропустить вас, введя только пароль, без "
"дополнительных доказательств. Однако если вы используете новое устройство, "
"алгоритм может решить, что требуются дополнительные шаги аутентификации, и "
"отправить вам SMS."

#: ../content/posts/localportscanning.md:block 6 (paragraph)
msgid ""
"Another option is that ThreatMetrix knows that many fraudulent activities "
"occur on devices with specific ports open. Recall that the ports being "
"checked concern remote desktop access. Having a remote desktop port open "
"means that the computer may be used by an adversary that does not sit near "
"the computer but is connected remotely. Consequently, the authentication "
"algorithm might decide that additional proves about the user identity should"
" be checked."
msgstr ""
"Другой вариант - ThreatMetrix знает, что многие мошеннические действия "
"происходят на устройствах с открытыми портами. Напомним, что проверяемые "
"порты касаются удаленного доступа к рабочему столу. Наличие открытого порта "
"удаленного рабочего стола означает, что компьютер может использоваться "
"противником, который не находится рядом с компьютером, а подключен к нему "
"удаленно. Следовательно, алгоритм аутентификации может решить, что "
"необходимо проверить дополнительные данные о личности пользователя."

#: ../content/posts/localportscanning.md:block 7 (paragraph)
msgid ""
"We do not know what the real reason behind the scanning is. It might be one "
"of the above, both, or a similar reason."
msgstr ""
"Мы не знаем, какова истинная причина сканирования. Это может быть одна из "
"вышеперечисленных причин, обе причины или что-то подобное."

#: ../content/posts/localportscanning.md:block 8 (header)
msgid "Ethical and legal issues"
msgstr "Этические и юридические вопросы"

#: ../content/posts/localportscanning.md:block 9 (paragraph)
msgid ""
"Although it could be that the underlying intentions are benign and users "
"actually do benefit from the scanning, the scanning raises some ethical "
"issues."
msgstr ""
"Несмотря на то, что, возможно, в основе сканирования лежат благие намерения "
"и пользователи действительно получают от него пользу, сканирование поднимает "
"некоторые этические вопросы."

#: ../content/posts/localportscanning.md:block 10 (paragraph)
msgid ""
"Very often, security and privacy are interconnected. But sometimes, one "
"might increase security by revealing something private. In this case, "
"ThreatMetrix learns information about the running device that is not obvious"
" to the device owner (a user or a company). Typically, the owner of the "
"device does not even know that such information can leak. If the information"
" stays with ThreatMetrix, then the benefits could appear to be greater than "
"the disadvantages. However, adversaries could stole information from "
"ThreatMetrix (see for example the [Ecquifax "
"breach](https://en.wikipedia.org/wiki/2017_Equifax_data_breach)) or the "
"company can start to [sell](https://www.vice.com/en/article/qjdkq7/avast-"
"antivirus-sells-user-browsing-data-investigation) the "
"[information](https://www.pcmag.com/news/the-cost-of-avasts-free-antivirus-"
"companies-can-spy-on-your-clicks) or even [share with "
"others](https://brave.com/rtb-evidence/)."
msgstr ""
"Очень часто безопасность и конфиденциальность взаимосвязаны. Но иногда можно "
"повысить безопасность, раскрыв что-то личное. В этом случае ThreatMetrix "
"получает информацию о работающем устройстве, которая не очевидна для "
"владельца устройства (пользователя или компании). Как правило, владелец "
"устройства даже не подозревает, что такая информация может утечь. Если "
"информация остается у ThreatMetrix, то может показаться, что преимуществ "
"больше, чем недостатков. Однако злоумышленники могут украсть информацию у "
"ThreatMetrix (см., например, [утечку информации из Ecquifax](https://"
"en.wikipedia.org/wiki/2017_Equifax_data_breach)) или компания может начать "
"[продавать](https://www.vice.com/en/article/qjdkq7/avast-antivirus-sells-"
"user-browsing-data-investigation) [информацию](https://www.pcmag.com/news/"
"the-cost-of-avasts-free-antivirus-companies-can-spy-on-your-clicks) или даже "
"[делиться с другими](https://brave.com/rtb-evidence/)."

#: ../content/posts/localportscanning.md:block 11 (paragraph)
msgid ""
"So is the scanning and data collecting legal? As some of our developers and "
"users are based in the EU, we will dig into the EU perspective. You might "
"want to consult your local laws if you are outside the EU. Moreover, as we "
"are not lawyers, you might want to consult one even in the EU."
msgstr ""
"Так законно ли сканирование и сбор данных? Поскольку некоторые из наших "
"разработчиков и пользователей находятся в ЕС, мы рассмотрим ситуацию с точки "
"зрения ЕС. Если вы находитесь за пределами ЕС, вам лучше обратиться к "
"местному законодательству. Более того, поскольку мы не являемся юристами, "
"вы, возможно, захотите проконсультироваться с одним из них даже в ЕС."

#: ../content/posts/localportscanning.md:block 12 (paragraph)
msgid ""
"[EU ePrivacy Directive](https://eur-lex.europa.eu/legal-"
"content/EN/ALL/?uri=CELEX:32002L0058) applies. However, as [WP29 "
"clarified](https://ec.europa.eu/justice/article-29/documentation/opinion-"
"recommendation/files/2014/wp224_en.pdf) (use case 7.5), user-centric "
"security can be viewed as strictly necessary to provide the service. So it "
"seems likely that port scanning for security reasons would trigger the "
"ePrivacy exception and user consent is not necessary."
msgstr ""
"[EU ePrivacy Directive](https://eur-lex.europa.eu/legal-content/EN/ALL/"
"?uri=CELEX:32002L0058) применяется. Однако, как уточняет [WP29](https://"
"ec.europa.eu/justice/article-29/documentation/opinion-recommendation/files/"
"2014/wp224_en.pdf) (пример использования 7.5), безопасность, ориентированная "
"на пользователя, может рассматриваться как строго необходимая для "
"предоставления услуги. Поэтому представляется вероятным, что сканирование "
"портов в целях безопасности будет включать исключение ePrivacy, и согласие "
"пользователя не требуется."

#: ../content/posts/localportscanning.md:block 13 (paragraph)
msgid ""
"As the port scanning is a part of the login mechanism, open ports are "
"personal data without doubts. So GDPR also applies. GDPR also list security "
"as a possible legitimate interest of a data controller (e.g. eBay), see "
"recital 49. Nevertheless, if such a scan is proportionate is an open "
"question; it is possible that the legitimate interests of data controllers "
"(such as eBay) are overriden by the interests or fundamental rights and "
"freedoms of the data subject (you), see Article(6)(1)(f). The Court of "
"Justice of EU (CJEU) decided several issues that concerned legitimate "
"interests and the necessity of processing, e.g. [C-13/16, point 30 that also"
" points to other related "
"cases](https://curia.europa.eu/juris/liste.jsf?num=C-13/16) or [C-708/18 "
"points 40–45](https://curia.europa.eu/juris/liste.jsf?num=C-708/18). It "
"might be possible that it is strictly necessary for eBay to perform local "
"port scanning."
msgstr ""
"Поскольку сканирование портов является частью механизма входа в систему, "
"открытые порты, несомненно, являются персональными данными. Поэтому GDPR "
"также применяется. GDPR также перечисляет безопасность в качестве возможного "
"законного интереса контроллера данных (например, eBay), см. главу 49. Тем не "
"менее, вопрос о том, является ли такое сканирование соразмерным, остается "
"открытым; возможно, что законные интересы контролеров данных (например, eBay)"
" преобладают над интересами или фундаментальными правами и свободами "
"субъекта данных (вас), см. статью (6)(1)(f). Суд ЕС (CJEU) решил несколько "
"вопросов, касающихся законных интересов и необходимости обработки, например, "
"[C-13/16, пункт 30, который также указывает на другие связанные дела]"
"(https://curia.europa.eu/juris/liste.jsf?num=C-13/16) или "
"[C-708/18 пункты 40-45](https://curia.europa.eu/juris/liste.jsf?num=C-708/18)"
". Возможно, eBay строго необходимо выполнять локальное сканирование портов."

#: ../content/posts/localportscanning.md:block 14 (paragraph)
msgid ""
"Nevertheless, Article 12-14 of GDPR lists requirements on the information "
"that a data controller should reveal to each data subject before the data "
"processing starts or in a reasonable time afterwards. Hence, each controller"
" employing ThreatMetrix should reveal, for example, in the privacy policy, "
"what categories of data it is using and for which purposes. From the "
"[linked](https://blog.avast.com/why-is-ebay-port-scanning-my-computer-avast)"
" "
"[articles](https://www.theregister.com/2020/05/26/ebay_port_scans_your_pc/),"
" it seems that ThreatMetrix and eBay are secretive about data being "
"collected."
msgstr ""
"Тем не менее, в статьях 12-14 GDPR перечислены требования к информации, "
"которую контролер данных должен предоставить каждому субъекту данных до "
"начала обработки данных или в разумный срок после нее. Таким образом, каждый "
"контроллер, использующий ThreatMetrix, должен раскрыть, например, в политике "
"конфиденциальности, какие категории данных он использует и для каких целей. "
"Из [ссылок](https://blog.avast.com/why-is-ebay-port-scanning-my-computer-"
"avast) [статей](https://www.theregister.com/2020/05/26/"
"ebay_port_scans_your_pc/) следует, что ThreatMetrix и eBay скрывают "
"собираемые данные."

#: ../content/posts/localportscanning.md:block 15 (paragraph)
msgid ""
"Another GDPR issue might be data transfers to third countries. Data "
"transfers of open ports may not be compatible with GDPR in the light of the "
"[CJEU C-311/18](https://curia.europa.eu/juris/liste.jsf?num=C-311/18) "
"decision if the information leaves EEA."
msgstr ""
"Еще одним вопросом GDPR может стать передача данных в третьи страны. "
"Передача данных через открытые порты может быть несовместима с GDPR в свете "
"решения [CJEU C-311/18](https://curia.europa.eu/juris/liste.jsf?num=C-311/18)"
", если информация покидает пределы ЕЭЗ."

#: ../content/posts/localportscanning.md:block 16 (header)
msgid ""
"Why is not my browser protecting me from remote servers accessing local "
"information?"
msgstr ""
"Почему мой браузер не защищает меня от удаленных серверов, получающих доступ "
"к локальной информации?"

#: ../content/posts/localportscanning.md:block 17 (paragraph)
msgid ""
"OK, so even though the scanning could be legal, one can disagree that others"
" should be allowed to sniff on local applications. So why does a browser "
"leak the information?"
msgstr ""
"Ладно, даже если сканирование может быть законным, можно не согласиться с "
"тем, что другим должно быть позволено подглядывать за локальными "
"приложениями. Так почему же браузер сливает информацию?"

#: ../content/posts/localportscanning.md:block 18 (paragraph)
msgid ""
"Well, the browser employs so called [same origin "
"policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-"
"origin_policy) (SOP) that in abstract theory should prevent websites from "
"the scans in question. As your local computer is of a different origin from "
"the remote website, your computer should be protected by SOP. Nevertheless, "
"SOP has its limitations. First of all, some [cross-origin resource "
"sharing](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is "
"beneficial, so the browser cannot block outgoing requests to other origins. "
"Such behaviour opens possibilities for [side-"
"channels](https://www.forcepoint.com/sites/default/files/resources/files/report-"
"attacking-internal-network-en_0.pdf) to be identified. So even though the "
"web page cannot communicate with applications on your computer (or in your "
"network) without the cooperation of these applications, it can observe the "
"behaviour and make some conclusions based on the observed errors, timing, "
"etc."
msgstr ""
"Браузер использует так называемую [политику одинакового происхождения]"
"(https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy) "
"(SOP), которая в абстрактной теории должна предотвращать веб-сайты из "
"рассматриваемых сканов. Поскольку ваш локальный компьютер имеет другое "
"происхождение, чем удаленный сайт, ваш компьютер должен быть защищен SOP. "
"Тем не менее, SOP имеет свои ограничения. Во-первых, некоторый "
"[кросс-оригинальный обмен ресурсами](https://developer.mozilla.org/en-US/"
"docs/Web/HTTP/CORS) выгоден, поэтому браузер не может блокировать исходящие "
"запросы к другим источникам. Такое поведение открывает возможности для "
"выявления [побочных каналов](https://www.forcepoint.com/sites/default/files/"
"resources/files/report-attacking-internal-network-en_0.pdf). Таким образом, "
"хотя веб-страница не может взаимодействовать с приложениями на вашем "
"компьютере (или в вашей сети) без сотрудничества с ними, она может наблюдать "
"за их поведением и делать некоторые выводы на основе наблюдаемых ошибок, "
"времени и т. д."

#: ../content/posts/localportscanning.md:block 19 (paragraph)
msgid ""
"An (ad) blocker can prevent you from the activity. As the blockers typically"
" leverage blocklists, such a port scanning script URL needs to match a rule "
"in a block list. Once information about a misbehaving script becomes public,"
" a rule can be added to a block list. However, this could take some time. "
"Additional techniques like [DNS de-"
"cloaking](https://blog.lukaszolejnik.com/large-scale-analysis-of-dns-based-"
"tracking-evasion-broad-data-leaks-included/) need to be applied in this "
"case."
msgstr ""
"Блокировщик (рекламы) может помешать вам в этой деятельности. Поскольку "
"блокировщики обычно используют списки блокировки, URL-адрес скрипта "
"сканирования портов должен соответствовать правилу в списке блокировки. Как "
"только информация о плохом скрипте станет общедоступной, правило может быть "
"добавлено в список блокировки. Однако это может занять некоторое время. В "
"этом случае необходимо применить дополнительные методы, такие как "
"[DNS de-cloaking](https://blog.lukaszolejnik.com/"
"large-scale-analysis-of-dns-based-tracking-evasion-broad-data-leaks-included/"
")."

#: ../content/posts/localportscanning.md:block 20 (header)
msgid "Network Boundary Shield to the rescue"
msgstr "Граничный щит сети на помощь"

#: ../content/posts/localportscanning.md:block 21 (paragraph)
msgid ""
"JShelter contains a Network Boundary Shield (NBS) that blocks outgoing "
"browser requests based on the observed behaviour, i.e. a page hosted on "
"public internet tries to access local URLs. NBS just works and cannot be "
"fooled by changes in the URL path, DNS cloaking or other techniques."
msgstr ""
"JShelter содержит Network Boundary Shield (NBS), который блокирует исходящие "
"запросы браузера, основываясь на наблюдаемом поведении, т.е. страница, "
"размещенная в публичном интернете, пытается получить доступ к локальным URL. "
"NBS просто работает и не может быть обманут изменением пути URL, маскировкой "
"DNS или другими техниками."

#: ../content/posts/localportscanning.md:block 22 (paragraph)
msgid ""
"![JShelter blocks the scan]({attach}/images/portscan-2_request_blocked.png)"
msgstr ""
"![JShelter блокирует сканирование]({attach}/images/portscan-"
"2_request_blocked.png)"

#: ../content/posts/localportscanning.md:block 23 (paragraph)
msgid ""
"Firefox contains DNS API, so NBS works flawlessly. In Chromium-based "
"browsers, the exact blocking behaviour depends on how quickly a scanning "
"script can fire the requests and the precise destination (IP address or a "
"domain name). Depending on the interaction with DNS, NBS can be side-stepped"
" on Chrome. In this case, ThreatMetrix does not try any evasion technique, "
"so NBS just works in the case of eBay and ThreatMetrix."
msgstr ""
"Firefox содержит DNS API, поэтому NBS работает безупречно. В браузерах на "
"базе Chromium точное поведение блокировки зависит от скорости выполнения "
"запросов сканирующим скриптом и точного назначения (IP-адрес или доменное "
"имя). В зависимости от взаимодействия с DNS, NBS может быть обойдена "
"стороной в Chrome. В этом случае ThreatMetrix не пытается использовать какие-"
"либо методы обхода, поэтому NBS просто работает в случае с eBay и "
"ThreatMetrix."

#: ../content/posts/mv3.md:block 1 (header)
msgid ""
"title: What is Manifest v3 and how it affects JShelter\n"
"date: 2023-11-01 12:00\n"
"Series: Manifest v3"
msgstr ""
"Заголовок: Что такое Manifest v3 и как он влияет на JShelter\n"
"дата: 2023-11-01 12:00\n"
"Серия: Манифест v3"

#: ../content/posts/mv3.md:block 2 (paragraph)
msgid ""
"Over the years, privacy and security-oriented browser extensions in the same"
" category of JShelter (e.g. uBlock or NoScript, whose code is partially "
"inherited by JShelter through the NoScript Commons Library), have been "
"forced into multiple complex refactorings and modernizations, including "
"complete rewrites such as those [required by the transition from Mozilla's "
"original flexible XUL/XPCOM technology](https://yoric.github.io/post/why-"
"did-mozilla-remove-xul-addons/) to the more limiting [WebExtensions "
"API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-"
"ons/WebExtensions), largely copied from [Google Chrome's Extensions "
"API](https://developer.chrome.com/docs/extensions/reference/)."
msgstr ""
"За прошедшие годы браузерные расширения, ориентированные на "
"конфиденциальность и безопасность и относящиеся к той же категории, что и "
"JShelter (например, uBlock или NoScript, код которых частично унаследован "
"JShelter через библиотеку NoScript Commons Library), были вынуждены "
"проводить множество сложных рефакторингов и модернизаций, включая полную "
"переработку, как, например, в случае перехода от первоначальной гибкой "
"технологии XUL/XPCOM компании Mozilla](https://yoric.github.io/post/"
"why-did-mozilla-remove-xul-addons/) к более ограниченному [WebExtensions API]"
"(https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions), во "
"многом скопированному с [Extensions API Google Chrome](https://"
"developer.chrome.com/docs/extensions/reference/)."

#: ../content/posts/mv3.md:block 3 (paragraph)
msgid ""
"During the past 2 years, the [Manifest V3 "
"API](https://developer.chrome.com/docs/extensions/mv3/intro/) (\"MV3\" from "
"now on) has been aggressively pushed by Google as the successor of the "
"current semi-unified browser extensions APIs (known as Manifest V2 or "
"\"MV2\")."
msgstr ""
"В течение последних двух лет компания Google активно продвигала "
"[Manifest V3 API](https://developer.chrome.com/docs/extensions/mv3/intro/) ("
"\"MV3\") в качестве преемника нынешнего полуунифицированного API расширений "
"браузеров (известного как Manifest V2 или \"MV2\")."

#: ../content/posts/mv3.md:block 4 (paragraph)
msgid ""
"MV3 comes with renewed migration challenges, made worse by its "
"*incompleteness* and apparent [hostility against privacy and security use "
"cases](https://www.eff.org/deeplinks/2021/12/chrome-users-beware-"
"manifest-v3-deceitful-and-threatening>)."
msgstr ""
"MV3 вновь столкнулся с проблемами миграции, которые усугубляются его "
"*неполнотой* и очевидной [враждебностью к случаям использования в целях "
"конфиденциальности и безопасности] (https://www.eff.org/deeplinks/2021/12/"
"chrome-users-beware-manifest-v3-deceitful-and-threatening>)."

#: ../content/posts/mv3.md:block 5 (paragraph)
msgid ""
"Let's have a look at some threats that the MV3 specification poses to "
"JShelter and other security and privacy-oriented extensions:"
msgstr ""
"Давайте рассмотрим некоторые угрозы, которые спецификация MV3 представляет "
"для JShelter и других расширений, ориентированных на безопасность и "
"конфиденциальность:"

#: ../content/posts/mv3.md:block 6 (unordered list)
msgid ""
"The new content script injection APIs are promising on paper, thanks also to"
" [specific](https://bugs.chromium.org/p/chromium/issues/detail?id=1128112) "
"[requests](https://bugs.chromium.org/p/chromium/issues/detail?id=1180659) "
"for "
"[enhancements](https://bugs.chromium.org/p/chromium/issues/detail?id=1180659#c5)"
" [coming](https://bugs.chromium.org/p/chromium/issues/detail?id=1054624#c19)"
" from [us](https://github.com/w3c/webextensions/issues/402), but their "
"implementation is still incomplete and buggy."
msgstr ""
"Новые API для инъекций скриптов контента многообещающи на бумаге, в том "
"числе благодаря [конкретным](https://bugs.chromium.org/p/chromium/issues/"
"detail?id=1128112) [запросам](https://bugs.chromium.org/p/chromium/issues/"
"detail?id=1180659) на [улучшения](https://bugs.chromium.org/p/chromium/"
"issues/detail?id=1180659#c5) [приходящие](https://bugs.chromium.org/p/"
"chromium/issues/detail?id=1054624#c19) от [нас](https://github.com/w3c/"
"webextensions/issues/402), но их реализация все еще не завершена и содержит "
"ошибки."

#: ../content/posts/mv3.md:block 6 (unordered list)
msgid ""
"The removal of the blocking capabilities of the `webRequest` API excludes "
"any runtime [algorithmic "
"flexibility](https://lists.nongnu.org/archive/html/js-"
"shield/2021-02/msg00009.html) to [analyze and "
"manipulate](https://bugs.chromium.org/p/chromium/issues/detail?id=896897#c23)"
" the network traffic."
msgstr ""
"Устранение блокирующих возможностей API `webRequest` исключает возможность "
"использования [алгоритмической гибкости](https://lists.nongnu.org/archive/"
"html/js-shield/2021-02/msg00009.html) для [анализа и манипулирования]"
"(https://bugs.chromium.org/p/chromium/issues/detail?id=896897#c23) сетевым "
"трафиком."

#: ../content/posts/mv3.md:block 6 (unordered list)
msgid ""
"The new `declarativeNetRequest` API should replace the `webRequest` API. But"
" it is triggered by a [limited number of basic URL-matching "
"rules](https://github.com/w3c/webextensions/issues/394), which are easy to "
"bypass for malicious actors"
msgstr ""
"Новый API `declarativeNetRequest` должен заменить API `webRequest`. Но он "
"запускается [ограниченным числом базовых правил сопоставления URL](https://"
"github.com/w3c/webextensions/issues/394), которые легко обойти "
"злоумышленникам"

#: ../content/posts/mv3.md:block 6 (unordered list)
msgid ""
"The forced switch of extensions' main logic from a persistent and stateful "
"background process (MV2) to an ephemeral and stateless service worker "
"(which, by MV3's design, can be killed at any time) hampers the ability of "
"security extensions to promptly counter-react synchronous events such as the"
" start of a page script execution and dramatically impacts any extension of "
"medium complexity, now forced to reconstruct its state from slow "
"asynchronous storage every time its service worker gets woken up by user "
"interaction or network events."
msgstr ""
"Принудительное переключение основной логики расширений с постоянного "
"фонового процесса с состоянием (MV2) на эфемерный сервис-работник без "
"состояния (который, согласно дизайну MV3, может быть убит в любой момент) "
"ограничивает способность расширений безопасности оперативно реагировать на "
"синхронные события, такие как начало выполнения сценария страницы, и "
"существенно влияет на любое расширение средней сложности, которое теперь "
"вынуждено восстанавливать свое состояние из медленного асинхронного "
"хранилища каждый раз, когда его сервис-работник пробуждается в результате "
"взаимодействия с пользователем или сетевых событий."

#: ../content/posts/mv3.md:block 7 (paragraph)
msgid ""
"These and other technical problems are making the transition extremely "
"painful to privacy and security-oriented browser extensions, and more in "
"general those aimed to change the browser's default behavior in restrictive "
"/ protective directions or just give back some agency to the users rather "
"than prioritize the will of web authors, advertisers, and trackers."
msgstr ""
"Эти и другие технические проблемы делают переход крайне болезненным для "
"расширений для браузеров, ориентированных на приватность и безопасность, и "
"вообще тех, которые призваны изменить поведение браузера по умолчанию в "
"ограничительных/защитных направлениях или просто вернуть пользователям часть "
"полномочий, а не отдавать приоритет воле веб-авторов, рекламодателей и "
"трекеров."

#: ../content/posts/mv3.md:block 8 (paragraph)
msgid "Further factors make any migration route even harder:"
msgstr "Дополнительные факторы еще больше усложняют любой миграционный маршрут:"

#: ../content/posts/mv3.md:block 9 (ordered list)
msgid ""
"*MV2 and MV3 API access is mutually exclusive*, meaning that we cannot pick "
"\"the best tool for the task\" during the transition. Therefore, web "
"developers are forced to maintain multiple versions, i.e. MV2-based for the "
"general public and MV3-based for early adopters/testers willing to bear with"
" bugs and missing features until MV3 is good enough."
msgstr ""
"*Доступ к API MV2 и MV3 является взаимоисключающим*, что означает, что мы не "
"можем выбрать \"лучший инструмент для решения задачи\" во время перехода. "
"Поэтому веб-разработчики вынуждены поддерживать несколько версий, т.е. MV2 "
"для широкой публики и MV3 для ранних последователей/тестеров, готовых "
"терпеть ошибки и недостающие функции, пока MV3 не станет достаточно хорошей."

#: ../content/posts/mv3.md:block 9 (ordered list)
msgid ""
"*MV3 is far from having any finalized shape or roadmap*, despite the "
"relentless efforts to make it more viable from extensions developers, "
"including myself, convening with browser vendors in [W3C's Web Extensions "
"Community Group](https://www.w3.org/groups/cg/webextensions) (WECG)."
msgstr ""
"*MV3 еще далека от окончательного формирования или дорожной карты*, несмотря "
"на неустанные усилия разработчиков расширений, в том числе и меня, "
"направленные на повышение ее жизнеспособности совместно с производителями "
"браузеров в [W3C's Web Extensions Community Group](https://www.w3.org/groups/"
"cg/webextensions) (WECG)."

#: ../content/posts/mv3.md:block 9 (ordered list)
msgid ""
"There's still *no stable, feature-complete and reliable MV3 API "
"implementation* for moderately complex extensions to experiment with."
msgstr ""
"До сих пор не существует *стабильной, полной и надежной реализации MV3 API* "
"для экспериментов с умеренно сложными расширениями."

#: ../content/posts/mv3.md:block 9 (ordered list)
msgid ""
"Its actual implementations suffer from *fragmentation and countless "
"incompatibilities*, for the better or the worse, across browser vendors "
"adopting it, including Mozilla, Microsoft and Apple."
msgstr ""
"Его фактическая реализация страдает от *фрагментации и бесчисленных "
"несовместимостей*, как в лучшую, так и в худшую сторону, у всех "
"производителей браузеров, использующих его, включая Mozilla, Microsoft и "
"Apple."

#: ../content/posts/mv3.md:block 10 (paragraph)
msgid ""
"Notwithstanding the aforementioned critical issues, one year ago, Google "
"announced a bellicose [timeline to extinguish \"legacy\" MV2 "
"extensions](https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/), "
"starting with a \"soft\" deprecation on the 1st of January 2023 but quickly "
"ramping up to enterprise-only support in June and complete extermination by "
"the end of the year, except for [backpedalling at the last "
"moment](https://arstechnica.com/gadgets/2022/12/chrome-delays-plan-to-limit-"
"ad-blockers-new-timeline-coming-in-march/), putting those dates \"under "
"review until March\" with the admission that an API still in such a bad "
"shape prevents too many extensions (even outside the controversial realm of "
"content blockers) from migrating."
msgstr ""
"Несмотря на вышеупомянутые критические проблемы, год назад компания Google "
"объявила воинственный [график уничтожения \"старых\" расширений MV2] "
"(https://developer.chrome.com/docs/extensions/mv3/mv2-sunset/), начав с "
"\"мягкой\" депривации 1 января 2023 года, но быстро наращивая темпы до "
"поддержки только для предприятий в июне и полного уничтожения к концу года, "
"за исключением [отступления в последний момент] (https://arstechnica. com/"
"gadgets/2022/12/"
"chrome-delays-plan-to-limit-ad-blockers-new-timeline-coming-in-march/), "
"поставив эти даты \"на пересмотр до марта\", признав, что API, все еще "
"находящийся в таком плохом состоянии, не позволяет переместить слишком много "
"расширений (даже вне спорной сферы блокировщиков контента)."

#: ../content/posts/mv3.md:block 11 (paragraph)
msgid ""
"In our project, we're seeking to navigate the uncertainty of Manifest V3 "
"transition towards a successful outcome, trying to stay compatible with as "
"many browsers as possible, preserving as many features as possible, through "
"different interventions, some sequential, some parallel:"
msgstr ""
"В нашем проекте мы пытаемся преодолеть неопределенность перехода на Manifest "
"V3 и добиться успешного результата, стараясь сохранить совместимость с как "
"можно большим количеством браузеров, сохраняя как можно больше возможностей, "
"с помощью различных действий, некоторые из которых последовательны, "
"некоторые параллельны:"

#: ../content/posts/mv3.md:block 12 (ordered list)
msgid ""
"actively participating in the ongoing *browser extensions API design work* "
"of the [Web Extensions Community "
"Group](https://www.w3.org/groups/cg/webextensions), in order to steer the "
"MV3 specification in the most favorable direction for security and privacy "
"use cases;"
msgstr ""
"активное участие в текущей работе [Web Extensions Community Group](https://"
"www.w3.org/groups/cg/webextensions) по разработке API расширений браузеров, "
"чтобы направить спецификацию MV3 в наиболее благоприятное для безопасности и "
"конфиденциальности русло;"

#: ../content/posts/mv3.md:block 12 (ordered list)
msgid ""
"publishing a *MV3-compatible JShelter prototype* as much feature complete "
"and cross-browser compatible as possible, and developed/distributed/tested "
"separately from the MV2 version aimed at the general public;"
msgstr ""
"публикация *MV3-совместимого прототипа JShelter*, как можно более полного по "
"функциям и кросс-браузерного совместимого, и "
"разработанного/распространенного/тестируемого отдельно от MV2-версии, "
"предназначенной для широкой публики;"

#: ../content/posts/mv3.md:block 12 (ordered list)
msgid ""
"simultaneously advocating for, keeping track of and taking advantage of "
"*useful API changes* (even if browser-specific) to improve the MV3-based "
"prototype;"
msgstr ""
"одновременно отстаивать, отслеживать и использовать *полезные изменения API* "
"(даже если они специфичны для браузера) для улучшения прототипа на базе MV3;"

#: ../content/posts/mv3.md:block 12 (ordered list)
msgid ""
"*sharing the results with other extension developers* through the [NoScript "
"Commons Library](https://noscript.net/commons-library); the compatibility "
"layer eases the migration work for other developers."
msgstr ""
"*обмен результатами с другими разработчиками расширений* через "
"[NoScript Commons Library](https://noscript.net/commons-library); слой "
"совместимости облегчает работу по миграции для других разработчиков."

#: ../content/posts/optimizations.md:block 1 (header)
msgid ""
"title: Recent improvements in JShelter performance\n"
"date: 2023-09-21 15:00"
msgstr ""
"Название: Последние улучшения в производительности JShelter\n"
"дата: 2023-09-21 15:00"

#: ../content/posts/optimizations.md:block 2 (paragraph)
msgid ""
"You might have noticed that [recent versions](/versions/#015/) improved "
"JShelter performance. This blog post explains the improvements in more "
"detail and contains graphs. The improvements are based on the [bachelor "
"thesis of Martin Zmitko](https://www.vut.cz/en/students/final-"
"thesis/detail/147218). If you are interested in this topic, you will find "
"more information in the thesis. We thank Martin for his work and his "
"proposals."
msgstr ""
"Вы могли заметить, что в [последних версиях](/versions/#015/) улучшена "
"производительность JShelter. Эта запись в блоге объясняет улучшения более "
"подробно и содержит графики. Улучшения основаны на "
"[бакалаврской работе Мартина Змитко](https://www.vut.cz/en/students/"
"final-thesis/detail/147218). Если вам интересна эта тема, вы найдете больше "
"информации в диссертации. Мы благодарим Мартина за его работу и предложения."

#: ../content/posts/optimizations.md:block 4 (header)
msgid "1. The code inserted into each page"
msgstr "1. Код, вставляемый в каждую страницу"

#: ../content/posts/optimizations.md:block 5 (paragraph)
msgid ""
"Archaic versions of JShelter (at that time JavaScript Restrictor) generated "
"the wrapping code during each page load (in so-called content scripts). "
"However, we still needed to solve the reliable code injection at that time. "
"We wanted the lowest amount of work in content script. So, JShelter started "
"to generate the code in the background and send the generated code to the "
"content script."
msgstr ""
"Архаичные версии JShelter (в то время JavaScript Restrictor) генерировали "
"код-обертку при каждой загрузке страницы (в так называемых контентных "
"скриптах). Однако на тот момент нам все еще требовалось решить проблему "
"надежной инъекции кода. Мы хотели, чтобы в контент-скрипте было как можно "
"меньше работы. Поэтому JShelter стал генерировать код в фоновом режиме и "
"отправлять сгенерированный код в контент-скрипт."

#: ../content/posts/optimizations.md:block 6 (paragraph)
msgid ""
"Starting from [0.5](/versions/#015/), NSCL solved the reliable code "
"injection. The preferred and fast solution is to inject the configuration in"
" the `BeforeNavigate` event handler. However, there is a race condition "
"between the `BeforeNavigate` event and `document_start` phase of the page "
"load. If the script detects that the configuration is not available during "
"the `document_start`, it initiates a synchronous request to retrieve the "
"configuration before page scripts start running."
msgstr ""
"Начиная с версии [0.5](/versions/#015/), в NSCL решена проблема надежной "
"инъекции кода. Предпочтительным и быстрым решением является внедрение "
"конфигурации в обработчик события `BeforeNavigate`. Однако существует "
"условие гонки между событием `BeforeNavigate` и фазой `document_start` "
"загрузки страницы. Если скрипт обнаружит, что конфигурация недоступна во "
"время `document_start`, он инициирует синхронный запрос на получение "
"конфигурации до того, как начнут выполняться скрипты страницы."

#: ../content/posts/optimizations.md:block 7 (paragraph)
msgid ""
"However, Martin realized that a synchronous request takes a long time. "
"Moreover, he confirmed [our old "
"observations](https://pagure.io/JShelter/webextension/issue/46#comment-793783)"
" that the synchronous request is needed very often. The time needed to "
"process the configuration increases linearly with the size of the "
"configuration. JShelter used to inject 572kB of code in the default "
"configuration. By shifting the code generation process back to content "
"scripts, we decreased the configuration size to 21.2kB."
msgstr ""
"Однако Мартин понял, что синхронный запрос занимает много времени. Более "
"того, он подтвердил [наши старые наблюдения](https://pagure.io/JShelter/"
"webextension/issue/46#comment-793783), что синхронный запрос нужен очень "
"часто. Время, необходимое для обработки конфигурации, увеличивается линейно "
"с ростом ее размера. В конфигурации по умолчанию JShelter использовал 572 КБ "
"кода. Переложив процесс генерации кода на скрипты контента, мы уменьшили "
"размер конфигурации до 21,2 КБ."

#: ../content/posts/optimizations.md:block 8 (paragraph)
msgid ""
"During the work, we also optimized the code-generating process and "
"eliminated duplicates in the code as well as Firefox-specific code in "
"Chromium-based browsers."
msgstr ""
"В ходе работы мы также оптимизировали процесс генерации кода и устранили "
"дубликаты в коде, а также код, специфичный для Firefox, в браузерах на базе "
"Chromium."

#: ../content/posts/optimizations.md:block 9 (header)
msgid "2. Improvements to little-lies"
msgstr "2. Улучшения для маленьких лжецов"

#: ../content/posts/optimizations.md:block 10 (paragraph)
msgid ""
"As you probably know, the [anti-fingerprinting code](/farbling/) modifies "
"the results of some APIs with little lies. However, that approach is "
"performance-heavy for some APIs. The most critical are APIs that read from "
"canvas (`readPixels` and `toDataURL`) and `AudioBuffer.getChannelData`. For "
"example, the original `getChannelData` passes a reference to the underlying "
"buffer, so the browser does not need to do any computation. But JShelter "
"needs to copy each item, determine how to apply the lies (ensuring "
"consistent lies to the same data) and modify selected items."
msgstr ""
"Как вы, вероятно, знаете, код [anti-fingerprinting code](/farbling/) "
"изменяет результаты работы некоторых API с помощью небольшой лжи. Однако для "
"некоторых API такой подход отнимает много производительности. Наиболее "
"критичными являются API, читающие с холста (`readPixels` и `toDataURL`) и "
"`AudioBuffer.getChannelData`. Например, оригинальный `getChannelData` "
"передает ссылку на базовый буфер, поэтому браузеру не нужно выполнять "
"никаких вычислений. Однако JShelter необходимо скопировать каждый элемент, "
"определить, как применить ложь (обеспечивая последовательную ложь к одним и "
"тем же данным), и изменить выбранные элементы."

#: ../content/posts/optimizations.md:block 11 (paragraph)
msgid ""
"Martin discovered that the JShelter modifications to `readPixels`, "
"`toDataURL`, and `getChannelData` can benefit from a different iterator. "
"More importantly, Martin proposed to translate the code to WebAssembly, "
"which runs much faster."
msgstr ""
"Мартин обнаружил, что модификации JShelter для `readPixels`, `toDataURL` и "
"`getChannelData` могут выиграть от использования другого итератора. Что еще "
"более важно, Мартин предложил перевести код на WebAssembly, который работает "
"гораздо быстрее."

#: ../content/posts/optimizations.md:block 12 (header)
msgid "3. Improvements to FPD"
msgstr "3. Улучшения в FPD"

#: ../content/posts/optimizations.md:block 13 (paragraph)
msgid ""
"[Fingerprint detector](/fpd/) collects information on each call of the APIs "
"that are often misused for fingerprinting. Martin discovered that some "
"serializations performed during its operations are not really needed."
msgstr ""
"[Детектор отпечатков пальцев](/fpd/) собирает информацию о каждом вызове "
"API, которые часто используются не по назначению для снятия отпечатков "
"пальцев. Мартин обнаружил, что некоторые сериализации, выполняемые во время "
"его работы, на самом деле не нужны."

#: ../content/posts/optimizations.md:block 14 (header)
msgid "4. Other optimizations"
msgstr "4. Другие оптимизации"

#: ../content/posts/optimizations.md:block 15 (paragraph)
msgid ""
"Martin also implemented several other performance improvements, some aiming "
"at NSCL and not only JShelter. For example, NSCL included a JavaScript "
"library to compute SHA-256, while native `SubtleCrypto` implementation is "
"faster."
msgstr ""
"Мартин также реализовал несколько других улучшений производительности, "
"некоторые из которых были направлены не только на JShelter, но и на NSCL. "
"Например, в NSCL включена библиотека JavaScript для вычисления SHA-256, в то "
"время как родная реализация `SubtleCrypto` работает быстрее."

#: ../content/posts/optimizations.md:block 16 (header)
msgid "5. Results"
msgstr "5. Результаты"

#: ../content/posts/optimizations.md:block 17 (paragraph)
msgid ""
"First, let us have a look at Firefox and the improvements in 2D Canvas in "
"`getImageData()` (note that the y-axis is logarithmic):"
msgstr ""
"Сначала давайте посмотрим на Firefox и улучшения в 2D Canvas в "
"`getImageData()` (обратите внимание, что ось y является логарифмической):"

#: ../content/posts/optimizations.md:block 18 (paragraph)
msgid ""
"![Performance of getImageData in "
"Firefox]({attach}/images/optimizations/firefox_canvas_recommended.png)"
msgstr ""
"![Производительность getImageData в Firefox]({attach}/images/optimizations/"
"firefox_canvas_recommended.png)"

#: ../content/posts/optimizations.md:block 19 (paragraph)
msgid ""
"As expected, the optimized implementation is slower than the original "
"because it needs much more work. Even so, the performance hit is several "
"magnitudes lower than the hit in 0.12.2."
msgstr ""
"Как и ожидалось, оптимизированная реализация медленнее оригинальной, потому "
"что ей требуется гораздо больше работы. Но даже в этом случае снижение "
"производительности в несколько раз меньше, чем в 0.12.2."

#: ../content/posts/optimizations.md:block 20 (paragraph)
msgid ""
"Now, let us have a look the improvements in 3D Canvas in `readPixels()` "
"(this time, we show the graph with the linear y-axis, the shape of the "
"points depicting the performance is similar for 2D and 3D canvas):"
msgstr ""
"Теперь давайте посмотрим на улучшения в 3D Canvas в `readPixels()` (на этот "
"раз мы показываем график с линейной осью y, форма точек, отображающих "
"производительность, одинакова для 2D и 3D canvas):"

#: ../content/posts/optimizations.md:block 21 (paragraph)
msgid ""
"![Performance of readPixels in "
"Firefox]({attach}/images/optimizations/firefox_canvas3d_recommended.png)"
msgstr ""
"![Производительность readPixels в Firefox]({attach}/images/optimizations/"
"firefox_canvas3d_recommended.png)"

#: ../content/posts/optimizations.md:block 22 (paragraph)
msgid ""
"See that the original implementation quickly leaves the plotted range. Its "
"performance hit was more significant than the 2D version while starting from"
" 0.14, the performance hit of 2D and 3D canvases are comparable."
msgstr ""
"Видно, что оригинальная реализация быстро выходит за пределы построенного "
"диапазона. Удар по производительности был более значительным, чем у 2D-"
"версии, в то время как начиная с 0.14, удар по производительности 2D- и 3D-"
"полотна сравнимы."

#: ../content/posts/optimizations.md:block 23 (paragraph)
msgid ""
"Firefox implementation of `getChannelData` has a negligible running time "
"(almost 0). The following figure shows that the little lies are computed "
"much quicker (about two orders of magnitude), but the impact is still "
"significant. Note that the y-axis is again logarithmic."
msgstr ""
"Firefox-реализация `getChannelData` имеет незначительное время работы (почти "
"0). На следующем рисунке показано, что маленькая ложь вычисляется гораздо "
"быстрее (примерно на два порядка), но влияние все равно значительное. "
"Обратите внимание, что ось y снова логарифмическая."

#: ../content/posts/optimizations.md:block 24 (paragraph)
msgid ""
"![Performance of getChannelData in "
"Firefox]({attach}/images/optimizations/firefox_audio_recommended.png)"
msgstr ""
"![Производительность getChannelData в Firefox]({attach}/images/optimizations/"
"firefox_audio_recommended.png)"

#: ../content/posts/optimizations.md:block 25 (paragraph)
msgid ""
"Martin also developed [performance "
"tests](https://pagure.io/JShelter/webextension/blob/1c86c45f565a36a6234c210392a89e3e20f32027/f/tests/performance_tests)"
" based on [Google Lighthouse](https://developer.chrome.com/docs/lighthouse/)"
" that run in Chrome. We tested on 46 pages from the 100 of "
"[Tranco](https://tranco-list.eu/) and give the [performance "
"score](https://developer.chrome.com/docs/lighthouse/performance/performance-"
"scoring/) below. The performance score approximates how users perceive the "
"loading speed of the visited page. The 25th percentile of all pages should "
"receive a score of 50."
msgstr ""
"Мартин также разработал [тесты производительности](https://pagure.io/"
"JShelter/webextension/blob/1c86c45f565a36a6234c210392a89e3e20f32027/f/tests/"
"performance_tests) на основе [Google Lighthouse](https://"
"developer.chrome.com/docs/lighthouse/), которые запускаются в Chrome. Мы "
"провели тестирование на 46 страницах из 100 страниц [Tranco](https://tranco-"
"list.eu/) и привели [оценку производительности](https://developer.chrome.com/"
"docs/lighthouse/performance/performance-scoring/) ниже. Оценка "
"производительности приблизительно отражает то, как пользователи воспринимают "
"скорость загрузки посещаемой страницы. 25-й процентиль всех страниц должен "
"получить оценку 50."

#: ../content/posts/optimizations.md:block 26 (paragraph)
msgid ""
"The average performance score of all tested pages was 66 without JShelter. "
"When tested with JShelter 0.12.2, the score dropped to 62.5. The average of "
"all tested pages raised to 64 with JShelter 0.15.1. The performance score "
"was the same or better in JShelter 0.15.1 compared to 0.12.2 on 33 pages. It"
" increased on 18 pages."
msgstr ""
"Средний балл производительности всех протестированных страниц составил 66 "
"без JShelter. При тестировании с JShelter 0.12.2 этот показатель снизился до "
"62,5. В JShelter 0.15.1 средний балл всех протестированных страниц вырос до "
"64. Оценка производительности была такой же или выше в JShelter 0.15.1 по "
"сравнению с 0.12.2 на 33 страницах. На 18 страницах он увеличился."

#: ../content/posts/paper2022.md:block 1 (header)
msgid ""
"title: Paper about JShelter\n"
"date: 2022-04-05 00:00\n"
"Series: JShelter background"
msgstr ""
"Заголовок: Статья о JShelter\n"
"дата: 2022-04-05 00:00\n"
"Серия: Справочная информация о JShelter"

#: ../content/posts/paper2022.md:block 2 (paragraph)
msgid ""
"We recently submitted a position paper about JShelter for [CNIL Privacy "
"Research Day 2022](https://www.cnil.fr/en/privacy-research-day-2022) and "
"posted the paper on [arXive](https://arxiv.org/abs/2204.01392). If you are "
"interested in the project or if you are already using JShelter, we recommend"
" reading the paper as it explains the project, its historical decisions, the"
" thread model, design decision, experiments, and provides more information "
"that you should know if you want to use JShelter correctly, or, you might "
"decide that JShelter is not the correct tool for you and you might pick one "
"of the alternative tools referenced in the paper."
msgstr ""
"Недавно мы представили позиционный документ о JShelter на "
"[CNIL Privacy Research Day 2022] (https://www.cnil.fr/en/privacy-research-"
"day-2022) и опубликовали его на [arXive] (https://arxiv.org/abs/2204.01392). "
"Если вы заинтересованы в проекте или уже используете JShelter, мы "
"рекомендуем прочитать документ, так как он объясняет проект, его "
"исторические решения, модель потока, дизайнерское решение, эксперименты и "
"предоставляет дополнительную информацию, которую вы должны знать, если "
"хотите использовать JShelter правильно, или вы можете решить, что JShelter "
"не является подходящим инструментом для вас, и выбрать один из "
"альтернативных инструментов, упомянутых в документе."

#: ../content/posts/paper2022.md:block 3 (paragraph)
msgid ""
"The Web is used daily by billions. Even so, users are not protected from "
"many threats by default. Jshelter builds on previous web privacy and "
"security research and fights to return the browser to users. The paper "
"introduces [NSCL](https://noscript.net/commons-library), a library helping "
"with common webextension development tasks and fixing loopholes misused by "
"previous research. JShelter focuses on fingerprinting prevention, "
"limitations of rich web APIs, prevention of attacks connected to timing, and"
" learning information about the computer, the browser, the user, and "
"surrounding physical environment and location. We discovered a loophole in "
"the sensor timestamps that lets any page observe the device boot time if "
"sensor APIs are enabled in Chromium-based browsers. JShelter provides a "
"fingerprinting report and other feedback that can be used by future security"
" research and data protection authorities. Thousands of users around the "
"world use the webextension every day."
msgstr ""
"Сетью ежедневно пользуются миллиарды людей. Тем не менее, по умолчанию "
"пользователи не защищены от многих угроз. Jshelter опирается на предыдущие "
"исследования в области конфиденциальности и безопасности веб-страниц и "
"борется за возвращение браузера пользователям. В статье представлена "
"библиотека [NSCL](https://noscript.net/commons-library), помогающая решать "
"общие задачи разработки веб-расширений и устраняющая лазейки, неправильно "
"использованные в предыдущих исследованиях. JShelter фокусируется на "
"предотвращении отпечатков пальцев, ограничениях богатых веб-интерфейсов, "
"предотвращении атак, связанных с таймингом, и изучении информации о "
"компьютере, браузере, пользователе и окружающей физической среде и "
"местоположении. Мы обнаружили лазейку в метках времени датчиков, которая "
"позволяет любой странице наблюдать за временем загрузки устройства, если в "
"браузерах на базе Chromium включены API датчиков. JShelter предоставляет "
"отчет об отпечатках пальцев и другие отзывы, которые могут быть использованы "
"в будущих исследованиях безопасности и органами защиты данных. Тысячи "
"пользователей по всему миру используют расширение каждый день."

#: ../content/posts/paper2022.md:block 4 (paragraph)
msgid ""
"Previous research established that browser security, privacy, and "
"customizability are important topics. The imminent danger of third-party "
"cookies' removal forces trackers to employ even more privacy-invading "
"techniques. Real-time bidding leaves users easy targets for various attacks,"
" including gaining information about other applications running on the local"
" computer. Moreover, continuous additions of new JavaScript APIs open new "
"ways for fingerprinting the browsers and gaining additional knowledge about "
"the browser or user preferences and physical environment. One of the major "
"concerns is a lack of effective tools that everyday user wants to use. "
"Current methods to tackle web threats are list-based blockers that might be "
"evaded with a change of URL, specialised browsers, or research-only projects"
" that are quickly abandoned."
msgstr ""
"Предыдущие исследования показали, что безопасность браузера, "
"конфиденциальность и настраиваемость являются важными темами. Неминуемая "
"опасность удаления сторонних файлов cookie заставляет трекеры использовать "
"еще больше методов нарушения конфиденциальности. Торги в реальном времени "
"делают пользователей легкой добычей для различных атак, в том числе для "
"получения информации о других приложениях, работающих на локальном "
"компьютере. Более того, постоянное добавление новых API JavaScript открывает "
"новые возможности для \"отпечатка пальца\" браузеров и получения "
"дополнительных знаний о браузере, предпочтениях пользователя и физическом "
"окружении. Одной из главных проблем является отсутствие эффективных "
"инструментов, которыми бы хотели пользоваться обычные пользователи. "
"Существующие методы борьбы с веб-угрозами - это блокировщики на основе "
"списков, которые можно обойти, изменив URL, специализированные браузеры или "
"исследовательские проекты, которые быстро прекращаются."

#: ../content/posts/paper2022.md:block 5 (paragraph)
msgid ""
"In contrast, JShelter is a webextension that can be installed on major "
"browsers and consequently does not require the user to change the browser "
"and routines. We integrate several previous research projects like [Chrome "
"Zero](https://github.com/IAIK/ChromeZero), [little-lies-based fingerprinting"
" prevention](https://brave.com/privacy-updates/3-fingerprint-"
"randomization/), and ideas of limiting APIs brought by [Web API "
"Manager](https://github.com/pes10k/web-api-manager). JShelter comes with [a "
"heuristic-based fingerprint detector](/fpdetection/) and prevents webpages "
"from [misusing the browser as a proxy to access the local network and "
"computer](/localportscanning/). We needed to solve issues with reliable "
"environment modifications that stem from webextension API that opens many "
"loopholes that previous research exploited. In addition to JShelter, we "
"introduce [NSCL](https://noscript.net/commons-library). Both NoScript "
"Security Suite and JShelter include NSCL. Moreover, NSCL is available for "
"other privacy- and security-related webextensions."
msgstr ""
"В отличие от него, JShelter - это веб-расширение, которое может быть "
"установлено на основные браузеры и, следовательно, не требует от "
"пользователя смены браузера и рутины. Мы объединили несколько предыдущих "
"исследовательских проектов, таких как [Chrome Zero](https://github.com/IAIK/"
"ChromeZero), [little-lies-based fingerprinting prevention](https://brave.com/"
"privacy-updates/3-fingerprint-randomization/), и идеи ограничения API, "
"предложенные в [Web API Manager](https://github.com/pes10k/web-api-manager). "
"JShelter оснащен [эвристическим детектором отпечатков пальцев](/fpdetection/)"
" и не позволяет веб-страницам [использовать браузер в качестве прокси для "
"доступа к локальной сети и компьютеру](/localportscanning/). Нам нужно было "
"решить проблемы с надежными модификациями окружения, которые связаны с API "
"веб-расширений, открывающим множество лазеек, которые использовались в "
"предыдущих исследованиях. В дополнение к JShelter мы представили [NSCL]"
"(https://noscript.net/commons-library). И NoScript Security Suite, и "
"JShelter включают в себя NSCL. Более того, NSCL доступен и для других веб-"
"расширений, связанных с конфиденциальностью и безопасностью."

#: ../content/posts/paper2022.md:block 6 (paragraph)
msgid ""
"In cooperation with the Free Software Foundation, we aim for long-term "
"JShelter development; thus, users' privacy and security should be improved "
"in the future. We explain fingerprinting vectors introduced by Sensor API in"
" mobile browsers. Data protection specialists should detect browser "
"fingerprinting and other information leaks with JShelter. We integrated "
"[fingerprint report](/cooperation/) and notifications to facilitate the "
"task. We discussed considerations and issues connected with deployment. The "
"webextension is under development. Future work will include fixing problems "
"breaking pages, improved heuristics of FPD, and research fingerprinting on "
"login pages. We want to revisit and evaluate the little-lies-based anti-"
"fingerprinting technique; are the little changes enough to stop a determined"
" fingerprinter that can, for example, approximate colour values of several "
"pixels or repeat an effect multiple times? JShelter should not be considered"
" a single bullet-proof solution. We anticipate that everyday users will "
"install JShelter together with other webextensions like list-based blockers "
"or JavaScript blockers."
msgstr ""
"В сотрудничестве с Фондом свободного программного обеспечения мы стремимся к "
"долгосрочному развитию JShelter; таким образом, конфиденциальность и "
"безопасность пользователей должны быть улучшены в будущем. Мы объясняем "
"векторы отпечатков пальцев, вводимые Sensor API в мобильных браузерах. "
"Специалисты по защите данных должны обнаруживать отпечатки браузеров и "
"другие утечки информации с помощью JShelter. Мы интегрировали "
"[fingerprint report](/cooperation/) и уведомления, чтобы облегчить задачу. "
"Мы обсудили соображения и проблемы, связанные с развертыванием. Веб-"
"расширение находится в стадии разработки. Будущая работа будет включать "
"исправление проблем с разрывом страниц, улучшение эвристики FPD и "
"исследование отпечатков пальцев на страницах входа в систему. Мы хотим "
"пересмотреть и оценить технику защиты от отпечатков пальцев, основанную на "
"маленьких ложях; достаточно ли маленьких изменений, чтобы остановить "
"целеустремленного дактилоскописта, который может, например, аппроксимировать "
"цветовые значения нескольких пикселей или повторить эффект несколько раз? "
"JShelter не следует рассматривать как единственное пуленепробиваемое "
"решение. Мы предполагаем, что обычные пользователи будут устанавливать "
"JShelter вместе с другими веб-расширениями, такими как блокировщики списков "
"или блокировщики JavaScript."

#: ../content/posts/sensorapi.md:block 1 (header)
msgid ""
"title: Protection against fingerprinting with Generic Sensor API\n"
"date: 2022-05-06 15:34\n"
"Series: Browser fingerprinting"
msgstr ""
"Название: Защита от отпечатков пальцев с помощью общего сенсорного API\n"
"дата: 2022-05-06 15:34\n"
"Серия: Отпечатки пальцев в браузере"

#: ../content/posts/sensorapi.md:block 2 (paragraph)
msgid ""
"Today devices contain [various "
"sensors](https://www.researchgate.net/publication/224170986_A_survey_of_mobile_phone_sensing_IEEE_Commun_Mag)"
" for reading information about the device's position, state, and "
"environment. Such equipment is typical for mobile devices like cellphones, "
"tablets, or laptops that often include sensors for obtaining geolocation or "
"device orientation data. Another example is a smartwatch that could monitor "
"the heartbeat rate of the wearer, or a car with a tire pressure sensor, etc."
" While the benefits of having sensors are undisputed, allowing websites to "
"access their readings represents a considerable danger."
msgstr ""
"Сегодня устройства содержат [различные датчики](https://www.researchgate.net/"
"publication/224170986_A_survey_of_mobile_phone_sensing_IEEE_Commun_Mag) для "
"считывания информации о положении устройства, его состоянии и окружающей "
"среде. Такое оборудование характерно для мобильных устройств, таких как "
"мобильные телефоны, планшеты или ноутбуки, которые часто включают в себя "
"датчики для получения данных о геолокации или ориентации устройства. Другой "
"пример - смарт-часы, которые могут отслеживать частоту сердцебиения "
"владельца, или автомобиль с датчиком давления в шинах и т. д. Хотя "
"преимущества наличия датчиков неоспоримы, предоставление веб-сайтам доступа "
"к их показаниям представляет собой значительную опасность."

#: ../content/posts/sensorapi.md:block 5 (header)
msgid "Generic Sensor API"
msgstr "Общий сенсорный API"

#: ../content/posts/sensorapi.md:block 6 (paragraph)
msgid ""
"JavaScript's [Generic sensor API](https://www.w3.org/TR/generic-sensor/) "
"provides a unified way for accessing these sensors and reading data. The "
"physical (hardware) sensor instances are called **device sensors**, while "
"**platform sensors** represent interfaces over which the user agent can "
"interact with the device sensors and read data. JavaScript represents "
"sensors by a class hierarchy. The base class `Sensor` cannot be used "
"directly but provides essential properties, event handlers, and methods for "
"its subclasses. These represent concrete sensors like Accelerometer, "
"Magnetometer, or Gyroscope."
msgstr ""
"JavaScript [Generic sensor API](https://www.w3.org/TR/generic-sensor/) "
"предоставляет унифицированный способ доступа к этим датчикам и считывания "
"данных. Физические (аппаратные) экземпляры датчиков называются **датчиками "
"устройств**, а **платформенные датчики** представляют собой интерфейсы, "
"через которые пользовательский агент может взаимодействовать с датчиками "
"устройств и считывать данные. JavaScript представляет сенсоры в виде "
"иерархии классов. Базовый класс `Sensor` не может быть использован напрямую, "
"но предоставляет основные свойства, обработчики событий и методы для своих "
"подклассов. Они представляют конкретные датчики, такие как акселерометр, "
"магнитометр или гироскоп."

#: ../content/posts/sensorapi.md:block 7 (header)
msgid "Browser Support"
msgstr "Поддержка браузера"

#: ../content/posts/sensorapi.md:block 8 (paragraph)
msgid ""
"The API is currently implemented, or partially implemented, in Chrome, Edge,"
" and Opera browsers. For Android devices, the support exists in Chrome for "
"Android, Opera for Android, and various Chromium-based browsers like Samsung"
" Mobile or Kiwi Browser. The concrete support for individual classes depends"
" on the browser type and version. Some features are considered experimental "
"and, for now, only work when browser flags like `#enable-experimental-web-"
"platform-features` or `#enable-generic-sensor-extra-classes` are enabled."
msgstr ""
"В настоящее время API реализован или частично реализован в браузерах Chrome, "
"Edge и Opera. Для устройств на базе Android поддержка реализована в Chrome "
"for Android, Opera for Android и различных браузерах на базе Chromium, таких "
"как Samsung Mobile или Kiwi Browser. Конкретная поддержка отдельных классов "
"зависит от типа и версии браузера. Некоторые функции считаются "
"экспериментальными и пока работают только при включении таких флагов "
"браузера, как `#enable-experimental-web-platform-features` или `#enable-"
"generic-sensor-extra-classes`."

#: ../content/posts/sensorapi.md:block 9 (header)
msgid "Sensor Types"
msgstr "Типы датчиков"

#: ../content/posts/sensorapi.md:block 10 (paragraph)
msgid ""
"Some sensors are characterized by their implementation, e.g. a `Gyroscope` "
"or `Magnetometer`. Those are called **low-level** sensors. Sensors that are "
"named after their readings, not their implementation, are called **high-"
"level** sensors. For instance, the `GeolocationSensor` may read data from "
"the GPS chip, Wifi networks, cellular network triangulation, or their "
"combination. Using a combination of low-level sensor readings is called "
"**sensor fusion**. An example is the `AbsoluteOrientaionSensor` that uses "
"data from the Accelerometer, Gyroscope, and Magnetometer low-level sensors."
msgstr ""
"Некоторые датчики характеризуются своей реализацией, например, `гироскоп` "
"или `магнитометр`. Такие датчики называются **низкоуровневыми**. Датчики, "
"которые названы по их показаниям, а не по их реализации, называются "
"**высокоуровневыми** датчиками. Например, `GeolocationSensor` может "
"считывать данные с чипа GPS, сетей Wifi, триангуляции сотовых сетей или их "
"комбинации. Использование комбинации показаний низкоуровневых датчиков "
"называется **слиянием датчиков**. Примером может служить "
"`AbsoluteOrientaionSensor`, который использует данные с низкоуровневых "
"датчиков акселерометра, гироскопа и магнитометра."

#: ../content/posts/sensorapi.md:block 11 (header)
msgid "Threats"
msgstr "Угрозы"

#: ../content/posts/sensorapi.md:block 12 (paragraph)
msgid ""
"The risk of using Generic Sensor API calls for device fingerprinting is "
"mentioned within the [W3C Candidate Recommendation Draft, 29 July "
"2021]((https://www.w3.org/TR/2021/CRD-generic-sensor-20210729/#device-"
"fingerprinting)). Documented threats include manufacturing imperfections and"
" differences that are unique to the concrete model of the device and can be "
"used for fingerprinting. Concrete examples are discussed in the following "
"sections dedicated to individual sensor classes."
msgstr ""
"Риск использования вызовов общего сенсорного API для снятия отпечатков "
"пальцев с устройств упоминается в "
"[W3C Candidate Recommendation Draft, 29 July 2021]((https://www.w3.org/TR/"
"2021/CRD-generic-sensor-20210729/#device-fingerprinting)). "
"Задокументированные угрозы включают производственные дефекты и различия, "
"которые уникальны для конкретной модели устройства и могут быть использованы "
"для отпечатков пальцев. Конкретные примеры рассматриваются в следующих "
"разделах, посвященных отдельным классам датчиков."

#: ../content/posts/sensorapi.md:block 13 (header)
msgid "Timestamps"
msgstr "Временные метки"

#: ../content/posts/sensorapi.md:block 14 (paragraph)
msgid ""
"We discovered a loophole in the `Sensor.timestamp` attribute. The value "
"contains the time when the last `Sensor.onreading` event occurred, in "
"millisecond precision. We observed that the time is not relative to the time"
" of page context creation (like `performance.now`) but the last boot time of"
" the device. Exposing such information is dangerous as it allows to "
"fingerprint the user easily. Not many devices boot at the same time. The "
"longer a device is running, the less likely that another device booted at "
"the same time, and both are still running."
msgstr ""
"Мы обнаружили лазейку в атрибуте `Sensor.timestamp`. Значение содержит "
"время, когда произошло последнее событие `Sensor.onreading`, с точностью до "
"миллисекунды. Мы заметили, что это время относится не ко времени создания "
"контекста страницы (как `performance.now`), а ко времени последней загрузки "
"устройства. Раскрывать такую информацию опасно, так как она позволяет легко "
"снять отпечатки пальцев с пользователя. Не многие устройства загружаются "
"одновременно. Чем дольше работает устройство, тем меньше вероятность того, "
"что в это же время загрузилось другое устройство, и оба они все еще работают."

#: ../content/posts/sensorapi.md:block 15 (paragraph)
msgid ""
"The behaviour was with the Magnetometer sensor on the following devices:"
msgstr ""
"Такое поведение наблюдалось с датчиком магнитометра на следующих устройствах:"

#: ../content/posts/sensorapi.md:block 16 (unordered list)
msgid ""
"Samsung Galaxy S21 Ultra; Android 11, kernel 5.4.6-215566388-abG99BXXU3AUE1,"
" Build/RP1A.200720.012.G998BXXU3AUE1, Chrome 94.0.4606.71 and Kiwi "
"(Chromium) 94.0.4606.56"
msgstr ""
"Samsung Galaxy S21 Ultra; Android 11, ядро 5.4.6-215566388-abG99BXXU3AUE1, "
"Build/RP1A.200720.012.G998BXXU3AUE1, Chrome 94.0.4606.71 и Kiwi (Chromium) "
"94.0.4606.56"

#: ../content/posts/sensorapi.md:block 16 (unordered list)
#, fuzzy
msgid ""
"Xiaomi Redmi Note 5; Android 9, kernel 4.4.156-perf+, Build/9 "
"PKQ1.180901.001, Chrome 94.0.4606.71"
msgstr ""
"Xiaomi Redmi Note 5; Android 9, kernel 4.4.156-perf+, Build/9 "
"PKQ1.180901.001, Chrome 94.0.4606.71"

#: ../content/posts/sensorapi.md:block 17 (paragraph)
msgid ""
"Our wrapper thus protects the device by changing the time origin to the page"
" context creation time, the timestamp should still uniquely identify the "
"reading, i.e. two readings by the same page have a different timestamp."
msgstr ""
"Таким образом, наша обертка защищает устройство, меняя время происхождения "
"на время создания контекста страницы, при этом временная метка должна по-"
"прежнему однозначно идентифицировать чтение, т. е. два чтения одной и той же "
"страницы будут иметь разную временную метку."

#: ../content/posts/sensorapi.md:block 18 (header)
msgid "Global Orientation Settings"
msgstr "Глобальные параметры ориентации"

#: ../content/posts/sensorapi.md:block 19 (paragraph)
msgid ""
"Many sensor classes need access to the device's orientation to calculate its"
" values accordingly. Readings from different sensors are thus not "
"independent of each other, and relations between the sensor classes exist. "
"We wanted even the faked readings to look real and believable, and therefore"
" JShelter uses a model of the orientation that is shared between the "
"individual wrappers."
msgstr ""
"Многим классам датчиков необходим доступ к информации об ориентации "
"устройства, чтобы вычислять соответствующие значения. Таким образом, "
"показания разных датчиков не являются независимыми друг от друга, и между "
"классами датчиков существуют связи. Мы хотели, чтобы даже поддельные "
"показания выглядели реальными и правдоподобными, поэтому JShelter использует "
"модель ориентации, которая разделяется между отдельными обертками."

#: ../content/posts/sensorapi.md:block 20 (paragraph)
msgid ""
"Let us consider a cell phone as a use case device. For all devices we "
"examined:"
msgstr ""
"В качестве устройства для использования рассмотрим сотовый телефон. Мы "
"рассмотрели все устройства:"

#: ../content/posts/sensorapi.md:block 21 (unordered list)
msgid "The `x` axis is oriented from the user's left to the right."
msgstr "Ось `x` ориентирована слева направо от пользователя."

#: ../content/posts/sensorapi.md:block 21 (unordered list)
msgid "The `y` axis from the bottom side of the display towards the top side."
msgstr "Ось `y` от нижней стороны дисплея к верхней."

#: ../content/posts/sensorapi.md:block 21 (unordered list)
msgid ""
"The `z` axis is perpendicular to the display; it leads from the phone's "
"display towards the user's face."
msgstr ""
"Ось `z` перпендикулярна дисплею; она ведет от дисплея телефона к лицу "
"пользователя."

#: ../content/posts/sensorapi.md:block 22 (paragraph)
msgid ""
"Similar to [Aircaft principal "
"axes](https://www.grc.nasa.gov/www/k-12/airplane/rotations.html), the "
"rotation of the device is defined by three values: `yaw`, `pitch`, and "
"`roll`:"
msgstr ""
"Как и в [Aircaft principal axes](https://www.grc.nasa.gov/www/k-12/airplane/"
"rotations.html), вращение аппарата определяется тремя величинами: `yaw`, "
"`pitch` и `roll`:"

#: ../content/posts/sensorapi.md:block 23 (unordered list)
msgid ""
"`Yaw` defines rotation around the `z` axis. Assume a phone lying display up "
"on a flat surface - a table, for instance. If you rotate the phone without "
"taking any part up from the surface, only the yaw changes."
msgstr ""
"`Yaw` определяет вращение вокруг оси `z`. Предположим, что телефон лежит "
"дисплеем вверх на плоской поверхности - например, на столе. Если повернуть "
"телефон, не отрывая ни одной части от поверхности, изменится только рысканье."

#: ../content/posts/sensorapi.md:block 23 (unordered list)
msgid ""
"`Pitch` defines rotation around the `x` axis. Assume you want to have better"
" visibility of the display. You may put something under the top (camera) "
"part of the phone to lift it up a bit. This is where the pitch changes. For "
"the phone, the surface is not horizontal anymore."
msgstr ""
"`Pitch` определяет вращение вокруг оси `x`. Предположим, вы хотите улучшить "
"видимость дисплея. Вы можете подложить что-нибудь под верхнюю часть телефона "
"(камеру), чтобы немного приподнять ее. Именно здесь изменяется угол наклона. "
"Для телефона поверхность больше не является горизонтальной."

#: ../content/posts/sensorapi.md:block 23 (unordered list)
msgid ""
"`Roll` defines rotation around the `y` axis. This is done by rotating the "
"phone to the left and right. Assume you are holding the phone in your hand, "
"looking at the display. If you decide to look at the buttons on the side "
"instead, you rotate the phone, which applies the roll."
msgstr ""
"`Roll` задает вращение вокруг оси `y`. Это осуществляется путем поворота "
"телефона влево и вправо. Предположим, что вы держите телефон в руке и "
"смотрите на дисплей. Если вы решите посмотреть на кнопки сбоку, вы повернете "
"телефон, что вызовет поворот."

#: ../content/posts/sensorapi.md:block 24 (paragraph)
msgid ""
"As we observed, the yaw, pitch, and roll define the rotation of the phone on"
" the Earth reference coordinate system:"
msgstr ""
"Как мы уже заметили, рысканье, тангаж и крен определяют вращение телефона в "
"системе координат Земли:"

#: ../content/posts/sensorapi.md:block 25 (unordered list)
msgid "The `x` axis is oriented towards the **East**"
msgstr "Ось `x` ориентирована на **восток**"

#: ../content/posts/sensorapi.md:block 25 (unordered list)
msgid "The `y` axis is oriented towards the (Earth's magnetic) **North**"
msgstr "Ось `y` ориентирована на (магнитный) **север** Земли"

#: ../content/posts/sensorapi.md:block 25 (unordered list)
msgid "The `-z` axis is oriented toward the **centre of the Earth**"
msgstr "Ось `z` направлена к **центру Земли**"

#: ../content/posts/sensorapi.md:block 26 (paragraph)
msgid ""
"In our solution, the three values (`yaw`, `pitch`, and `roll`) are "
"pseudorandomly drawn using the "
"[Mulberry32](https://gist.github.com/tommyettinger/46a874533244883189143505d203312c)"
" PRNG that is seeded with a value generated from the `domainHash` which "
"ensures deterministic behaviour for the given website, e.g. producing same "
"values on different tabs."
msgstr ""
"В нашем решении три значения (`yaw`, `pitch` и `roll`) рисуются "
"псевдослучайным образом с помощью ГПСЧ [Mulberry32](https://gist.github.com/"
"tommyettinger/46a874533244883189143505d203312c), который засевается "
"значением, сгенерированным из `domainHash`, что обеспечивает "
"детерминированное поведение для данного сайта, например, выдачу одинаковых "
"значений на разных вкладках."

#: ../content/posts/sensorapi.md:block 27 (paragraph)
msgid ""
"Future improvements could also introduce movements where JShelter would "
"change the orientation over time."
msgstr ""
"В будущих улучшениях также могут появиться движения, при которых JShelter "
"будет менять ориентацию с течением времени."

#: ../content/posts/sensorapi.md:block 28 (paragraph)
msgid ""
"A rotation matrix is calculated and stored within the global `orient` "
"variable from the values obtained. All our wrappers that need access to the "
"device's orientation load it from this variable."
msgstr ""
"Из полученных значений вычисляется матрица поворота и сохраняется в "
"глобальной переменной `orient`. Все наши обертки, которым нужен доступ к "
"ориентации устройства, загружают ее из этой переменной."

#: ../content/posts/sensorapi.md:block 29 (header)
#, fuzzy
msgid "AmbientLightSensor"
msgstr "AmbientLightSensor"

#: ../content/posts/sensorapi.md:block 30 (paragraph)
msgid ""
"An ambient light sensor is a photodetector that senses the amount of ambient"
" light present. The motivation for integrating electronic devices is mostly "
"to dim the screen accordingly and protect users' eyes. In the Generic Sensor"
" API, the sensor is implemented using the `AmbientLightSensor` class "
"provides readings of the illuminance of the device's environment. The unit "
"of the illuminance values is `lux`."
msgstr ""
"Датчик освещенности - это фотодатчик, определяющий количество окружающего "
"света. Мотивацией для интеграции в электронные устройства чаще всего "
"является соответствующее затемнение экрана и защита глаз пользователя. В "
"Generic Sensor API датчик реализован с помощью класса `AmbientLightSensor`, "
"который предоставляет показания освещенности окружающей среды устройства. "
"Единицей измерения освещенности является `люкс`."

#: ../content/posts/sensorapi.md:block 31 (header)
msgid "Fingerprinting with AmbientLightSensor"
msgstr ""
"Снятие отпечатков пальцев с помощью датчика освещенности AmbientLightSensor"

#: ../content/posts/sensorapi.md:block 32 (paragraph)
msgid ""
"While the light sensors in devices may protect users' eyes, they do not "
"protect their privacy. As the illuminance value describes the light "
"conditions of the nearby physical surrounding of the device, an observer can"
" use the illuminance together with other sensors' readings to create a "
"unique fingerprint. Using readings from the `AmbientLightSensor`, it is "
"possible to [scan the nearby "
"environment](https://blog.lukaszolejnik.com/additional-security-and-privacy-"
"risks-of-light-sensors/). For instance, [behavioral "
"analysis](https://blog.lukaszolejnik.com/privacy-of-ambient-light-sensors/) "
"can reveal information about the time of day that the user usually works, "
"preferred lighting conditions, frequency of movement around different "
"places, etc. By applying the [inverse square law](http://hyperphysics.phy-"
"astr.gsu.edu/hbase/Forces/isq.html), one can also compute the distance "
"between the device and another light-emitting object: `d = sqrt(L / 4 * π * "
"B)` where `L` is luminosity that is roughly constant for a light source, and"
" `B` is brightness obtained from the sensor readings."
msgstr ""
"Хотя датчики освещенности в устройствах могут защитить глаза пользователей, "
"они не защищают их частную жизнь. Поскольку значение освещенности описывает "
"условия освещенности в ближайшем физическом окружении устройства, "
"наблюдатель может использовать освещенность вместе с показаниями других "
"датчиков для создания уникального отпечатка пальца. Используя показания "
"`AmbientLightSensor`, можно [сканировать близлежащее окружение](https://"
"blog.lukaszolejnik.com/"
"additional-security-and-privacy-risks-of-light-sensors/). Например, "
"[поведенческий анализ](https://blog.lukaszolejnik.com/"
"privacy-of-ambient-light-sensors/) может выявить информацию о времени суток, "
"в которое пользователь обычно работает, предпочитаемых условиях освещения, "
"частоте передвижения по различным местам и т. д. Применяя "
"[закон обратного квадрата](http://hyperphysics.phy-astr.gsu.edu/hbase/Forces/"
"isq.html), можно также вычислить расстояние между устройством и другим "
"светоизлучающим объектом: `d = sqrt(L / 4 * π * B)`, где `L` - яркость, "
"которая примерно постоянна для источника света, а `B` - яркость, полученная "
"из показаний датчиков."

#: ../content/posts/sensorapi.md:block 33 (paragraph)
msgid ""
"It is also possible to detect the position of the user's fingers by "
"analyzing the shadows the cast. An example that presents a serious danger is"
" [PIN "
"Skimming](https://www.researchgate.net/publication/262380810_PIN_Skimming_Exploiting_the_Ambient-"
"Light_Sensor_in_Mobile_Devices). In this case, a malicious website or "
"application exploits the sensor readings to detect PINs for applications "
"that make bank transactions, etc. Spreitzer et al. Using a linear "
"discriminant analysis with a training set of 15 PINs, each repeated eight "
"times, it was possible to classify more than 90 % of device PINs correctly. "
"The chance of correctly guessing the right PIN from the set of 15 is only "
"6.7 %. If the user watches TV and a light sensor-equipped smartphone or "
"smartwatch is nearby, it can [identify concrete TV channels and on-demand "
"videos](https://www.sciencedirect.com/science/article/pii/S1574119216302085)."
msgstr ""
"Также можно определить положение пальцев пользователя, анализируя "
"отбрасываемые ими тени. Примером, представляющим серьезную опасность, "
"является [PIN Skimming](https://www.researchgate.net/publication/"
"262380810_PIN_Skimming_Exploiting_the_Ambient-Light_Sensor_in_Mobile_Devices)"
". В этом случае вредоносный веб-сайт или приложение использует показания "
"датчиков для определения PIN-кодов в приложениях, осуществляющих банковские "
"транзакции и т. д. Spreitzer et al. Используя линейный дискриминантный "
"анализ с обучающим набором из 15 PIN-кодов, каждый из которых повторялся "
"восемь раз, удалось правильно классифицировать более 90 % PIN-кодов "
"устройств. Шанс правильно угадать правильный PIN-код из набора 15 составляет "
"всего 6,7 %. Если пользователь смотрит телевизор, а рядом находится "
"оснащенный датчиком освещенности смартфон или смарт-часы, они могут "
"[определить конкретные телеканалы и видео по запросу](https://"
"www.sciencedirect.com/science/article/pii/S1574119216302085)."

#: ../content/posts/sensorapi.md:block 34 (paragraph)
msgid ""
"Multiple devices allow conducting [cross-device "
"tracking](https://blog.lukaszolejnik.com/privacy-of-ambient-light-sensors/)."
" For instance, when someone uses a phone and a tablet in the same room, a "
"website with access to their light sensors can compare the values to "
"distinguish whether the same person uses two separate devices. The sensor "
"can also be used for [cross-device "
"communication](https://blog.lukaszolejnik.com/privacy-of-ambient-light-"
"sensors/) where one device emits light by displaying content on its screen "
"and the other reads the message through the sensor-measured illuminance "
"values."
msgstr ""
"Наличие нескольких устройств позволяет проводить [cross-device tracking]"
"(https://blog.lukaszolejnik.com/privacy-of-ambient-light-sensors/). "
"Например, когда кто-то использует телефон и планшет в одной комнате, веб-"
"сайт, имеющий доступ к их датчикам освещенности, может сравнить значения, "
"чтобы определить, использует ли один и тот же человек два разных устройства. "
"Датчик также может использоваться для [коммуникации между устройствами]"
"(https://blog.lukaszolejnik.com/privacy-of-ambient-light-sensors/), когда "
"одно устройство излучает свет, отображая содержимое на своем экране, а "
"другое считывает сообщение через измеренные датчиком значения освещенности."

#: ../content/posts/sensorapi.md:block 35 (header)
msgid "Wrapping the AmbientLightSensor readings"
msgstr "Обертывание показаний AmbientLightSensor"

#: ../content/posts/sensorapi.md:block 36 (paragraph)
msgid ""
"To eliminate possible exploitation of sensor readings, we decided to "
"generate fake readings instead of modifying existing ones. On examined "
"stationary devices inside an office, the illuminance measured was between "
"500 and 900, depending on the concrete position's light conditions. All "
"measured values were rounded to the nearest 50 illuminance value. The "
"wrapper simulates the same behaviour under non-changing light conditions. In"
" the beginning, a pseudorandom illuminance value is drawn using PRNG seeded "
"with the domain hash - which should guarantee to produce the same values on "
"multiple browser tabs on the same domain. As we simulate a stationary device"
" under constant light conditions, this value remains the same for all "
"readings. The faked value is returned using a wrapped `illuminance` getter "
"of the `AmbientLightSensor.prototype`."
msgstr ""
"Чтобы исключить возможность использования показаний датчиков, мы решили "
"генерировать фальшивые показания, а не модифицировать существующие. На "
"исследуемых стационарных устройствах в офисе измеряемая освещенность "
"составляла от 500 до 900, в зависимости от освещенности конкретного места. "
"Все измеренные значения были округлены до ближайшего 50-го значения "
"освещенности. Обертка имитирует такое же поведение при неизменных условиях "
"освещенности. В начале рисуется псевдослучайное значение освещенности с "
"использованием ГПСЧ, засеянного хэшем домена, что должно гарантировать "
"получение одинаковых значений на нескольких вкладках браузера на одном и том "
"же домене. Поскольку мы моделируем стационарное устройство в условиях "
"постоянной освещенности, это значение остается неизменным для всех "
"показаний. Поддельное значение возвращается с помощью обернутого геттера "
"`illuminance` прототипа `AmbientLightSensor.prototype`."

#: ../content/posts/sensorapi.md:block 37 (header)
msgid "Accelerometer"
msgstr "Акселерометр"

#: ../content/posts/sensorapi.md:block 38 (paragraph)
msgid "Accelerometers provide information about the device's acceleration"
msgstr "Акселерометры предоставляют информацию об ускорении устройства"

#: ../content/posts/sensorapi.md:block 39 (unordered list)
msgid ""
"i.e., the rate of change of its velocity. The Generic Sensor API provides "
"access to the readings using three classes: the `Accelerometer` sensor, the "
"`LinearAccelerationSensor`, and the `GravitySensor`. All use data from the "
"underlying `accelerometer` device sensor. The difference between them is "
"whether and how the gravity acceleration is applied. The `Accelerometer` "
"sensor provides information about the total acceleration that is applied to "
"the device. The remaining two isolate the sources. The "
"`LinearAccelerationSensor` ignores the influence of gravity. The "
"`GravitySensor` returns just the gravity acceleration."
msgstr ""
"т.е. скорость изменения его скорости. Generic Sensor API предоставляет "
"доступ к показаниям с помощью трех классов: `Accelerometer`, "
"`LinearAccelerationSensor` и `GravitySensor`. Все они используют данные из "
"базового датчика устройства `акселерометр`. Разница между ними заключается в "
"том, применяется ли к ним гравитационное ускорение и каким образом. Датчик "
"`Accelerometer` предоставляет информацию об общем ускорении, приложенном к "
"устройству. Остальные два датчика изолируют источники. Датчик "
"`LinearAccelerationSensor` игнорирует влияние гравитации. Датчик "
"`GravitySensor` возвращает только гравитационное ускорение."

#: ../content/posts/sensorapi.md:block 40 (header)
msgid "Fingerprinting with Accelerometer"
msgstr "Отпечатки пальцев с акселерометром"

#: ../content/posts/sensorapi.md:block 41 (paragraph)
msgid ""
"Readings from the accelerometer sensor classes represent a potential risk "
"and need to be protected. A unique fingerprint [can be obtained by "
"describing the device's "
"vibrations](https://link.springer.com/chapter/10.1007/978-3-319-30806-7_7). "
"Using [trajectory "
"inference](https://www.researchgate.net/publication/220990763_ACComplice_Location_inference_using_accelerometers_on_smartphones)"
" and matching the model to map data, one may use the readings from the "
"Accelerometer to determine the device's position"
msgstr ""
"Показания датчиков акселерометра представляют собой потенциальный риск и "
"должны быть защищены. Уникальный отпечаток пальца "
"[может быть получен путем описания вибраций устройства](https://"
"link.springer.com/chapter/10.1007/978-3-319-30806-7_7). Используя "
"[вывод траектории](https://www.researchgate.net/publication/"
"220990763_ACComplice_Location_inference_using_accelerometers_on_smartphones) "
"и сопоставляя модель с данными карты, можно использовать показания "
"акселерометра для определения положения устройства"

#: ../content/posts/sensorapi.md:block 42 (paragraph)
msgid ""
"From the accelerometer readings, [it is possible to "
"infer](https://www.mysk.blog/2021/10/24/accelerometer-ios/) whether the "
"device user is lying, sitting, walking, or cycling. For walking and running,"
" the data allow calculating steps. Accelerometer readings can also be used "
"to determine [human walking "
"patterns](https://www.researchgate.net/publication/322835708_Classifying_Human_Walking_Patterns_using_Accelerometer_Data_from_Smartphone)."
msgstr ""
"По показаниям акселерометра [можно определить](https://www.mysk.blog/2021/10/"
"24/accelerometer-ios/), лежит ли пользователь устройства, сидит, ходит или "
"едет на велосипеде. При ходьбе и беге данные позволяют рассчитать шаги. "
"Показания акселерометра также можно использовать для определения "
"[модели ходьбы человека](https://www.researchgate.net/publication/"
"322835708_Classifying_Human_Walking_Patterns_using_Accelerometer_Data_from_Smartphone)."
""

#: ../content/posts/sensorapi.md:block 43 (paragraph)
msgid ""
"Similar to `Gyroscope`, the `Accelerometer` sensor is also influenced by "
"vibrations from speech. Using the [Spearphone "
"attack](https://arxiv.org/abs/1907.05972), it is possible to perform gender "
"classification (with accuracy over 90%) and speaker identification (with "
"accuracy over 80%). Speech recognition and classification can also be done "
"from the reading of this sensor."
msgstr ""
"Подобно `гироскопу`, датчик `акселерометр` также подвержен влиянию вибраций "
"от речи. Используя датчик [Spearphone attack](https://arxiv.org/abs/"
"1907.05972), можно проводить классификацию по полу (с точностью более 90 %) "
"и идентификацию говорящего (с точностью более 80 %). Распознавание и "
"классификация речи также могут быть выполнены на основе показаний этого "
"датчика."

#: ../content/posts/sensorapi.md:block 44 (header)
msgid "Wrapping the Accelerometer readings"
msgstr "Обертывание показаний акселерометра"

#: ../content/posts/sensorapi.md:block 45 (paragraph)
msgid ""
"Our wrapper replaces the acceleration getters of these sensors. The goal is "
"to simulate a stationary device, possibly rotated. A rotation matrix "
"represents the orientation of the device. Its values are drawn "
"pseudorandomly from the domain hash, and are shared between all sensor "
"wrappers to simulate the same behaviour."
msgstr ""
"Наша обёртка заменяет получатели ускорения этих датчиков. Задача состоит в "
"том, чтобы смоделировать неподвижное устройство, которое может быть "
"повернуто. Матрица вращения представляет ориентацию устройства. Ее значения "
"берутся псевдослучайным образом из хэша домена и разделяются между всеми "
"обертками датчиков, чтобы имитировать одинаковое поведение."

#: ../content/posts/sensorapi.md:block 46 (paragraph)
msgid ""
"The `GravitySensor` provides readings of gravity acceleration applied to the"
" device. This is represented by a vector made of `x`, `y`, `z` portions. To "
"get this faked gravity vector for the device, the reference vector `[0, 0, "
"9.8]` is multiplied with the rotation matrix. Wrappers for the "
"GravitySensor's getters return the individual portions of the fake gravity "
"vector."
msgstr ""
"Датчик гравитации `GravitySensor` предоставляет показания ускорения силы "
"тяжести, действующей на устройство. Оно представлено вектором, состоящим из "
"частей `x`, `y`, `z`. Чтобы получить этот поддельный вектор гравитации для "
"устройства, опорный вектор `[0, 0, 9.8]` умножается на матрицу вращения. "
"Обертки для геттеров GravitySensor возвращают отдельные части фальшивого "
"вектора гравитации."

#: ../content/posts/sensorapi.md:block 47 (paragraph)
msgid ""
"Next, the `LinearAccelerationSensor` should return acceleration values "
"without the contribution of gravity. For a stationary device, it should be "
"all zeroes. Yet, vibrations may change values a little bit, e.g., spin "
"around `-0.1` to `+0.1`, as seen on the examined devices. Such vibrations "
"usually do not happen with every reading but only in intervals of seconds. "
"And thus, JShelter pseudorandomly changes these values after a few seconds."
msgstr ""
"Далее, `LinearAccelerationSensor` должен возвращать значения ускорения без "
"учета силы тяжести. Для неподвижного устройства это должны быть все нули. "
"Однако при вибрациях значения могут немного меняться, например, крутиться от "
"`-0.1` до `+0.1`, как это видно на рассмотренных устройствах. Такие "
"колебания обычно происходят не при каждом чтении, а лишь с интервалом в "
"несколько секунд. Поэтому JShelter псевдослучайно меняет эти значения через "
"несколько секунд."

#: ../content/posts/sensorapi.md:block 48 (paragraph)
msgid ""
"Finally, the `Accelerometer` sensor combines the previous two. Our wrappers "
"thus return the values from the LinearAccelerationSensor with the fake "
"gravity vector portions added."
msgstr ""
"Наконец, датчик `Акселерометр` объединяет два предыдущих. Таким образом, "
"наши обертки возвращают значения из LinearAccelerationSensor с добавленными "
"порциями фальшивого вектора гравитации."

#: ../content/posts/sensorapi.md:block 49 (paragraph)
msgid ""
"For all three classes, we return the faked orientation values using the "
"wrapped `x`, `y`, `z` component getters of the `Accelerometer.prototype`. "
"Based on the constructor name the wrapper detects which concrete class is "
"used and thus what behaviour to simulate."
msgstr ""
"Для всех трех классов мы возвращаем поддельные значения ориентации с помощью "
"обернутых геттеров компонентов `x`, `y`, `z` из `Accelerometer.prototype`. "
"По имени конструктора обертка определяет, какой конкретный класс "
"используется и, соответственно, какое поведение нужно имитировать."

#: ../content/posts/sensorapi.md:block 50 (header)
msgid "Gyroscope"
msgstr "Гироскоп"

#: ../content/posts/sensorapi.md:block 51 (paragraph)
msgid ""
"The Gyroscope sensor provides readings of the angular velocity of the device"
" along the `x`, `y`, `z` axes. The class uses the underlying `gyroscope` "
"device sensor. Physically, classic gyroscopes used a spinning wheel or a "
"disc with free axes of rotation. In modern electronic devices, gyroscopes "
"use piezoelectric or silicon transducers and [various mechanical "
"structures](https://www5.epsondevice.com/en/information/technical_info/gyro/)."
msgstr ""
"Датчик гироскопа предоставляет показания угловой скорости устройства по осям "
"`x`, `y`, `z`. Класс использует базовый датчик устройства `гироскоп`. "
"Физически в классических гироскопах использовалось вращающееся колесо или "
"диск со свободными осями вращения. В современных электронных устройствах "
"гироскопы используют пьезоэлектрические или кремниевые преобразователи и "
"[различные механические конструкции](https://www5.epsondevice.com/en/"
"information/technical_info/gyro/)."

#: ../content/posts/sensorapi.md:block 52 (header)
msgid "Fingerprinting with Gyroscope"
msgstr "Снятие отпечатков пальцев с помощью гироскопа"

#: ../content/posts/sensorapi.md:block 53 (paragraph)
msgid ""
"Gyroscope readings can be used for [speech "
"recognition](https://crypto.stanford.edu/gyrophone/) and various "
"fingerprinting operations. For stationary devices, the resonance of the "
"unique internal or external sounds affect angular velocities affect the "
"Gyroscope, and [allow to create a "
"fingerprint](https://www.researchgate.net/publication/356678825_Mobile_Device_Fingerprint_Identification_Using_Gyroscope_Resonance)."
" For moving devices, one of the options is using the Gyroscope to analyze "
"[human walking "
"patterns](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7071017/)."
msgstr ""
"Показания гироскопа могут быть использованы для [распознавания речи](https://"
"crypto.stanford.edu/gyrophone/) и различных операций по снятию отпечатков "
"пальцев. Для стационарных устройств резонанс уникальных внутренних или "
"внешних звуков влияет на угловые скорости, воздействующие на гироскоп, и "
"[позволяет создать отпечаток пальца](https://www.researchgate.net/"
"publication/"
"356678825_Mobile_Device_Fingerprint_Identification_Using_Gyroscope_Resonance)"
". Для движущихся устройств одним из вариантов является использование "
"гироскопа для анализа [моделей ходьбы человека](https://www.ncbi.nlm.nih.gov/"
"pmc/articles/PMC7071017/)."

#: ../content/posts/sensorapi.md:block 54 (header)
msgid "Wrapping the Gyroscope Readings"
msgstr "Обертывание показаний гироскопа"

#: ../content/posts/sensorapi.md:block 55 (paragraph)
msgid ""
"All velocities should be zero in an ideal state for a stationary device. As "
"we observed on the examined devices, various device sensor imperfections and"
" tiny vibrations cause the values oscillate between `-0.002` and `0.002` on "
"the examined devices. Our wrapper thus simulates the same behaviour."
msgstr ""
"В идеальном состоянии для неподвижного устройства все скорости должны быть "
"равны нулю. Как мы наблюдали на исследованных устройствах, различные дефекты "
"датчиков устройства и крошечные вибрации заставляют значения колебаться "
"между `-0.002` и `0.002` на исследованных устройствах. Таким образом, наша "
"обертка имитирует такое же поведение."

#: ../content/posts/sensorapi.md:block 56 (paragraph)
msgid ""
"The changes are applied in pseudorandom intervals between `500 ms` to `2 s`."
" These boundaries were chosen with respect to our observations from the "
"examined devices' real sensors. The actual values of change are also "
"calculated pseudorandomly from the domain hash to ensure deterministic and "
"consistent behaviour within a given domain. The faked values are then "
"returned using wrapped `x`, `y`, `z` getters of the `Gyroscope.prototype`."
msgstr ""
"Изменения вносятся в псевдослучайные интервалы от `500 мс` до `2 с`. Эти "
"границы были выбраны с учетом наших наблюдений за реальными датчиками "
"исследуемых устройств. Фактические значения изменений также вычисляются "
"псевдослучайным образом из хэша домена, чтобы обеспечить детерминированное и "
"последовательное поведение в пределах данного домена. Поддельные значения "
"затем возвращаются с помощью обернутых геттеров `x`, `y`, `z` из "
"`Gyroscope.prototype`."

#: ../content/posts/sensorapi.md:block 57 (header)
msgid "Magnetometer"
msgstr "Магнитометр"

#: ../content/posts/sensorapi.md:block 58 (paragraph)
msgid ""
"A magnetometer measures the strength and direction of the magnetic field "
"around the device. The interface offers sensor readings using three "
"properties: `x`, `y`, and `z`. Each returns a number that describes the "
"magnetic field around the particular axis. The numbers have a double "
"precision and can be positive or negative, depending on the orientation of "
"the field. The total strength of the magnetic field (`M`) can be calculated "
"as `M = sqrt(x^2 + z^2 + y^2)`. The unit is in microtesla (&micro;T)."
msgstr ""
"Магнитометр измеряет силу и направление магнитного поля вокруг устройства. "
"Интерфейс предлагает показания датчика, используя три свойства: `x`, `y` и "
"`z`. Каждое из них возвращает число, описывающее магнитное поле вокруг "
"определенной оси. Числа имеют двойную точность и могут быть положительными "
"или отрицательными, в зависимости от ориентации поля. Общая напряженность "
"магнитного поля (`M`) может быть рассчитана как `M = sqrt(x^2 + z^2 + y^2)`. "
"Единица измерения - микротесла (&micro;T)."

#: ../content/posts/sensorapi.md:block 59 (header)
msgid "Fingerprinting with Magnetometer"
msgstr "Снятие отпечатков пальцев с помощью магнитометра"

#: ../content/posts/sensorapi.md:block 60 (paragraph)
msgid ""
"The Earth's magnetic field "
"[ranges](https://doi.org/10.1111%2Fj.1365-246X.2010.04804.x) between "
"approximately 25 and 65 &micro;T. Concrete values depend on location, "
"altitude, weather, and other factors. Yet, there are characteristics of the "
"field for different places on Earth. The common model used for their "
"description is the [International Geomagnetic Reference Field "
"(IGRF)](https://www.ngdc.noaa.gov/IAGA/vmod/igrf.html). While the magnetic "
"field changes over time, the changes are slow: There is a decrease of 5% "
"every 100 years. Therefore, for the given latitude, longitude, and altitude,"
" the average strength of the field should be stable. Can one determine the "
"device's location based on the data from the Magnetometer sensor? Not "
"exactly. The measured values are influenced by the interference with other "
"electrical devices, isolation (buildings, vehicles), the weather, and other "
"factors. Moreover, the field is not unique - similar fields can be measured "
"in different places on Earth."
msgstr ""
"Магнитное поле Земли [колеблется](https://doi.org/"
"10.1111%2Fj.1365-246X.2010.04804.x) примерно между 25 и 65 &micro;T. "
"Конкретные значения зависят от местоположения, высоты над уровнем моря, "
"погоды и других факторов. Тем не менее, существуют характеристики поля для "
"разных мест на Земле. Для их описания используется общая модель "
"[International Geomagnetic Reference Field (IGRF)](https://www.ngdc.noaa.gov/"
"IAGA/vmod/igrf.html). Хотя магнитное поле меняется со временем, изменения "
"происходят медленно: каждые 100 лет оно уменьшается на 5 %. Поэтому для "
"данной широты, долготы и высоты над уровнем моря средняя напряженность поля "
"должна быть стабильной. Можно ли определить местоположение устройства по "
"данным магнитометрического датчика? Не совсем. На измеренные значения влияют "
"помехи от других электрических устройств, изоляция (здания, автомобили), "
"погода и другие факторы. Кроме того, поле не является уникальным - "
"аналогичные поля могут быть измерены в разных местах Земли."

#: ../content/posts/sensorapi.md:block 61 (paragraph)
msgid ""
"What, however, can be determined is the orientation of the device. In the "
"case of a stationary (non-moving) device, the measured values can serve as a"
" fingerprint. As we experimentally examined, it is also possible to "
"distinguish whether the device is moving or when its environment changes. "
"When a person with a cellphone enters a car or an elevator, the metal "
"barrier serves as isolation, and the strength of the field gets lower "
"rapidly (e.g., from 60&micro;T outside to 27&micro;T inside). A cellphone "
"lying on a case of a running computer can produce values over 100&micro;T, "
"especially if it is near the power supply unit. Either way, for a single "
"device at the same location in the same environment, the average strength of"
" the magnetic field should be stable."
msgstr ""
"Однако что можно определить, так это ориентацию устройства. В случае "
"стационарного (недвижущегося) устройства измеренные значения могут служить "
"отпечатком пальца. Как мы экспериментально убедились, можно также отличить, "
"движется ли устройство или когда меняется его окружение. Когда человек с "
"мобильным телефоном входит в машину или лифт, металлический барьер служит "
"изоляцией, и напряженность поля быстро снижается (например, с 60&micro;T "
"снаружи до 27&micro;T внутри). Сотовый телефон, лежащий на корпусе "
"работающего компьютера, может давать значения более 100&micro;T, особенно "
"если он находится рядом с блоком питания. В любом случае, для одного "
"устройства, находящегося в одном и том же месте в одной и той же среде, "
"средняя напряженность магнитного поля должна быть стабильной."

#: ../content/posts/sensorapi.md:block 62 (paragraph)
msgid ""
"Magnetometer values can be used for fingerprinting. First, Magnetometer "
"readings can tell the attacker whether the device is moving or not. In the "
"case of a stationary device, we can make a fingerprint from the device "
"orientation. Another fingerprintable value is the average total strength of "
"the field, which should remain stable if the device is at the same position "
"and in the same environment."
msgstr ""
"Показатели магнитометра можно использовать для снятия отпечатков пальцев. Во-"
"первых, по показаниям магнитометра злоумышленник может определить, движется "
"устройство или нет. В случае неподвижного устройства мы можем получить "
"отпечаток пальца по его ориентации. Еще одно значение, которое можно "
"использовать для отпечатков пальцев, - это средняя общая напряженность поля, "
"которая должна оставаться стабильной, если устройство находится в одном и "
"том же положении и в одной и той же среде."

#: ../content/posts/sensorapi.md:block 63 (paragraph)
msgid ""
"Yet, even moving devices can be exploited. One can misuse the sensor "
"readings to make a [calibration fingerprint attack](https://www.ieee-"
"security.org/TC/SP2019/papers/405.pdf) that infers per device factory "
"calibration data. The researchers showed the attack to be usable and "
"efficient on both Android and iOS devices. A device can be identified using "
"Magnetometer reading [through the analysis of the "
"bias](https://seclab.bu.edu/papers/magnetometer-wisec2019.pdf). Moreover, "
"the device itself also produces electromagnetic emissions and can thus be "
"identified using the [physical proximity "
"attack](https://seclab.bu.edu/papers/magnetometer-wisec2019.pdf) is also "
"possible to use an external device. As the underlying device sensor is also "
"disturbed by the device's CPU activity, Magnetometer measurements can also "
"be [used to identify running applications or web "
"pages](https://arxiv.org/pdf/1906.11117.pdf)."
msgstr ""
"Однако даже движущиеся устройства могут быть использованы. Можно "
"злоупотребить показаниями датчиков и провести атаку "
"[calibration fingerprint attack](https://www.ieee-security.org/TC/SP2019/"
"papers/405.pdf), которая выведет данные о заводской калибровке устройства. "
"Исследователи продемонстрировали работоспособность атаки на устройствах под "
"управлением Android и iOS. Устройство может быть идентифицировано по "
"показаниям магнитометра [через анализ смещения](https://seclab.bu.edu/papers/"
"magnetometer-wisec2019.pdf). Более того, само устройство также производит "
"электромагнитное излучение и поэтому может быть идентифицировано с помощью "
"атаки [на физическую близость](https://seclab.bu.edu/papers/magnetometer-"
"wisec2019.pdf) Также возможно использование внешнего устройства. Поскольку "
"основной датчик устройства также нарушается активностью процессора "
"устройства, измерения магнитометра также могут быть "
"[использованы для идентификации запущенных приложений или веб-страниц]"
"(https://arxiv.org/pdf/1906.11117.pdf)."

#: ../content/posts/sensorapi.md:block 64 (header)
msgid "Wrapping of Magnetometer readings"
msgstr "Обертывание показаний магнитометра"

#: ../content/posts/sensorapi.md:block 65 (paragraph)
msgid ""
"JShelter wraps the `x`, `y`, `z` getters of the `Magnetometer.prototype` "
"object to protect the device. Instead of using the original data, JShelter "
"returns artificially generated values that look like actual sensor readings."
msgstr ""
"JShelter оборачивает `x', `y', `z' геттеры объекта `Magnetometer.prototype`, "
"чтобы защитить устройство. Вместо того чтобы использовать оригинальные "
"данные, JShelter возвращает искусственно сгенерированные значения, которые "
"выглядят как реальные показания датчика."

#: ../content/posts/sensorapi.md:block 66 (paragraph)
msgid ""
"At every moment, our wrapper stores information about the previous reading. "
"Each rewrapped getter first checks the `timestamp` value of the sensor "
"object. If there is no difference of the prior reading's timestamp, the "
"wrapper returns the last measured value. Otherwise, it provides a new fake "
"reading."
msgstr ""
"В каждый момент времени наша обертка хранит информацию о предыдущем "
"показании. Каждый геттер обертки сначала проверяет значение `временной метки`"
" объекта датчика. Если временная метка предыдущего показания не отличается, "
"обертка возвращает последнее измеренное значение. В противном случае она "
"предоставляет новое фальшивое показание."

#: ../content/posts/sensorapi.md:block 67 (paragraph)
msgid ""
"We designed our fake field generator to fulfil the following properties:"
msgstr ""
"Мы разработали наш генератор фальшивого поля, который должен обладать "
"следующими свойствами:"

#: ../content/posts/sensorapi.md:block 68 (unordered list)
msgid ""
"The randomness of the generator should be high enough to prevent attackers "
"from deducing the sensor values."
msgstr ""
"Степень случайности генератора должна быть достаточно высокой, чтобы "
"злоумышленники не смогли вычислить значения датчиков."

#: ../content/posts/sensorapi.md:block 68 (unordered list)
msgid ""
"Multiple scripts from the same website that access readings with the same "
"timestamp must get the same results. And thus:"
msgstr ""
"Несколько скриптов одного и того же сайта, обращающихся к показаниям с одной "
"и той же временной меткой, должны получать одинаковые результаты. И таким "
"образом:"

#: ../content/posts/sensorapi.md:block 68 (unordered list)
msgid ""
"The readings are deterministic - e.g., for a given website and time, we must"
" be able to say what values to return."
msgstr ""
"Показания детерминированы - например, для заданного сайта и времени мы "
"должны быть в состоянии сказать, какие значения будут возвращены."

#: ../content/posts/sensorapi.md:block 69 (paragraph)
msgid ""
"For every \"random\" toss-up, we use the "
"[Mulberry32](https://gist.github.com/tommyettinger/46a874533244883189143505d203312c)"
" PRNG that is seeded with a value generated from the `domainHash`, which "
"ensures deterministic behaviour for the given website. First, we choose the "
"desired total strength `M` of the magnetic field at our simulated location. "
"This is a pseudorandom number from `25` to `60` &micro;T, like on the Earth."
msgstr ""
"Для каждого \"случайного\" подбрасывания мы используем ГПСЧ [Mulberry32]"
"(https://gist.github.com/tommyettinger/46a874533244883189143505d203312c), "
"который засевается значением, сгенерированным из `domainHash`, что "
"обеспечивает детерминированное поведение для данного сайта. Сначала мы "
"выбираем желаемую общую напряженность `M` магнитного поля в нашем "
"моделируемом месте. Это псевдослучайное число от `25` до `60` &micro;T, как "
"на Земле."

#: ../content/posts/sensorapi.md:block 70 (paragraph)
msgid ""
"First, we need to set the initial orientation of the axes. Our wrappers "
"support two methods:"
msgstr ""
"Во-первых, нам нужно задать начальную ориентацию осей. Наши обертки "
"поддерживают два метода:"

#: ../content/posts/sensorapi.md:block 71 (unordered list)
msgid ""
"The original implementation where the orientation of axes is drawn "
"pseudorandomly."
msgstr ""
"Оригинальная реализация, в которой ориентация осей рисуется псевдослучайным "
"образом."

#: ../content/posts/sensorapi.md:block 71 (unordered list)
msgid ""
"An improved version where we use the faked device rotation shared by other "
"wrappers. In this case, we start with the reference magnetic field vector "
"that is oriented towards the Earth's magnetic North and towards the centre "
"of the Earth. The vector is then multiplied with the shared faked rotation "
"matrix. The elements of the resulting vector then represents the axes "
"orientation."
msgstr ""
"Улучшенная версия, в которой мы используем поддельное вращение устройства, "
"применяемое в других обертках. В этом случае мы начинаем с опорного вектора "
"магнитного поля, ориентированного на северный магнитный полюс Земли и на "
"центр Земли. Затем этот вектор умножается на общую матрицу поддельного "
"вращения. Элементы полученного вектора представляют собой ориентацию осей."

#: ../content/posts/sensorapi.md:block 72 (paragraph)
msgid ""
"For both methods, the orientation is defined by a number from -1 to 1 for "
"each axis: JShelter simulates a stationary device with a pseudorandomly "
"drawn orientation in the current implementation. Therefore, we choose the "
"orientation of the device by generating a number from `-1` to `1` for each "
"axis. Those values we call `baseX`, `baseY`, and `baseZ`. By modifying the "
"above-shown formula, we calculate the `multiplier` that needs to be applied "
"to the base values to get the desired field. The calculation is done as "
"follows: `mult = (M * sqrt(baseX^2 + baseY^2 + baseZ^2) / (baseX^2 + baseY^2"
" + baseZ^2))` For axis `x`, the value should fluctuate around `baseX * "
"mult`, etc."
msgstr ""
"Для обоих методов ориентация задается числом от -1 до 1 для каждой оси: В "
"текущей реализации JShelter моделирует неподвижное устройство с "
"псевдослучайно нарисованной ориентацией. Поэтому мы выбираем ориентацию "
"устройства, генерируя число от `-1` до `1` для каждой оси. Эти значения мы "
"называем `baseX`, `baseY` и `baseZ`. Изменив показанную выше формулу, мы "
"вычисляем `умножитель`, который нужно применить к базовым значениям, чтобы "
"получить желаемое поле. Расчет производится следующим образом: `mult = (M * "
"sqrt(baseX^2 + baseY^2 + baseZ^2) / (baseX^2 + baseY^2 + baseZ^2))` Для оси "
"`x` значение должно колебаться вокруг `baseX * mult`, и т.д."

#: ../content/posts/sensorapi.md:block 73 (paragraph)
msgid ""
"How much the field changes over time is specified by the **fluctuation "
"factor** from `(0;1]` that can also be configured. For instance, `0.2` means"
" that the magnetic field on the axis may change from the base value by `20%`"
" in both positive and negative ways."
msgstr ""
"Насколько сильно меняется поле со временем, задается **коэффициентом "
"флуктуации** из `(0;1)`, который также можно настроить. Например, `0,2` "
"означает, что магнитное поле на оси может изменяться от базового значения на "
"`20%` как в положительную, так и в отрицательную сторону."

#: ../content/posts/sensorapi.md:block 74 (paragraph)
msgid ""
"The fluctuation is simulated by using a series of **sine** functions for "
"each axis. Each sine has a unique amplitude, phase shift, and period. The "
"number of sines per axis is chosen pseudorandomly based on the wrapper "
"settings. For initial experiments, we used around `20` to `30` sines for "
"each axis. The optimal configuration is in question. More sines give less "
"predictable results but also increase the computing complexity that could "
"have a negative impact on the browser's performance."
msgstr ""
"Колебания моделируются с помощью серии **синусоидальных** функций для каждой "
"оси. Каждый синус имеет уникальную амплитуду, фазовый сдвиг и период. "
"Количество синусов на ось выбирается псевдослучайно, исходя из настроек "
"обертки. В первых экспериментах мы использовали примерно от `20` до `30` "
"синусов для каждой оси. Оптимальная конфигурация находится под вопросом. "
"Большее количество синусов дает менее предсказуемые результаты, а также "
"увеличивает сложность вычислений, что может негативно сказаться на "
"производительности браузера."

#: ../content/posts/sensorapi.md:block 75 (paragraph)
msgid ""
"For the given timestamp `t`, we make the sum of all sine values at the point"
" `x=t`. The result is then shifted over the y-axis by adding `base[X|Y|Z] * "
"multiplier` to the sum. The initial configuration of the fake field "
"generator was chosen intuitively to resemble the results of the real "
"measurements. Currently, the generator uses **at least one** sine with the "
"period around `100` &micro;s (with `10%` tolerance), which seems to be the "
"minimum sampling rate obtainable using the API on mobile devices. Then, at "
"least one sine around `1 s`, around `10 s`, `1 minute` and `1 hour`. When "
"more than `5` sines are used, the cycle repeats using `modulo 5` and creates"
" a new sine with the period around `100` &micro;s, but this time the "
"tolerance is `20%`. The same follows for seconds, tens of seconds, minutes, "
"and hours. The tolerance grows every five sines. For 11+ sines, the "
"tolerance is `30%` up to the maximum (currently `50%`). The amplitude of "
"each sine is chosen pseudorandomly based on the **fluctuation factor** "
"described above. The phase shift of each sine is also a pseudorandom number "
"from [0;2&#960;)."
msgstr ""
"Для заданной временной метки `t` находим сумму всех значений синуса в точке "
"`x=t`. Затем результат сдвигается по оси y, добавляя к сумме `base[X|Y|Z] * "
"multiplier`. Начальная конфигурация генератора фальшивого поля была выбрана "
"интуитивно, чтобы напоминать результаты реальных измерений. В настоящее "
"время генератор использует **как минимум один** синус с периодом около `100` "
"&micro;s (с допуском `10%`), что, по-видимому, является минимальной частотой "
"дискретизации, которую можно получить с помощью API на мобильных "
"устройствах. Затем, по крайней мере, один синус с периодом около `1 с`, "
"около `10 с`, `1 минута` и `1 час`. Если используется более `5` синусов, "
"цикл повторяется с использованием `modulo 5` и создается новый синус с "
"периодом около `100` &micro;s, но на этот раз допуск составляет `20%`. То же "
"самое происходит для секунд, десятков секунд, минут и часов. Допуск "
"увеличивается каждые пять синусов. Для 11+ синусов допуск составляет `30%` "
"до максимума (в настоящее время `50%`). Амплитуда каждого синуса выбирается "
"псевдослучайным образом на основе **коэффициента флуктуации**, описанного "
"выше. Фазовый сдвиг каждого синуса также является псевдослучайным числом из "
"[0;2&#960;)."

#: ../content/posts/sensorapi.md:block 76 (paragraph)
msgid ""
"Based on the results, this heuristic returns believable values that look "
"like actual sensor readings. Nevertheless, the generator uses a series of "
"constants whose optimal values should be a subject of future research and "
"improvements. Perhaps, a correlation analysis with real measurements could "
"help in the future. Figures below show the values of `x`, `y`, `z`, and the "
"total strength `M` measured within 10 minutes on a: 1) Stationary device, 2)"
" Moving device, and 3) Device with the fake wrapped magnetometer."
msgstr ""
"Судя по результатам, эта эвристика возвращает правдоподобные значения, "
"похожие на реальные показания датчиков. Тем не менее, генератор использует "
"ряд констант, оптимальные значения которых должны стать предметом будущих "
"исследований и улучшений. Возможно, в будущем поможет корреляционный анализ "
"с реальными измерениями. На рисунках ниже показаны значения `x`, `y`, `z` и "
"общей силы `M`, измеренные в течение 10 минут на: 1) стационарном "
"устройстве, 2) движущемся устройстве и 3) устройстве с фальшивым обернутым "
"магнитометром."

#: ../content/posts/sensorapi.md:block 77 (paragraph)
msgid ""
"![Stationary device]({attach}/images/device_stationary.svg) ![Moving "
"device]({attach}/images/device_moving.svg) ![Device with fake "
"magnetometer]({attach}/images/device_artificial.svg)"
msgstr ""
"![Стационарное устройство]({attach}/images/device_stationary.svg) !"
"[Движущееся устройство]({attach}/images/device_moving.svg) !"
"[Устройство с фальшивым магнитометром]({attach}/images/device_artificial.svg)"

#: ../content/posts/sensorapi.md:block 78 (header)
msgid "Device Orientation Sensors"
msgstr "Датчики ориентации устройства"

#: ../content/posts/sensorapi.md:block 79 (paragraph)
msgid ""
"This group includes two sensor classes: `AbsoluteOrientationSensor` and "
"`RelativeOrientationSensor`. Both describe the physical orientation of the "
"device, and both require access to the `accelerometer` and `gyroscope` "
"device sensors. The difference between the two classes is what they consider"
" as a reference coordinate system"
msgstr ""
"В эту группу входят два класса датчиков: `AbsoluteOrientationSensor` и "
"`RelativeOrientationSensor`. Оба описывают физическую ориентацию устройства, "
"и оба требуют доступа к датчикам устройства `акселерометр` и `гироскоп`. "
"Разница между двумя классами заключается в том, что они рассматривают в "
"качестве опорной системы координат"

#: ../content/posts/sensorapi.md:block 80 (unordered list)
msgid ""
"i.e., what is the real orientation of a non-rotated device. For this "
"purpose, the `AbsoluteOrientationSensor` uses the Earth's reference "
"coordinate system. And thus, it also requires access to the `magnetometer` "
"device sensor, simply to know where the North is. The "
"`RelativeOrientationSensor` does not require this information as the "
"cardinal directions are not used. Yet, the sensor still needs to some "
"coordinate system to calculate with - i.e., physical orientation of the "
"device that is considered as reference. For this purpose, it may use the "
"orientation from the moment the sensor instance is created. When the sensor "
"is initialized, it creates a new coordinate system, and the device can be "
"considered non-rotated. Any rotations from this point are done in relation "
"to this newly created coordinate system. Readings are represented by the "
"`OrientationSensor.quaternion` made of `x`, `y`, `z`, and `w` components "
"that describe the orientation of the device."
msgstr ""
"т.е. какова реальная ориентация невращающегося устройства. Для этого "
"`AbsoluteOrientationSensor` использует земную систему координат. Таким "
"образом, ему также требуется доступ к датчику устройства `magnetometer`, "
"чтобы знать, где находится север. Датчику `RelativeOrientationSensor` эта "
"информация не требуется, поскольку кардинальные направления не используются. "
"Тем не менее, датчику все равно нужна некоторая система координат для "
"вычислений - то есть физическая ориентация устройства, которая "
"рассматривается в качестве опорной. Для этого можно использовать ориентацию "
"с момента создания экземпляра датчика. При инициализации датчика создается "
"новая система координат, и устройство можно считать не вращающимся. Любые "
"повороты с этого момента выполняются относительно этой вновь созданной "
"системы координат. Показания представляются кватернионом "
"`OrientationSensor.quaternion`, состоящим из компонентов `x`, `y`, `z` и `w`"
", которые описывают ориентацию устройства."

#: ../content/posts/sensorapi.md:block 81 (header)
msgid "Fingerprinting with Device Orientation Sensors"
msgstr "Отпечатки пальцев с помощью датчиков ориентации устройства"

#: ../content/posts/sensorapi.md:block 82 (paragraph)
msgid ""
"Device orientation sensors can be easily used for fingerprinting. As it "
"highly unlikely that two devices visiting the same site will be oriented "
"exactly the same, the orientation itself can serve as a fingerprint."
msgstr ""
"Датчики ориентации устройств можно легко использовать для снятия отпечатков "
"пальцев. Поскольку крайне маловероятно, что два устройства, посещающие один "
"и тот же сайт, будут ориентированы абсолютно одинаково, сама ориентация "
"может служить отпечатком пальца."

#: ../content/posts/sensorapi.md:block 83 (paragraph)
msgid ""
"As the device orientation sensor use data from both the `accelerometer` and "
"the `gyroscope` device sensors, determining the location using [trajectory "
"inference](https://www.researchgate.net/publication/220990763_ACComplice_Location_inference_using_accelerometers_on_smartphones)"
" or determining [human walking "
"patterns](https://www.researchgate.net/publication/322835708_Classifying_Human_Walking_Patterns_using_Accelerometer_Data_from_Smartphone)."
" could be even easier than with bare `Accelerometer` class."
msgstr ""
"Поскольку датчик ориентации устройства использует данные как от "
"`акселерометра`, так и от `гироскопа`, определение местоположения с помощью "
"[ траекторного вывода](https://www.researchgate.net/publication/"
"220990763_ACComplice_Location_inference_using_accelerometers_on_smartphones) "
"или определения [модели ходьбы человека](https://www.researchgate.net/"
"publication/"
"322835708_Classifying_Human_Walking_Patterns_using_Accelerometer_Data_from_Smartphone)"
". может быть даже проще, чем с использованием класса `акселерометр`."

#: ../content/posts/sensorapi.md:block 84 (header)
msgid "Wrapping of Device Orientation Readings"
msgstr "Обертывание показаний ориентации устройства"

#: ../content/posts/sensorapi.md:block 85 (paragraph)
msgid ""
"The `AbsoluteOrientationSensor` returns a quaternion describing the physical"
" orientation of the device in relation to the Earth's reference coordinate "
"system. As discussed above, the faked orientation of the device is drawn "
"pseudorandomly using domain hash as a seed and sored inside a global "
"variable called `orient` that is accessible to all wrappers. With each "
"reading, it loads the \"orient\" 's contents, converts the rotation matrix "
"to a quaternion that is returned by the wrapped getter. This design makes "
"the outputs realistic and in accordance with other sensors' reading. The "
"implemenation also supports possible changes of orientation."
msgstr ""
"Датчик `AbsoluteOrientationSensor` возвращает кватернион, описывающий "
"физическую ориентацию устройства относительно земной системы координат. Как "
"говорилось выше, поддельная ориентация устройства рисуется псевдослучайным "
"образом с использованием доменного хэша в качестве затравки и хранится в "
"глобальной переменной `orient`, доступной всем оберткам. При каждом чтении "
"она загружает содержимое \"orient\", преобразует матрицу вращения в "
"кватернион, который возвращается геттером обертки. Такая конструкция делает "
"выходные данные реалистичными и соответствующими показаниям других датчиков. "
"Реализация также поддерживает возможные изменения ориентации."

#: ../content/posts/sensorapi.md:block 86 (paragraph)
msgid ""
"The `RelativeOrientationSensor` also describes the orientation, but without "
"regard to the Earth's reference coordinate system. We suppose the coordinate"
" system is chosen at the beginning of the sensor instance creation. As we "
"observed, no matter how the device is oriented, there is always a slight "
"difference from the AbsoluteOrientationSensor's in at least one axis. When "
"the device moves, both sensors' readings change. But their difference should"
" always be constant. And thus, we pseudorandomly generate rotation "
"deviations from the Earth's reference coordinate system. The deviations are "
"between `0` and `π/2`. For each reading, we take the values from the fake "
"AbsoluteOrientationSensor and modify them by the constant deviation."
msgstr ""
"Датчик `RelativeOrientationSensor` также описывает ориентацию, но без учета "
"опорной системы координат Земли. Мы предполагаем, что система координат "
"выбирается в начале создания экземпляра датчика. Как мы заметили, независимо "
"от того, как ориентировано устройство, его положение всегда немного "
"отличается от положения AbsoluteOrientationSensor, по крайней мере, по одной "
"оси. Когда устройство перемещается, показания обоих датчиков меняются. Но их "
"разница всегда должна быть постоянной. Поэтому мы псевдослучайным образом "
"генерируем отклонения вращения от опорной системы координат Земли. "
"Отклонения находятся в диапазоне от `0` до `π/2`. Для каждого показания мы "
"берем значения с поддельного AbsoluteOrientationSensor и изменяем их на "
"постоянное отклонение."

#: ../content/posts/sensorapi.md:block 87 (paragraph)
msgid ""
"For both sensor classes, we return the faked orientation values using the "
"wrapped `x`, `y`, `z`, and `w` quaternion component getters of the "
"`OrientationSensor.prototype`. Based on the constructor name the wrapper "
"detects whether it should simulate the absolute or relative orientation "
"sensor's behaviour."
msgstr ""
"Для обоих классов датчиков мы возвращаем поддельные значения ориентации с "
"помощью обернутых геттеров компонентов кватернионов `x`, `y`, `z` и `w` из "
"`OrientationSensor.prototype`. По имени конструктора обёртка определяет, "
"какое поведение датчика ориентации следует имитировать - абсолютное или "
"относительное."

#: ../content/posts/support.md:block 1 (header)
msgid ""
"title: We received support from NGI0 PET Fund\n"
"date: 2021-03-30 09:00\n"
"Series: JShelter background"
msgstr ""
"Название: Мы получили поддержку от фонда NGI0 PET\n"
"дата: 2021-03-30 09:00\n"
"Серия: JShelter фоновый"

#: ../content/posts/support.md:block 2 (paragraph)
msgid ""
"We are very happy to announce that the <a "
"href=\"https://nlnet.nl/project/JSRestrictor/\">JavaScript Restrictor "
"received support from NGI0 PET Fund</a>, a fund established by NLnet with "
"financial support from the European Commission's Next Generation Internet "
"programme, under the aegis of DG Communications Networks, Content and "
"Technology under grant agreement No 825310."
msgstr ""
"Мы очень рады сообщить, что <a href="
"\"https://nlnet.nl/project/JSRestrictor/\">JavaScript Restrictor</a> получил "
"поддержку от NGI0 PET Fund</a>, фонда, созданного NLnet при финансовой "
"поддержке программы Европейской комиссии `Интернет следующего поколения` под "
"эгидой DG Коммуникационные сети, контент и технологии в рамках грантового "
"соглашения № 825310."

#: ../content/posts/support.md:block 3 (paragraph)
msgid ""
"We are very excited to improve the extension further. We will focus on the "
"following main goals:"
msgstr ""
"Мы очень хотим улучшить расширение. Мы сосредоточимся на следующих основных "
"целях:"

#: ../content/posts/support.md:block 4 (header)
msgid "1. Investigate fingerprinting scripts and prepare wrappers"
msgstr "1. Изучите скрипты для снятия отпечатков пальцев и подготовьте обертки"

#: ../content/posts/support.md:block 5 (paragraph)
msgid ""
"Review the previously identified APIs suitable for fingerprinting. Select "
"APIs suitable for JShelter and add wrappers for these APIs. This work has "
"already started, see issue #66. Additionally, we want to focus on "
"identification of methods used for fingeprinting such as those identified by"
" Iqbal et al., see https://uiowa-irl.github.io/FP-Inspector/"
msgstr ""
"Просмотрите ранее выявленные API, подходящие для отпечатков пальцев. "
"Выберите API, подходящие для JShelter, и добавьте обёртки для этих API. Эта "
"работа уже начата, см. выпуск #66. Кроме того, мы хотим сосредоточиться на "
"выявлении методов, используемых для фингерпринтинга, таких как методы, "
"выявленные Iqbal et al., см. https://uiowa-irl.github.io/FP-Inspector/"

#: ../content/posts/support.md:block 6 (header)
msgid "2. Prevent unique identification of a device"
msgstr "2. Предотвращение уникальной идентификации устройства"

#: ../content/posts/support.md:block 7 (paragraph)
msgid ""
"It is hard, if not impossible, to both prevent fingerprinting and still "
"provide customized environment for the user. Hence, we want to identify "
"fingerprinting attempts by counting the number of different APIs employed by"
" a page, especially APIs that are not frequently used for benign purposes. "
"When a fingerprinting attempt is identified, we want to (1) inform the user,"
" (2) prevent uploading of the fingerprint to the server, (3) prevent storing"
" the fingerprint for later usage."
msgstr ""
"Трудно, если вообще возможно, одновременно предотвратить отпечатки пальцев и "
"обеспечить пользователю индивидуальную среду. Поэтому мы хотим выявлять "
"попытки фингерпринтинга, подсчитывая количество различных API, используемых "
"страницей, особенно API, которые не часто используются в доброкачественных "
"целях. При обнаружении попытки снятия отпечатков пальцев мы хотим (1) "
"сообщить об этом пользователю, (2) предотвратить загрузку отпечатка пальца "
"на сервер, (3) предотвратить хранение отпечатка пальца для последующего "
"использования."

#: ../content/posts/support.md:block 8 (header)
msgid "3. Code ported from Chrome Zero"
msgstr "3. Код перенесен из Chrome Zero"

#: ../content/posts/support.md:block 9 (paragraph)
msgid ""
"In version 0.3, we integrated features of Chrome Zero 7 as it is no longer "
"maintained. By integrating the functionality to JShelter, we want to keep "
"the counter-meassures available in a maintained extension. However, we do "
"not have sufficient tests for the functionality."
msgstr ""
"В версии 0.3 мы интегрировали функции Chrome Zero 7, так как он больше не "
"поддерживается. Интегрировав эту функциональность в JShelter, мы хотим "
"сохранить контрмеры в поддерживаемом расширении. Однако у нас нет "
"достаточного количества тестов для этой функциональности."

#: ../content/posts/support.md:block 10 (header)
msgid "4. Evaluation and porting of code from Brave"
msgstr "4. Оценка и перенос кода из Brave"

#: ../content/posts/support.md:block 11 (paragraph)
msgid ""
"Brave browser currently implements anti-fingerprinting techniques that aim "
"at providing little lies about the browser environment. We want to evaluate "
"the messures and select techniques that are suitable for JShelter."
msgstr ""
"В настоящее время в браузере Brave реализованы методы защиты от отпечатков "
"пальцев, цель которых - предоставить мало ложной информации об окружении "
"браузера. Мы хотим оценить эти методы и выбрать техники, подходящие для "
"JShelter."

#: ../content/posts/support.md:block 12 (header)
msgid "5. Fixing known bugs"
msgstr "5. Исправление известных ошибок"

#: ../content/posts/support.md:block 13 (paragraph)
msgid ""
"We want to focus on the proposed changes and found bugs that are reported in"
" the GitHub bug tracker."
msgstr ""
"Мы хотим сосредоточиться на предлагаемых изменениях и найденных ошибках, о "
"которых сообщается в багтрекере GitHub."

#: ../content/posts/support.md:block 14 (unordered list)
msgid ""
"We already closed issues #53, #62, and #72 as a part of this project. The "
"fixes are already available as a part of the 0.4 subversions."
msgstr ""
"Мы уже закрыли проблемы #53, #62 и #72 в рамках этого проекта. Исправления "
"уже доступны в составе версий 0.4."

#: ../content/posts/support.md:block 14 (unordered list)
msgid ""
"We want to also deal with issues #56 and #71 that are crucial for the "
"success of the extension."
msgstr ""
"Мы также хотим рассмотреть вопросы № 56 и № 71, которые имеют решающее "
"значение для успеха расширения."

#: ../content/posts/support.md:block 14 (unordered list)
msgid ""
"We will focus on other identified bugs in the wrappers or developped "
"techniques."
msgstr ""
"Мы сосредоточимся на других выявленных ошибках в обертках или разработанных "
"методиках."

#: ../content/posts/support.md:block 15 (header)
msgid "6. Cooperation with the Privacy Shield project"
msgstr "6. Сотрудничество с проектом Щит конфиденциальности"

#: ../content/posts/support.md:block 16 (paragraph)
msgid ""
"We are also excited to announce that we found other partners that are "
"willing to work on our code base through the NGI0 PET Fund, <a "
"href=\"https://nlnet.nl/project/JavascriptShield/\">Privacy Shield project "
"run by Free Software Foundation</a>. Expect inclusion of code that will help"
" to defend your freedoms and provide anti-malware protections. This "
"cooperation should also improve the GUI of the extension and create "
"explenatory web pages explaining the functionality and its risks. It is "
"possible that the project will be rebranded as a result of the cooperation."
msgstr ""
"Мы также рады сообщить, что нашли других партнеров, готовых работать над "
"нашей кодовой базой через фонд NGI0 PET Fund, <a href="
"\"https://nlnet.nl/project/JavascriptShield/\">проект Privacy Shield под "
"управлением Free Software Foundation</a>. Ожидайте включения кода, который "
"поможет защитить ваши свободы и обеспечит защиту от вредоносного ПО. "
"Сотрудничество также должно улучшить графический интерфейс расширения и "
"создать пояснительные веб-страницы, объясняющие функциональность и ее риски. "
"Не исключено, что в результате сотрудничества проект будет подвергнут "
"ребрендингу."
