Русский
Русский
English
Статистика
Реклама

Браузеры

Перевод Современный подход к работе с куки

23.05.2021 18:15:00 | Автор: admin
Вы когда-нибудь работали с куки? Казалось ли вам при этом, что их использование организовано просто и понятно? Полагаю, что в работе с куки есть множество нюансов, о которых стоит знать новичкам.



Свойство document.cookie


Взглянем на классический способ работы с куки. Соответствующая спецификация существует, благодаря Netscape, с 1994 года. Компания Netscape реализовала свойство document.cookie в Netscape Navigator в 1996 году. Вот определение куки из тех времён:

Куки это небольшой фрагмент информации, хранящийся на клиентской машине в файле cookies.txt.

Главу про document.cookie даже можно найти во втором издании книги Javascript. The Definitive Guide, которое вышло в январе 1997 года. Это было 24 года тому назад. И мы всё ещё пользуемся тем же старым способом работы с куки ради обратной совместимости.

Как же это выглядит?

Получение куки


const cookies = document.cookie;// возвращает "_octo=GH1.1.123.456; tz=Europe%2FMinsk" on GitHub

Да, именно так всё и делается. В нашем распоряжении оказывается строка со всеми значениями, хранящимися в куки-файле, разделёнными точкой с запятой.

Как вытащить из этой строки отдельное значение? Если вам кажется, что для этого надо самостоятельно разбить строку на части знайте, что так оно и есть:

function getCookieValue(name) {const cookies = document.cookie.split(';');const res = cookies.find(c => c.startsWith(name + '='));if (res) {return res.substring(res.indexOf('=') + 1);}}

Как узнать о том, когда истекает срок действия какого-нибудь из куки? Да, в общем-то, никак.

А как узнать домен, с которого установлен какой-нибудь куки? Тоже никак.

Правда, если надо, можно распарсить HTTP-заголовок Cookie.

Установка куки


document.cookie = 'theme=dark';

Вышеприведённая команда позволяет создать куки с именем theme, значением которого является dark. Хорошо. Значит ли это, что document.cookie это строка. Нет, не значит. Это сеттер.

document.cookie = 'mozilla=netscape';

Эта команда не перезапишет куки с именем theme. Она создаст новый куки с именем mozilla. Теперь у нас имеются два куки.

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

document.cookie = 'browser=ie11; expires=Tue, 17 Aug 2021 00:00:00 GMT';

Да. Это как раз то, что мне нужно подбирать дату и время истечения срока действия куки в формате GMT каждый раз, когда нужно установить куки. Ладно, давайте воспользуемся для решения этой задачи JavaScript-кодом:

const date = new Date();date.setTime(date.getTime() + (30 * 24 * 60 * 60 * 1000)); // здорово-то какdocument.cookie = `login=mefody; expires=${date.toUTCString()}; path=/`;

Но, к счастью, у нас есть и другой способ установки момента истечения срока действия куки:

document.cookie = 'element=caesium; max-age=952001689';

Свойство max-age представляет собой срок жизни куки в секундах. Соответствующее значение имеет более высокий приоритет, чем то, которое задано с помощью свойства expires.

И не надо забывать о свойствах path и domain. По умолчанию куки устанавливаются для текущего расположения и текущего хоста. Если надо установить куки для всего домена надо будет добавить к команде установки куки конструкцию такого вида:

; path=/; domain=example.com

Удаление куки


document.cookie = 'login=; expires=Thu, 01 Jan 1970 00:00:00 GMT';

Для удаления куки надо установить дату и время истечения срока действия куки на какой-нибудь момент из прошлого. Для того чтобы всё точно сработало бы тут рекомендуется использовать начало эпохи Unix.

Работа с куки в сервис-воркерах


Это просто невозможно. Дело в том, что работа с document.cookie это синхронная операция, в результате воспользоваться ей в сервис-воркере нельзя.

Cookie Store API


Существует черновик стандарта одного замечательно API, направленного на работу с куки, который способен значительно облегчить нам жизнь в будущем.

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

Во-вторых этот API устроен гораздо понятнее, чем существующий механизм работы с куки.

Получение куки


const cookies = await cookieStore.getAll();const sessionCookies = await cookieStore.getAll({name: 'session_',matchType: 'starts-with',});

Метод getAll возвращает массив, а не строку. Именно этого я и жду, когда пытаюсь получить некий список.

const ga = await cookieStore.get('_ga');/**{"domain": "mozilla.org","expires": 1682945254000,"name": "_ga","path": "/","sameSite": "lax","secure": false,"value": "GA1.2.891784426.1616320570"}*/

А вот приятная неожиданность. Можно узнать и дату истечения срока действия куки, и сведения о домене и пути, и при этом не пользоваться никакими хаками.

Установка куки


await cookieStore.set('name', 'value');

Или так:

await cookieStore.set({name: 'name',value: 'value',expires: Date.now() + 86400,domain: self.location.host,path: '/',secure: self.location.protocol === 'https:',httpOnly: false,});

Мне очень нравится этот синтаксис!

Удаление куки


await cookieStore.delete('ie6');

Или можно, как раньше, установить дату истечения срока действия куки на некий момент в прошлом, но не вижу причины поступать именно так.

События куки


cookieStore.addEventListener('change', (event) => {for (const cookie in event.changed) {console.log(`Cookie ${cookie.name} changed to ${cookie.value}`);}});

Как видите, теперь у нас есть возможность подписываться на изменения куки, не занимаясь опросом document.cookie, блокирующим главный поток. Фантастика!

Сервис-воркеры


// service-worker.jsawait self.registration.cookies.subscribe([{name: 'cookie-name',url: '/path-to-track',}]);self.addEventListener('cookiechange', (event) => {// обработка изменений});

Можно ли пользоваться этим API прямо сейчас?


Хотя этим API уже можно пользоваться, но тут надо проявлять осторожность. Cookie Store API работоспособно в Chrome 87+ (Edge 87+, Opera 73+). В других браузерах можно воспользоваться полифиллом, который, правда, не возвращает полной информации о куки, как это сделано в настоящем API. Прогрессивные улучшения это вещь.

И учитывайте, что спецификация этого API всё ещё находится в статусе Draft Community Group Report. Но если в вашем проекте важен хороший опыт разработчика попробуйте современный способ работы с куки.

Пробовали ли вы работать с куки по-новому?


Подробнее..

Перевод CORS для чайников история возникновения, как устроен и оптимальные методы работы

23.04.2021 14:18:12 | Автор: admin


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

Если вы давно хотели разобраться в CORS и вас достали постоянные ошибки, добро пожаловать под кат.

Ошибка в консоли вашего браузера



No Access-Control-Allow-Origin header is present on the requested resource.

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://example.com/

Access to fetch at https://example.com from origin http://localhost:3000 has been blocked by CORS policy.


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

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

Но давайте-ка пойдем к истокам

В начале был первый субресурс


Субресурс это HTML элемент, который требуется вставить в документ или выполнить в контексте этого документа. В 1993 году был введен первый тег <img>. С появлением вебстал более красивым, но заодно и стал сложнее.


Верни мне мой 1993 г.

Как вы поняли, если ваш браузер отображает страницу с <img>, он должен запросить этот тег из источника. Если браузер запрашивает тег из источника, который отличается от получателя посхеме, в полностью определенному имени хоста или порту, то это и есть запрос между различными источниками (cross-origin request).

Источники & cross-origin


Источник идентифицируется следующей тройкой параметров: схема, полностью определенное имя хоста и порт. Например, <http://example.com> и <https://example.com> имеют разные источники: первый использует схему http, а второй https. Вдобавок, портом для http по умолчанию является 80, тогда как для https 443. Следовательно, в данном примере 2 источника отличаются схемой и портом, тогда как хост один и тот же (example.com).

Таким образом, если хотя бы один из трех элементов у двух ресурсов отличается, то источник ресурсов также считается разным.

Если, к примеру, мы будем сравнивать источник <https://blog.example.com/posts/foo.html> с другими источниками, то мы получим следующие результаты:

URL Результат Причина
https://blog.example.com/posts/bar.html

Тот же Отличается только путь
https://blog.example.com/contact.html

Тот же Отличается только путь
http://blog.example.com/posts/bar.html

Отличен Разные протоколы
https://blog.example.com:8080/posts/bar.html

Отличен Отличается порт (http://personeltest.ru/aways/ порт является по умолчанию 443)
https://example.com/posts/bar.html

Отличен Разный хост

Пример запроса между различными источниками: когда ресурс (то есть, страница) типа <http://example.com/posts/bar.html> попробует отобразить тег из источника <https://example.com> (заметьте, что схема поменялась!).

Слишком много опасностей запроса между различными источниками


Теперь, когда мы определились, что такое совместное использования ресурсов между разными и одинаковыми источниками, давайте посмотрим, в чем же дело.

Когда тег <img> появился во Всемирной Паутине, мы тем самым открыли ящик Пандоры. Некоторое время спустя в Сети появились теги <script>, <frame>, <video>, <audio>, <iframe>, <link>, <form> и так далее. Эти теги могут быть загружены браузером уже после загрузки страницы, поэтому они все могут быть запросами в пределах одного источника и между о разными источниками.

Давайте погрузимся в воображаемый мир, где не существует CORS и веб-браузеры допускают все типы запросов между источниками.

Предположим, у меня есть страница на сайте evil.com с <script>. На первый взгляд это обычная страница, где можно прочесть полезную информацию. Но я специально создал код в теге <script>, который будет отправлять специально созданный запрос по удалению аккаунта (DELETE/account) на сайт банка. Как только вы загрузили страницу, JavaScript запускается и AJAX-запрос попадает в API банка.


Вжух, нет вашего аккаунта

Немыслимо, да? Представьте, что вы читаете что-то на веб странице и вам приходит электронное письмо от банка, что ваш аккаунт успешно удален. Знаю, знаю если бы было так просто провести любую банковскую операцию Отвлекся.

Для того чтобы мой вредоносный <script> сработал, ваш браузер должен был также отправить ваши учетные данные (куки), взятые с банковского сайта, как часть запроса. Именно таким образом банковские серверы идентифицировали бы вас и знали, какой аккаунт нужно удалить.

Давайте рассмотрим другой, не такой зловещий сценарий.

Мне нужно опознать людей, которые работают на Awesome Corp, внутренний сайт этой компании находится по адресу intra.awesome-corp.com. На моем сайте, dangerous.com, у меня есть <img src="http://personeltest.ru/aways/intra.awesome-corp.com/avatars/john-doe.png">.

У пользователей, у которых нет активного сеансас intra.awesome-corp.com, аватарка не отобразится, так как это приведет к ошибке. Однако если вы совершили вход во внутреннюю сеть Awesome Corp., как только вы откроете мой dangerous.com сайт, я буду знать, что у вас там есть аккаунт.

Это означает, что я смогу прощупать определенную информацию о вас. Конечно, для меня будет сложнее устроить атаку, но знание о том, что у вас есть доступ к Awesome Corp., является потенциальным направлением для атаки.


Утечка информации к 3-им лицам

Эти два примера крайне упрощены, но именно такие угрозы обусловили необходимостьполитики одинакового источника и CORS Существуют разнообразные опасности, связанные с запросами между разными источниками. Некоторые из них можно сгладить, другие нет: они укоренены в природе интернета. Однако огромное количество заблокированных атак это заслуга CORS.

Но до зарождения CORS существовала политика одинакового источника.

Политика одинакового источника


Политика одинакового источника предотвращает cross-origin атаки, блокируя доступ для прочтения загружаемых ресурсов из другого источника. Такая политика все еще разрешает нескольким тегам вроде <img> загружать ресурсы из других источников.

Политика одинакового источника введена Netscape Navigator 2.02 в 1995 году, изначально для защищенного cross-origin доступа к Объектной модели документа (DOM).

Даже несмотря на то, что внедрение политики одинакового источника не требует придерживаться определенного порядка действий, все современные браузеры следуют этой политике в той или иной форме. Принципы политики описаны в запросе на спецификацию RFC6454 Инженерного совета интернета (Internet Engineering Task Force).

Выполнение политики одинакового источника определено этим сводом правил:

Теги Cross-origin Замечание
<iframe>

Встраивание разрешено Зависит от X-Frame-Options
<link>

Встраивание разрешено Надлежащий Content-Type может быть затребован
<form>

Ввод разрешен Распространены cross-origin записи
<img>

Встраивание разрешено Принятие через разные источники через JavaScript и его загрузка в <canvas> запрещены
<audio> / <video>
Встраивание разрешено
<script>

Встраивание разрешено Доступ к определенным API может быть запрещен

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

CORS же появился с целью смягчения политики одинакового источника и для тонкой настройки доступа между различными источниками.

Врываемся в CORS


Я уже разъяснил, что такое источник, как он определяется, какие ошибки бывают у запросов с различными источниками и политику общего происхождения, выполняемые браузером.

Давайте разберемся с совместным использованием ресурсов различными источниками (CORS). CORS это механизм, который дает контролировать доступ к тегам на веб странице по сети. Механизм классифицируется на три разные категории доступа тегов:

  1. Запись из разных источников
  2. Вставка из разных источников
  3. Считывание из разных источников

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

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

Вставки из разных источников это теги, загружаемые через <script>, <link>, <img>, <video>, <audio>, <object>, <embed>, <iframe> и т.п. Все они разрешены по умолчанию. <iframe> выделяется на их фоне, так как он используется для загрузки другой страницы внутри фрейма. Его обрамление в зависимости от источника может регулироваться посредством использования заголовка X-Frame-options.

Что касается <img> и других вставных тегов, то они устроены так, что сами инициируют запросы из разных источников cross-origin запроса. Именно поэтому в CORS существует различие между вставкой из разных источников и считыванием из разных источников.

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

Если ваш браузер обновлён, то он уже дополнен всей этой эвристикой.

Запись из разных источников


Операции записи из разных источников порой очень проблематичны. Давайте рассмотрим пример и посмотрим на CORS в деле.

Во-первых, у нас будет простой Crystal (с использованием Kemal) HTTP сервер:

require "kemal"port = ENV["PORT"].to_i || 4000get "/" do  "Hello world!"endget "/greet" do  "Hey!"endpost "/greet" do |env|  name = env.params.json["name"].as(String)  "Hello, #{name}!"endKemal.config.port = portKemal.run

Он просто берет запрос по ссылке /greet с name в теле запроса и возвращает Hello #{name}!. Чтобы запустить это маленький Crystal сервер мы можем написать

$ crystal run server.cr


Так запускается сервер, который будет слушать localhost:4000. Если мы откроем localhost:4000 в нашем браузере, то появиться страница с тривиальным Hello World.


Hello world!

Теперь, когда мы знаем, что наш сервер работает, давайте из консоли нашего браузера сделаем запрос POST /greet на сервер, слушающий localhost:4000,. Мы можем это сделать, используя fetch:

fetch(  'http://localhost:4000/greet',  {    method: 'POST',    headers: { 'Content-Type': 'application/json' },    body: JSON.stringify({ name: 'Ilija'})  }).then(resp => resp.text()).then(console.log)


Как только мы его запустили, мы увидим, что приветствие вернется из сервера:


Привет!

Это был POST запрос, но не из разных источников. Мы отправили запрос из браузера, где была отображена страница с адреса http://localhost:4000 (источник), к тому же источнику.

Теперь, давайте попробуем повторить такой же запрос но с различными источниками. Мы откроем https://google.com и попробуем тот же запрос с той же вкладки нашего браузера:


Привет, CORS!

Мы смогли добраться до знаменитой ошибки CORS. Несмотря на то что наш Crystal сервер смог совершить запрос, наш браузер защищает нас от нас самих. Он говорит нам, что сайт, который мы открыли, хочет внести изменения на другом сайте.

В первом примере, где мы отправили запрос в http://localhost:4000/greet из вкладки, которая отображала http://localhost:4000, наш браузер смотрит на запрос и разрешает, так как ему кажется, что наш сайт запрашивает наш сервер (что есть отлично). Но во втором примере где наш сайт (http://personeltest.ru/aways/google.com) хочет написать на http://localhost:4000, тогда наш браузер отмечает этот запрос и не разрешает ему пройти.

Предварительные запросы


Если поподробнее разобраться в консоли разработчика, в частности, заглянуть во вкладку Network, то на самом деле мы увидим два запроса вместо одного, что мы отправили:


Как видно в панеле Network, отправленных запроса две штуки

Интересно заметить, то у первого запроса в HTTP фигурирует метод OPTIONS, в то время как у второго методPOST.

Если внимательно посмотреть на запрос OPTIONS, то мы увидим, что этот запрос отправлен нашим браузером до отправления запроса POST.


Смотрим запрос OPTIONS

Интересно, что несмотря на то, что статус запроса OPTIONS был HTTP 200, он был все же отмечен красным в списке запросов. Почему?

Это предварительный запрос, который делают современные браузеры. Предварительные запросы выполняются перед запросами, которые CORS считает сложными. Признаки, свидетельствующие осложности запроса:

  • Запрос использует методы отличные от GET, POST, или HEAD
  • Запрос включает заголовки отличные от Accept, Accept-Language или Content-Language
  • Запрос имеет значение заголовка Content-Type отличное от application/x-www-form-urlencoded, multipart/form-data, или text/plain.

Следовательно, в примере выше, несмотря на то, что мы отправили запрос POST, браузер считает наш запрос сложным из-за заголовка Content-Type: application/json.

Если бы мы изменили наш сервер так, чтобы он обрабатывал контент text/plain (вместо JSON), мы бы могли обойтись без предварительных запросов:

require "kemal"get "/" do  "Hello world!"endget "/greet" do  "Hey!"endpost "/greet" do |env|  body = env.request.body  name = "there"  name = body.gets.as(String) if !body.nil?  "Hello, #{name}!"endKemal.config.port = 4000Kemal.run


Теперь, когда мы можем отправить наш запрос с заголовком Content-type: text/plain:

fetch(  'http://localhost:4000/greet',  {    method: 'POST',    headers: {      'Content-Type': 'text/plain'    },    body: 'Ilija'  }).then(resp => resp.text()).then(console.log)


Теперь, пока предварительный запрос не будет отправлен, CORS политика браузера будет постоянно блокировать запрос:


CORS стоит насмерть

Но так как мы создали запрос, который не классифицируется как сложный, наш браузер не заблокирует запрос.


Запрос прошел

Проще говоря, наш сервер неправильно настроен на принятие text/plain запросов из разных источников без какой-либо защиты и наш браузер не сможет ничего с этим поделать. Но все же он делает следующую вещь: он не показывает нашу открытую страницу/вкладку в ответ на это запрос. Следовательно, в этом случае CORS не блокирует запрос, он блокирует ответ.

CORS политика вашего браузера считает, что это фактически считывание из разных источников, так как, несмотря на то, что запрос был отправлен как POST, Content-type значение заголовка по сути приравнивает его кGET. Считывания из разных источниковзаблокированы по умолчанию, следовательно мы видим заблокированный запрос в нашей панели Network.

Не рекомендуется избегать предварительных запросов, то есть, действовать, как в вышеприведенном примере. Если вы ожидаете, что ваш сервер должен будет незаметно обрабатыватьпредварительные запросы, то на в таком случае он должен будет реализовывать конечные точки для приема запросовOPTIONS и возвращать правильные заголовки.

Выполняя запрос OPTIONS, вы должны помнить, что предварительный запрос браузера проверяет наличие трех заголовков, которые могут быть в ответе:

  • Access-Control-Allow-Methods, который указывает на то, какие методы поддерживаются URL-ом ответа в контексте CORS протокола.
  • Access-Control-Allow-Headers, который указывает, на то, какие заголовки поддерживаются URL-ом ответа в контексте CORS протокола.
  • Access-Control-Max-Age, который указывает число секунд (5 по умолчанию) и это значение соответствует периоду, накоторый предоставляемая заголовками Access-Control-Allow-Methods и Access-Control-Allow-Headers информация может быть кэширована.

Давайте вернемся к предыдущему примеру, где мы отправили сложный запрос:

etch(  'http://localhost:4000/greet',  {    method: 'POST',    headers: { 'Content-Type': 'application/json' },    body: JSON.stringify({ name: 'Ilija'})  }).then(resp => resp.text()).then(console.log


Мы уже выяснили, что когда мы отправляем запрос, наш браузер будет сверяться с сервером, можно ли выполнить запрос с данными из разных источников. Чтобы обеспечить работоспособность в среде с разными источниками, мы должны сначала добавить конечную точку OPTIONS/greet к нашему серверу. В заголовке ответа новая конечная точка должна сообщить браузеру, что запрос на POST /greet с заголовком Content-type: application/json из источника https://www.google.com может быть принят.

Мы это сделаем, используя заголовки Access-Control-Allow-*:

options "/greet" do |env|  # Allow `POST /greet`...  env.response.headers["Access-Control-Allow-Methods"] = "POST"  # ...with `Content-type` header in the request...  env.response.headers["Access-Control-Allow-Headers"] = "Content-type"  # ...from https://www.google.com origin.  env.response.headers["Access-Control-Allow-Origin"] = "https://www.google.com"end


Если мы запустим сервер и отправим запрос, то


Все еще заблокирован?

Наш запрос остается заблокированным. Даже несмотря на то что наша конечная точка OPTIONS/greet в самом деле разрешила запрос, мы пока еще видим сообщение об ошибке. В нашей панели Network происходит кое-что интересное:


OPTIONS стал зеленым!

Запрос в конечную точку OPTIONS/greet прошел успешно! Однако запрос POST /greet все еще терпит неудачу. Если взглянуть на внутрь запроса POST /greet мы увидим знакомую картинку:


POST тоже стал зеленым?

На самом деле запрос удался: сервер вернул HTTP 200. Предварительный запрос заработал. Браузер совершил POST-запрос вместо того, чтобы его заблокировать. Однако ответ на запрос POST не содержит никаких CORS заголовков, так что даже несмотря на то, что браузер сделал запрос, он заблокировал любой ответ.

Чтобы разрешить браузеру обработать ответ из запроса POST /greet, нам также нужно добавить заголовок CORS к конечной точке POST:

post "/greet" do |env|  name = env.params.json["name"].as(String)  env.response.headers["Access-Control-Allow-Origin"] = "https://www.google.com"  "Hello, #{name}!"end


Добавляя к заголовку Access-Control-Allow-Origin заголовок ответа, мы сообщаем браузеру, что вкладка с открытой https://www.google.com имеет доступ к содержимому ответа.

Если попытаться еще разок, то


POST работает!

Мы увидим, что POST /greet получил для нас ответ без каких-либо ошибок. Если посмотреть на панели Network, то мы увидим, что оба запроса зеленые.


OPTIONS & POST в деле!

Используя надлежащие заголовки ответа в нашем конечной тоске OPTIONS /greet, выполнявшей предварительный запрос, мы разблокировали конечную точку POST /greet нашего сервера, так^ чтобы он имел доступ к информации из разных источников.Вдобавок, предоставляя правильный CORS заголовок ответа в ответе конечной POST /greet, мы позволили браузеру обрабатывать ответы без возникновения блокировок.

Считывание из разных источников


Как мы отмечали ранее, считывание из разных источников блокируются по умолчанию. Это делается намеренно: мы не хотели бы загружать другие ресурсы из других источников в пределах нашего источника.

Скажем, в нашем Crystal сервере есть действие GET /greet.

get "/greet" do  "Hey!"end

Из нашей вкладки, что передала www.google.com если мы попробуем запросить эндпоинт GET /greet, то CORS нас заблокирует:


CORS блокирует

Если посмотрим поглубже в запрос, то мы найдем кое-что интересное:



На самом деле, как и прежде, наш браузер разрешил запрос: мы получили код состоянияHTTP 200. Однако он не показал нашу открытую страницу/вкладку в ответ на этот запрос. Еще раз, в данном случае CORS не заблокировал запрос, он заблокировал ответ.

Так же, как и в случае с записью из разных источников, мы можемосвободить CORS и обеспечить считывание из разных источников, добавляя заголовок Access-Control-Allow-Origin:

get "/greet" do |env|  env.response.headers["Access-Control-Allow-Origin"] = "https://www.google.com"  "Hey!"end


Когда браузер получит ответ от сервера, он проверит заголовок Access-Control-Allow-Origin и исходя изего значения решит, сможет ли он позволить странице прочитать ответ. Учитывая, что в данном случае значением является https://www.google.com, итог будет успешным:


Успешный запрос GET между разными источниками

Вот как наш браузер защищает нас от считывания из разных источников и соблюдает директивы server, сообщенныечерез заголовки.

Тонкая настройка CORS


Как мы уже видели в предыдущих примерах, чтобы смягчить политику CORS нашего сайта мы можем присвоить опцию Access-Control-Allow-Origin для нашего действия /greet значению https://www.google.com:

post "/greet" do |env|  body = env.request.body  name = "there"  name = body.gets.as(String) if !body.nil?  env.response.headers["Access-Control-Allow-Origin"] = "https://www.google.com"  "Hello, #{name}!"end

Это разрешит нашему источнику https://www.google.com запросить наш сервер, и наш браузер свободно сделает это. Имея Access-Control-Allow-Origin мы можем попробовать снова выполнить вызов fetch:


Сработало!

И это работает! С новой политикой CORS мы можем вызвать действие /greet из нашей вкладки, в которой загружена страница https://www.google.com. Или, мы могли бы присвоить заголовку значение *, которое сообщило бы браузеру, что сервер может быть вызван из любого источника.

Устанавливая такую конфигурацию, нужно тщательно взвесить все риски. Тем не менее, вставка заголовков с нестрогими требованиями к CORS почти всегда безопасна. Есть эмпирическое правило: если вы открываете URL в приватной вкладке и вас устраивает информация, которая там отображается, то вы можете установить разрешающую CORS политику (*) для данного URL.

Другой способ настройки CORS на нашем сайте это использование заголовка запроса Access-Control-Allow-Credentials. Access-Control-Allow-Credentials запрашивает браузер, показывать ли ответ JavaScript коду клиентской части, когда в качестве режима учетных данных запроса используется include.

Учетный режим запросов исходит из внедрения Fetch API, который в свою очередь корнями идет к объектам XMLHttpRequest:

var client = new XMLHttpRequest()client.open("GET", "./")client.withCredentials = true


С вводом fetch, метод withCredentials превратился в опциональный аргумент fetch запроса:

fetch("./", { credentials: "include" }).then(/* ... */)

Доступными опциями для обработки учетных данныхявляются omit, same-origin и include. Доступны разные режимы, так что программист может настроить отправляемый запрос, пока ответ от сервера сообщает браузеру как вести себя, когда учетные данные отправлены с запросом (через заголовок Access-Control-Allow-Credential).

Спецификация Fetch API содержит подробно расписанный и детально разобранный функционал взаимодействия CORS и Web API fetch, а также характеризует механизмы безопасности, используемые браузерами.

Несколько правильных решений


В завершении, давайте рассмотрим некоторые из рекомендуемыхметодов, касающихся совместного использования ресурсов между разными источниками (CORS).

Свободный доступ для всех


Как правило, это тот случай, когда у вас есть сайт с открытым контентом, не ограниченный платным доступом или сайт, требующий аутентификацию или авторизацию. Тогда вы должны установить Access-Control-Allow-Origin: * для ресурсов сайта.

Значение * хорошо подойдетв случаях, когда

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

Опасные последствия от применения такой конфигурации наступают, когда контент подается на частном сервере (то есть за брандмауэрами или VPN). Когда вы подключены через VPN, у вас есть доступ к файлам в сети компании:


Сверхупрощение VPN

Теперь, когда взломщик захостит dangerous.com, который содержит ссылку файла с VPN, то (в теории) он может создать скрипт в их сайте, который сможет иметь доступ к этому файлу:


Утечка файла

В то время как атаку такого типа сложно устроить и это требует широких знаний о конкретном VPN и файлах, хранящихся в нем, это потенциальный вектор атаки, о которым мы должны знать.

Всё в семью


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

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

В таких случаях наш API общедоступен, но мы не хотим, чтобы какой-либо сайт прислал данные в наш аналитический API. На самом деле мы заинтересованы только в запросах, исходящих из браузеров, открывавших наш сайт, вот и все.



В данных случаях мы хотим, чтобы наш API установил заголовок Access-Control-Allow-Origin к URL нашего сайта. Это обеспечит нас тем, что браузеры никогда не отправят запросы нашему API с других страниц.

Если пользователи или другие сайты попробуют взломать данные нашего аналитического API, то набор заголовков Access-Control-Allow-Origin, установленный на нашем API, не пропустит запрос.



Null источник


Другим интересным случаем является null источник. Это происходит, когда ресурс получает доступ от браузера, который отображает локальный файл. Например, запросы, исходящие из определенного JavaScript, работающего в статическом файле на вашем ПК, имеют заголовок Origin со значением null.

В таких случаях, если ваш сервер разрешает доступ к ресурсам для null источников, то это может мешать продуктивности разработчика. Разрешение null источников в политике CORS должно быть сделано намеренно, и только если пользователями вашего сайта/продукта пока являются только его разработчики.

Пропускай куки, если возможно


Как мы уже видели с Access-Control-Allow-Credentials, куки не включены по умолчанию. Чтобы разрешить отправку куки с разных источников, нужно просто вернуть Access-Control-Allow-Credentials: true. Этот заголовок сообщит браузерам, что им разрешается пересылать удостоверяющие данные (то есть куки) в запросах между разными источниками.

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

Куки между разными источниками полезнее всего в ситуациях, когда вы точно знаете какие именно клиенты будут иметь доступ к вашему серверу. Именно поэтому семантика CORS не позволяет нам установить Access-Control-Allow-Origin: *, когда удостоверяющие данные между разными источниками разрешены.

В то время как комбинация из Access-Control-Allow-Origin: * и Access-Control-Allow-Credentials: true технически разрешается, она является анти-паттерном и ее следует безусловно избегать.

Если вы хотите, чтобы к вашим серверам имели доступ разные клиенты и источники, то вам стоит рассмотреть возможность создания API с аутентификацией через пароль вместо использования куков. Но если вариант с API не является оптимальным, то обеспечьте себя защитой от фальсификатора межсайтовых запросов (CSRF).

Дополнительная литература


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




Наши серверы можно использовать для разработки и хостинга сайтов любой сложности.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Firefox представил новую архитектуру безопасности браузера с изоляцией сайтов

19.05.2021 16:06:46 | Автор: admin

Firefox, как и любой другой браузер, может загружать код с ненадёжных и потенциально опасных сайтов, а потом запускать его на компьютере. Чтобы защитить пользователей и вывести безопасность работы в интернете на новый уровень, команда Mozilla решила переработать свой браузер.

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

Для защиты данных Firefox применяет различные механизмы безопасности, например,Правило ограничения домена(Same Origin Policy Принцип одинакового источника),которое ограничивает взаимодействие информации, поступившей из разных источников. То есть предотвращает доступ злоумышленников к информации с других ресурсов, загружаемых в одном и том же приложении. Но этого недостаточно. Чтобы оградить пользователей от потенциальных угроз, следует полностью разделять пространство памяти, выделенное под разные сайты новая архитектура Firefox обеспечивает эти гарантии безопасности.

Почему так важно разделение пространства памяти

В начале 2018 года специалисты, исследующие вопросы безопасности, обнаружили две основные уязвимости, известные какMeltdown(аппаратнаяуязвимость, которая использует ошибку реализацииспекулятивного выполнения командв некоторых процессорах Intel и ARM, из-за которой процессор игнорирует права доступа к страницам.) иSpectre(группа аппаратныхуязвимостей большинства процессоров, позволяющая считывать данные черезсторонний канал). Специалисты продемонстрировали, как ненадёжный сайт может дать злоумышленникам доступ к памяти процесса даже на таком высокоуровневом языке, как JavaScript (на котором работает почти каждый сайт).

Для защиты от уязвимостей были развёрнуты временные меры противодействия со стороны ОС, ЦП и основных веб-браузеров. Они быстро нейтрализовали атаки, однако привели к снижению производительности. Но это были именно временные заплатки.

Firefox решила коренным образом переделать архитектуру браузера, чтобы оградить пользователей от текущих и будущих версий подобных уязвимостей. На картинке ниже подробно рассматривается пример того, как злоумышленник может получить доступ к личным данным при атаке, подобной Spectre.

С новой архитектурой Firefox загружает каждый сайт в своём собственном процессе, тем самым изолируя их память друг от друга. Например, у пользователя открыто два сайта: www.my-bank.com и www.attacker.com.Как показано на картинке выше, со старой архитектурой браузера контент с обоих сайтов может быть загружен в один и тот же процесс операционной системы.Если с сайта www.attacker.com произойдёт атака наподобие Spectre, злоумышленники смогут запрашивать и получать доступ к данным с сайта my-bank.com.

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

Как работала прежняя архитектура браузера

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

Эта многопроцессорная архитектура позволяла Firefox разделять более сложный или менее надёжный код на отдельные процессы, большинство из которых имеют ограниченный доступ к ресурсам операционной системы или пользовательским файлам.Как следствие, менее привилегированный код должен был запросить более привилегированный код для выполнения операций, которые он сам выполнить не мог.

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

Родительский процесс Firefox (по состоянию на апрель 2021 г.) запускал фиксированное количество процессов: восемь процессов веб-контента, до двух дополнительных полу-привилегированных процессов веб-контента и четыре служебных процесса для веб-расширений, операций с графическим процессором, работы в сети и декодирования медиа.

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

Что происходит на иллюстрации выше? Пользователь открывает в разных вкладках сайты: www.my-bank.com, www.getpocket.com, www.mozilla.org и www.attacker.com.Может так получиться, что my-bank.com и attacker.com будут обрабатываться одним и тем же процессом операционной системы, то есть они будут совместно использовать память этого процесса.Соответственно, злоумышленник может выполнить атаку типа Spectre для доступа к данным с my-bank.com.

Ещё один важный момент: без изоляции сайтов браузер будет загружать все всплывающие страницы в том же процессе, что и сайт верхнего уровня. Субфреймы (реклама, встроенное видео), тоже обрабатываются в общем процессе. В результате вредоносный сайт может получить доступ к субфреймам и конфиденциальной информации, которую вы там вводите. Новая архитектура безопасности изоляции сайтов в Firefox не позволит совершать такие атаки.

Как работает новая архитектура Firefox с изоляцией сайтов

При добавлении Изоляции сайтов в Firefox для настольных ПК каждый уникальный сайт будет создавать свой отдельный процесс.Например, если вы загрузите https://mozilla.org и http://getpocket.com, браузер с изоляцией сайтов разделит их по двум разным процессам операционной системы, поскольку они не являются одним и тем же сайтом.

Точно так же https://getpocket.com (обратите внимание, здесь именно протокол https, а не http, как в предыдущем абзаце) также будет загружен в отдельный процесс. То есть все три сайта будут загружаться в разных процессах.

Более того, существуют некоторые домены, такие как .github.io или .blogspot.com, которые являются слишком общими, чтобы можно было идентифицировать их, как сайт.Поэтому для работы с ними Firefox будет использовать поддерживаемыйсообществомсписок доменов верхнего уровня (eTLD), чтобы помочь различать сайты.

Поскольку github.io указан как eTLD, a.github.io и b.github.io будут загружаться в разных процессах.Если вернуться к примерам, о которых говорилось ранее, сайты www.my-bank.com и www.attacker.com не считаются одним сайтом, поэтому они будут изолированы друг от друга в отдельных процессах. Память также будет изолирована, что гарантирует безопасность данных.

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

На картинке выше видно, что страница www.attacker.com пытается встроить субфреймом страницу с www.my-bank.com, но она будет загружена в другом процессе.Это гарантирует, что память процессов также будет изолирована.

Дополнительные преимущества изоляции сайтов

Новая архитектура не только делает Firefox безопаснее.Она даёт и другие преимущества:

  • Благодаря тому, что больше страниц помещается в отдельные процессы, выполнение тяжёлых вычислений на одной странице не замедлят работу других страниц.

  • Использование большего количества процессов для загрузки веб-сайтов позволяет распределять нагрузку по многим ядрам ЦП и более эффективно использовать железо.

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

Планы и перспективы

В настоящее время Firefox тестирует изоляцию сайтов в ночных и бета-версиях браузеров для ПК.Однако воспользоваться улучшенной архитектурой безопасности можно уже сейчас. Для этого нужно загрузить браузер Nightly или Betaотсюдаи выполнить следующие действия:

Чтобы включить изоляцию сайта в Firefox Nightly:

  1. Перейдите к about: Preferences#Experiment

  2. Установите флажок Fission (Site Isolation).

  3. Перезагрузите Firefox.

Чтобы включить изоляцию сайта в Firefox Beta:

  1. Перейдите к about: config.

  2. Установите для параметра `fission.autostart` значение `true `.

  3. Перезагрузите Firefox.

Теперь можно осваивать обновлённый браузер и радоваться усиленной безопасности.


Что ещё интересного есть в блогеCloud4Y

Частые ошибки в настройках Nginx, из-за которых веб-сервер становится уязвимым

Пароль как крестраж: ещё один способ защитить свои учётные данные

Облачная кухня: готовим данные для мониторинга с помощью vCloud API и скороварки

Подготовка шаблона vApp тестовой среды VMware vCenter + ESXi

Почему ваш бизнес может быть разрушен

Подписывайтесь на нашTelegram-канал, чтобы не пропустить очередную статью. Пишем не чаще двух раз в неделю и только по делу.

Подробнее..

Наша анонимность утрачена?

04.06.2021 22:07:07 | Автор: admin

IT-технологии развиваются с каждым годом. Многие корпорации полным ходом развивают технологические подходы в области сбора и обработки полученной информации. Одним из таких подходов является использование баз данных цифровых отпечатков пользователей сети Интернет.

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

1. Ip-адрес. Провайдеры годами хранят статистику на каком ip-адресе работал их пользователь. Зная ip-адрес можно легко вычислить расположение пользователя.

2. DNS-запросы. Каждый раз, когда Ваш браузер хочет получить доступ к определенной службе, например Google, обратившись к www.google.com, Ваш браузер запросит службу DNS, чтобы найти IP-адреса веб-серверов Google. Таким образом, интернет-провайдер DNS-записей сможет рассказать обо всем, что Вы делали в сети, просто просмотрев те журналы, которые, в свою очередь, могут быть предоставлены злоумышленнику.

3. NFC-платежи через устройства. Данная технология используется для выполнения бесконтактных платежей. По сути это радиочастотная идентификация. Вы заходите в магазин и на рамке происходит сканирование любых RFID-чипов, которые есть у вас: бесконтактные карты, транспортные карты, рабочие карты доступа, ключи от машины. Эти данные можно собирать и использовать для поиска людей.

4. Устройства Wi-Fi и Bluetooth вокруг Вас. Производители смартфонов заложили функции поиска Вашего местонахождения без использования GPS-функций. Достаточно сканировать Wi-Fi сети вокруг устройства. Данные о Вашем местоположении отправляются на сервера третьих компаний.

5. Использование Wi-Fi на смартфоне. Чтобы получить Ваши данные хакеры могут использовать специальные устройства, которые будут мешать работе wi-fi точек доступа и вынуждать Ваш смартфон подключиться к их устройству вместо публичной wi-fi точки доступа. В этом случае все Ваши данные становятся доступными для злоумышленника. В данном случае используются технологии MITM (Man-In-The-Middle) или человек посередине.

6. Использование Tor/VPN. За прошедшие годы было разработано и изучено множество передовых методов деанонимизации зашифрованного трафика Tor. Атака по корреляционным отпечаткам пальцев: эта атака будет отпечатывать ваш зашифрованный трафик (например, веб-сайты, которые вы посещали) только на основе анализа вашего зашифрованного трафика (без его расшифровки). Он может сделать это с колоссальным успехом в 96%. Такие отпечатки пальцев могут использоваться злоумышленником, имеющим доступ к вашей исходной сети (например, Ваш интернет-провайдер), для выяснения некоторых ваших зашифрованных действий (например, какие веб-сайты вы посещали).

7. Современные смартфоны на Android, IOS.
После выключения такого устройства оно будет продолжать передавать идентификационную информацию на близлежащие устройства даже в автономном режиме с использованием Bluetooth Low-Energy. Это дает способ найти Вас даже если Ваш телефон выключен, но имеет подключенный аккумулятор.

8. IMEI идентификатор Вашего оборудования. IMEI привязан непосредственно к телефону, который вы используете. Этот номер известен и отслеживается операторами мобильной связи, а также известен производителями. Каждый раз, когда ваш телефон подключается к мобильной сети, он регистрирует IMEI в сети. Он также используется многими приложениями (например, банковскими приложениями, злоупотребляющими разрешением телефона на Android) и операционными системами смартфонов (Android/IOS) для идентификации устройства. Сегодня предоставление вашего реального номера телефона в основном то же самое или лучше, чем предоставление вашего паспорта. Журналы антенн оператора мобильной связи также хранят некоторые данные о подключении. Они знают и регистрируют, например, что телефон с IMEI, подключен к набору мобильных антенн, и насколько мощный сигнал каждой из этих антенн. Это позволяет легко выполнять триангуляцию/геолокацию сигнала. Они также знают, какие другие телефоны (например, ваш настоящий) подключены в одно и то же время к тем же антеннам с тем же сигналом, что позволит точно знать, что этот телефон всегда был подключен в том же месте и в то же время, что и этот другой телефон, который появляется каждый раз, когда используется записывающий телефон. Эта информация может использоваться различными третьими сторонами для точного определения вашего местоположения/отслеживания.

9. Ваш браузер. При посещении любых сайтов ваш браузер получает уникальные cookie-данные с каждого сайта. Ваши данные в браузере становятся уникальными, а это значит, что веб-порталы знают кто зашел через браузер. На смену cookies приходят supercookies и Ваша анонимность сводится практически к нулю.

10. Покупки через карты. Банк собирает информацию о ваших покупках. Банк знает сколько, на что и где вы тратите деньги. Банк видит ваши предпочтения, может предсказать Ваши последующие действия проанализировав предыдущий период, в нужный момент предложить финансовые услуги. Этими данными банк может поделиться с третьими организациями.

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

12. Использование антивируса. Антивирус кроме основных своих целей по поиску и обезвреживанию вирусов анализирует вашу сетевую активность, данные браузеров. Эти данные могут быть переданы третьим лицам.

При повышении количества собранных данных формируется цифровой профиль человека, которые содержат в себе:

  • пол;

  • возраст;

  • семейное положение;

  • политические, религиозные взгляды;

  • финансовое состояние;

  • интересы;

  • привычки;

  • и многие другие.

Согласно результатам исследования EFF (Electronic Frontier Foundation), уникальность отпечатка браузера очень высока и он содержит в себе ниже описанные данные:

  • User-agent (включая не только браузер, но и версию ОС, тип устройства, языковые настройки, панели инструментов и т.п.);

  • Часовой пояс;

  • Разрешение экрана и глубину цвета;

  • Supercookies;

  • Настройки куки;

  • Системные шрифты;

  • Плагины к браузеру и их версии;

  • Журнал посещений;

  • И другие данные.

Если говорить о статистике, то только раз на 286777 случаев случается полное совпадение отпечатков браузеров двух разных пользователей.

Согласно исследованию Browser Fingerprinting via OS and Hardware Level Features, точность идентификации пользователя при помощи отпечатка браузера составляет 99,24%.

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

Статья написана в соавторстве:
1. Меньшиков Ярослав
2. Беляев Дмитрий

Подробнее..

Перевод Находим опасные браузерные расширения по фальшивым отзывам

05.06.2021 16:05:21 | Автор: admin
Фальшивые положительные отзывы заполонили все уголки современного цифрового мира, они вводят в заблуждение потребителей, предоставляя нежелательное преимущество мошенникам и посредственным продуктам. К счастью, обнаружение и отслеживание аккаунтов, создающих подобные фальшивые отзывы, часто является простейшим способом выявления мошенничества. В этой статье мы расскажем о том, как ложные отзывы о поддельном браузерном расширении Microsoft Authenticator позволили выявить десятки других расширений, вытягивающих у пользователей личные и финансовые данные.


Комментарии под фальшивым браузерным расширением Microsoft Authenticator показывают, что отзывы на эти приложения или положительны, или сильно отрицательны, и это, по сути, даёт понять, что оно мошенническое.

Услышав от нашего читателя о поддельном расширении Microsoft Authenticator, появившемся в Google Chrome Store, мы начали исследовать создавший его аккаунт. До удаления расширения под ним было пять отзывов: три пользователя Google поставили ему одну звезду, предупреждая людей, что им не нужно пользоваться, но два комментатора поставили ему три и четыре звезды.

Отличное расширение!, с восторгом пишет Google-аккаунт Theresa Duncan. Проблем с ним почти не было

Очень удобное и приятное, невразумительно оценивает расширение Anna Jones.

Google Chrome Store сообщил, что адрес электронной почты, связанный с аккаунтом, опубликовавшим поддельное расширение Microsoft, также выпустил ещё одно расширение под названием iArtbook Digital Painting. Прежде чем его удалили из Chrome Store, у расширения iArtbook появилось 22 пользователя и три отзыва. Как и в случае с поддельным расширением Microsoft, все три отзыва были положительными, и все были созданы аккаунтами с именем и фамилией наподобие Megan Vance, Olivia Knox, и Alison Graham.

В Google Chrome Store не так просто выполнять поиск по оставившим отзывы. Для этого я воспользовался сервисом chrome-stats.com разработчика Хао Нгуена. Сервис индексирует массив атрибутов, связанных с расширениями Google, позволяя выполнять по ним поиск.

Изучая Google-аккаунты, оставившие положительные отзывы об уже заблокированных расширениях Microsoft Authenticator и iArtbook, мы обратили внимание, что каждый из них оставил отзывы ещё на несколько расширений, которые тоже были удалены.


Отзывы на расширение iArtbook получены от очевидно фальшивых Google-аккаунтов, каждый из которых оставлял отзывы на два других расширения, одно из которых опубликовано тем же разработчиком. Такой же паттерн наблюдается у ещё 45 заблокированных расширений.

Как постоянно разрастающаяся диаграмма Венна, отзывы на расширения, оставленные каждым новым фальшивым аккаунтом, приводили к открытию новых фальшивых аккаунтов и расширений. Приблизительно за 24 часов исследований при помощи chrome-stats.com было обнаружено больше ста положительных отзывов, находящихся в сети однозначно мошеннических расширений.

Эти отзывы, в свою очередь, привели к достаточно простому выявлению:

  • 39 комментаторов, которые были довольны расширениями, являющимися подделками крупных брендов или запрашивающими финансовые данные
  • 45 зловредных расширений, суммарно имеющих почти 100 тысяч скачиваний
  • 25 аккаунтов разработчиков, связанных с несколькими забаненными приложениями.

Расширения имитировали многие потребительские бренды, в том числе Adobe, Amazon, Facebook, HBO, Microsoft, Roku и Verizon. После изучения каждого из этих расширений мы, в свою очередь, выявили, что многие из их разработчиков были связаны с несколькими приложениями, продвигаемыми через те же фальшивые Google-аккаунты.

У некоторых из поддельных расширений было всего с десяток скачиваний, но у большинства они исчислялись сотнями или тысячами. Фальшивое расширение Microsoft Teams примерно за два месяца присутствия в Google store получило 16200 скачиваний. Поддельная версия пакета для профессионального монтажа видео CapCut за почти такой же срок получила около 24000 скачиваний.


Больше 16 тысяч людей скачало фальшивое браузерное расширение Microsoft Teams за те два месяца, пока оно находилось в Google Chrome store.

В отличие от зловредных браузерных расширений, способных превратить ваш PC в ботнет или собирать куки, ни одно из исследованных расширений не запрашивает у пользователей особых разрешений. Однако после установки все они неизменно спрашивают у пользователей личные и финансовые данные, притворяясь, будто связаны с крупными брендами.

В некоторых случаях фальшивые аккаунты и разработчики поддельных расширений в этой схеме имеют одинаковые имена, например, в случае brook ice Google-акаунта, положительно оценившего зловредные расширения Adobe и Microsoft Teams. Адрес электронной почты brookice100@gmail.com был использовал для регистрации аккаунта разработчика, создавшего ещё два поддельных расширения, изученных в нашем обзоре (PhotoMath и Dollify).


Часть данных, послуживших основой для нашего отчёта. Ссылка на полную таблицу представлена в конце статьи.

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

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

Мы поделились своими находками с Google и дополним статью, если компания нам ответит. Как бы то ни было, Google уже распознала все эти расширения как мошеннические и удалила их из магазина.

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

Я провёл это исследование в основном из интереса. Мне показалось, что им будет любопытно поделиться с другими. Кроме того, меня восхитила мысль о том, что для поиска фальшивых приложений достаточно всего лишь обнаруживать и отслеживать фальшивых комментаторов. Я уверен, что сеть мошеннических расширений шире, чем описанная в этой статье.

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

По данным chrome-stats.com, большинство расширений (более чем 100 тысяч), по сути, заброшено своими авторами или не обновлялось более двух лет. Другими словами, есть много разработчиков, которые готовы продать своё творение вместе с базой пользователей.

Информацию из данного отчёта можно найти в этой электронной таблице Google.



На правах рекламы


VDSina предлагает безопасные VDS с посуточной оплатой, возможностью установить любую операционную систему, каждый сервер подключён к интернет-каналу в 500 Мегабит и бесплатно защищён от DDoS-атак!

Присоединяйтесь к нашему чату в Telegram.

Подробнее..

Дайджест свежих материалов из мира фронтенда за последнюю неделю 464 (19 25 апреля 2021)

26.04.2021 00:06:32 | Автор: admin
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.


Медиа|Веб-разработка|CSS|JavaScript|Браузеры|Занимательное|


Медиа


podcast Callback Hell записи аудио-стримов о технологиях и не только от CSSSR
podcast Подкаст Фронтенд Юность #182: Не нужно платить разработчикам 200-300к
podcast Новости 512 от CSSSR: релиз Node.js 16 и Firefox 88, проектирование приложения с TypeScript и ООП, взгляд на Container Query, доклады с Я.Субботника.
podcast Новости 512 от CSSSR: Микрофронтенды в Delivery Club, JS-классы, состояние JS-фреймворков и стейт-менеджеров, минусы Dart
video IT-дебаты: JavaScript-программист vs фронтенд-разработчик
habr video Frontend Meetup 20/04
video Я.Субботник по разработке интерфейсов 2021


Веб-разработка


habr CORS для чайников: история возникновения, как устроен и оптимальные методы работы
habr Как создают и поддерживают веб-страницы tinkoff.ru
habr Трёхпроходный алгоритм рефакторинга Front End
en Что нового в DevTools (Chrome 91)
en Независимые компоненты: новые строительные блоки для веба
en Как я создал свой блог



CSS


habr Полное руководство по CSS Flex + опыт использования
CSS-нестинг больше, чем сахар
en Руководство по новым современным псевдо-селекторам CSS
en Создание (и потенциальные преимущества) CSS-шрифта
en Как добавить двойную границу к SVGShapes
en Начало работы с CSS Custom Properties
en TailwindCSS: добавляет сложности, ничего не делает.
en Работа на ошибками гибкой типографии, базирующихся на вьюпорте в Safari


JavaScript


habr Основы управления памятью в JavaScript: как это работает и какие проблемы могут возникнуть
Выпуск серверной JavaScript-платформы Node.js 16.0
en Чудесный мир Javascript бандлеров
en Улучшите управление состоянием в вашем фронтенде с помощью view models
en Шаблон для свойства отложенной загрузки в JavaScript
en Полное руководство по инкрементной статической регенерации (ISR) с Next.js
en Топ-5 самых популярных вопросов о JavaScript на Stack Overflow
en Руководство по MobX
en Понимание Array Reduce в JavaScript





Браузеры


В Firefox 88 молча удалён пункт контекстного меню Page Info
Apple, Microsoft, Opera и другие разработчики не горят желанием поддерживать технологию Google FLoC
Релиз Firefox 88
В Microsoft Edge тестируется новый режим производительности с иным принципом работы спящих вкладок


Дайджест за прошлую неделю.
Материал подготовили dersmoll и alekskorovin.
Подробнее..

Дайджест свежих материалов из мира фронтенда за последнюю неделю 465 (26 2 мая 2021)

02.05.2021 22:08:33 | Автор: admin
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.


Медиа|Веб-разработка|CSS|JavaScript


Медиа


podcast Подкаст proConf #94: GraphQL Galaxy
podcast Новости 512 от CSSSR: Chrome 91 Beta, postcss-easy-z, tree-shakeable библиотеки, гайды по кастомным CSS-свойствам и CLS
podcast Подкаст Callback Hell: Падение последнего оплота Dart, визуальные ЯП на примере Enso, Lucy DSL для стейт-машин
podcast Подкаст Фронтенд Юность#184: Матрица для мешка с картошкой


Веб-разработка


История фронтенда: JavaScript как отражение новой эпохи
habr HTMHell адовая разметка
habr HTML-теги и атрибуты, о которых вы, возможно, не знали
habr Адаптивный дизайн как антипаттерн
en Скромный элемент img и Core Web Vitals
en Как реализовать выбор дейстий для выделенного текста с помощью SelectionAPI




CSS


habr Примеры применения переменных CSS на практике
habr Контейнерные запросы в CSS
habr Как обеспечить глассморфизм с помощью HTML и CSS
VDS (value definition syntax)
en fit-content и fit-content()
en Полное руководство по Custom Properties
en Первый взгляд на CQFill, полифилл для CSS Container Queries
en Изучение color-contrast() в первый раз
en GPT-3 и CSS-фреймворки
en Понимание easing-функций для анимации и переходов в CSS
en Новые возможности WebKit в Safari 14.1 (Flexbox Gap, Date & Time Inputs, CSS Individual Transform Properties)

JavaScript


habr Целительная сила JavaScript
habr Человеко-читаемый JavaScript: история о двух экспертах
Принцип мозаики, или Как мы сделали JavaScript по-настоящему модульным
en Fower утилитарная CSS in JS библиотека для быстрой разработки интерфейсов.
en Клиентские шаблоны API, о которых должен знать каждый разработчик фронтенда








Дайджест за прошлую неделю.
Материал подготовили dersmoll и alekskorovin.
Подробнее..

Дайджест свежих материалов из мира фронтенда за последнюю неделю 466 (3 9 мая 2021)

10.05.2021 00:07:48 | Автор: admin
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.


Медиа|Веб-разработка|CSS|JavaScript


Медиа


podcast Подкаст 'Callback Hell': Убийцы вебпака, Microsoft + Bytecode Alliance, удалёнка
podcast Новости 512 от CSSSR: Bootstrap 5, V8 9.1, дженерики в TypeScript, RxJS в Angular, e2e-тесты с Cypress, баг в Safari 14.1
podcast Новости 512 от CSSSR: История фронтенда ч.2, Safari 14.1, CORS, Cookie Store API, Next.js 10.2, RxJS 7, Google I/O 2021
podcast Подкаст Веб-стандарты 280. Safari 14.1, гэпы во флексах, история JS, мозаичный JS, кому нужны алгоритмы
video Видеокаст Front-end. Вопросы на собеседовании #1
podcast video Подкаст Pro Conf #95: HollyJS Moscow 2020

Веб-разработка


habr Вышел Bootstrap 5: оцениваем 7 главных нововведений
habr Почему стоит использовать тег <picture> вместо <img>
habr Базовая структура HTML-документа с объяснением каждой строчки
habr HTML трюки
en Эволюция Jamstack
en Как мы используем веб-компоненты на GitHub
en Аудит дизайн-систем на предмет доступности
en Ускорение процесса разработки с помощью Bootstrap 5
en Как мы ускорили трассировку стека Chrome DevTools в 10 раз




CSS


en Состояние кроссбраузерной разработки CSS
en Container Queries: разъяснения и предложения
en Два варианта использования кастомных свойств
en Полное руководство по веб-шрифтам в шаблонах писем
en Является ли CSS языком программирования?
en CSS Hell Сборник распространенных ошибок в CSS и способы их исправления
en Текст размером 16 пикселей или больше предотвращает масштабирование формы в iOS
en Fluid typography Создавайте текст, масштабируемый в соответствии с размером окна, чтобы заголовки отлично смотрелись на любом экране.
en Вендорные префиксы мертвы?
en Компиляция CSS по запросу с помощью последней версии компилятора Tailwind


JavaScript


habr Как я написал браузерный 3D FPS шутер на Three.js, Vue и Blender
Кастомные типы данных в TypeScript: валидация на этапе компиляции
en Возможны ли 0kb JavaScript в вашем будущем?
en Vue Composition API против React Hooks основная разница
en Создайте трекер спутников с нуля 30-ю строками JavaScript кода







Дайджест за прошлую неделю.
Материал подготовили dersmoll и alekskorovin.
Подробнее..

Дайджест свежих материалов из мира фронтенда за последнюю неделю 467 (10 16 мая 2021)

17.05.2021 00:12:32 | Автор: admin
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.


Медиа|Веб-разработка|CSS|JavaScript|Браузеры


Медиа


podcast Подкаст Веб-стандарты 281. SpiderMonkey 25 лет, Safari TP, Bootstrap 5, Гитхаб, префиксы, монорепы и свой git в Яндексе
podcast Подкаст Фронтенд Юность #186. Утюжить веб. В гостях создатель и главный редактор Smashing Magazine Виталий Фридман.
video Видеокаст Front-end. Вопросы на собеседовании #2
video Нужен ли джуну идеальный код: интервью с Вадимом Макеевым
podcast video Подкаст Да как так-то?. Выпуск 4: из филолога-япониста во фронтенд на фрилансе

Веб-разработка


Солидные фронтенды: мониторинг
en Регистрация обработчика протокола URL для PWA
en Различия между WebSockets и Socket.IO
habr Переход к Meta GSAP: поиски идеальной бесконечной прокрутки




CSS


habr Выявление устройств с сенсорными экранами на чистом CSS
habr Венец эволюции CSS-in-JS уже здесь: полностью типизированные стили без рантайма в vanilla-extract
habr Сравнение производительности CSS и CSS-in-JS в реальном мире
habr Инструменты для аудита CSS
Родительский селектор :has() в реальность!


en Дизайн для чтения: советы по оптимизации контента для режимов чтения и приложений-читалок
en Продвинутая CSS-анимация с использованием cubic-bezier()
en aspect-ratio и grid
en Создание Stylesheet Feature Flags с помощью Sass!default
en Плавная прокрутка Sticky ScrollSpy Navigation с фиксированным фоном на CSS
en Взгляд на CSS Tailwind

JavaScript


habr Отслеживание и визуализация положения МКС с помощью 30 строк JavaScript-кода
habr Шпаргалка по JS-методам для работы с DOM
habr Паттерны отложенной инициализации свойств объектов в JavaScript
habr Я выпустил Grafar JS-библиотеку для визуализации
en 7 шагов для безопасного JavaScript в 2021 году
en Современный Javascript: все, что вы пропустили за последние 10 лет (ECMAScript 2020)
en Создайте тетрис с помощью современного JavaScript








Браузеры


en Использование обработчиков пользовательских протоколов для кросс-браузерного отслеживания в Tor, Safari, Chrome и Firefox
Идентификация через анализ внешних обработчиков протоколов в браузере

Дайджест за прошлую неделю.
Материал подготовили dersmoll и alekskorovin.
Подробнее..

Дайджест свежих материалов из мира фронтенда за последнюю неделю 468 (17 23 мая 2021)

24.05.2021 00:09:13 | Автор: admin
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.


Медиа|Веб-разработка|CSS|JavaScript|Браузеры


Медиа


podcast Подкаст Веб-стандарты #282: Rome, CloudFront Functions, кроссбраузерность, has() и другой современный CSS, мониторинг, GDE
podcast Подкаст Фронтенд Юность #187: Bootstrap круче чем все сраные фреймворки
podcast Подкаст Callback Hell: Производительность CSS-in-JS, языки логического программирования, ООП в современном фронтенде
podcast Новости 512 от CSSSR: Angular 12, Deno 1.10, мониторинг, тестирование UI, :has(), курс по git, Rome + $, TypeScript 4.3 RC
podcast Подкаст Callback Hell Поддержка нескольких мажорных версий, венчурный капитал в Open Source и возвращение тонкого клиента
podcast Подкаст proConf #96: DeveloperWeek 2020
podcast video Подкаст Цинковый Прод #113: Сайт сына маминой подруги

Веб-разработка


W3C представил черновой вариант стандарта WebGPU
en Google AMP мертв! AMP-страницы больше не пользуются приоритетом в поиске Google
en Incremental Static Regeneration: создавайте статические сайты понемногу
en Тестирование фронтенд-приложений что, где, как?





CSS


habr Трюки CSS, которые сделают из вас ниндзя верстки
habr Взгляд на Tailwind CSS
en Новая отзывчивость: веб-дизайн в мире компонентов
en Нет, утилитарные классы это не то же самое, что инлайн стили
en Как создать неоновый текст с помощью CSS
en Как стилизовать любое поле ввода советы и методы
en 82% разработчиков неправильно проходят этот трехстрочный тест по CSS
en Learn CSS Постоянно обновляемый курс CSS и справочник для повышения вашего уровня знаний в области стилизации веба
en aspect-ratio

JavaScript


habr Швейцарский нож отладки JavaScript
habr Трасси что? Доклад Яндекса
en DOM Events изучение системы событий DOM с помощью визуального исследования
en ES12 сделает вашу жизнь проще
en Справочник по массивам JavaScript методы работы с JS-массивами с примерами
en Двухмерные оптические демки в Javascript
en JavaScript API для распознавания людей и ботов в Chrome







Браузеры


habr Microsoft прекратит поддержку приложения Internet Explorer 11 в Windows 10 с июня 2022 года
habr Кросс-браузерный трекинг на основе перебора обработчика внешних протоколов
В Chrome экспериментируют с поддержкой RSS, чисткой User-Agent и автосменой паролей
Компания Mozilla представила режим строгой изоляции сайтов для Firefox
Выпуск перенастраиваемого web-браузера Nyxt 2.0.0

Дайджест за прошлую неделю.
Материал подготовили dersmoll и alekskorovin.
Подробнее..

Дайджест свежих материалов из мира фронтенда за последнюю неделю 469 (24 30 мая 2021)

31.05.2021 00:23:47 | Автор: admin
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.


Медиа|Веб-разработка|CSS|JavaScript|Браузеры


Медиа


podcast Подкаст Веб-стандарты 83. Sublime Text 4, Sass, Svelte после React, Container Queries, Learn CSS, Google I/O, новые GDE
podcast Подкаст proConf #97: JavaScript for WordPress 2020
podcast Подкаст Callback Hell: Sublime Text 4 и другие редакторы, проблемы написания читаемого кода, завершение эпохи IE
podcast Новости 512 от CSSSR: Chrome 91, TypeScript 4.3, Server-Sent Events API, logux и logux/state, postTask, Parcel 2 beta 3
podcast Новости 512 от CSSSR: Sublime Text 4, PostCSS 8.3, ненадежность TypeScript, Angular DevTools, WebContainers, Google I/O 21
podcast Пилотный выпуск подкаста Goose & Duck: Babel, деньги, два гуся

Веб-разработка


habr Самая серьёзная проблема HTML? Разработчики, разработчики, разработчики
habr Использование веб-компонентов при работе над GitHub
habr Наиболее полное руководство по практическому использованию Web Speech API
en Эволюция и новое определение Jamstack
en 10 вариантов клиентских хранилищ и когда их использовать
en Нарушаете ли вы патент, публикуя PWA?
en Создайте эффект плавного наведения с помощью GSAP и SVG



CSS


habr HTML и CSS ошибки, ухудшающие UX
en Тщательный анализ CSS-in-JS
en CSS Container Queries для дизайнеров
en 25 лет CSS
en CSS Container Queries: примеры использования и стратегии миграции
en Новый способ уменьшить влияние загрузки шрифтов: дескрипторы шрифтов в CSS

JavaScript


habr Карманная книга по TypeScript. Часть 1. Основы, Часть 2. Типы на каждый день
habr 3 способа визуального извлечения данных с помощью JavaScript
en Sparkplug неоптимизирующий компилятор JavaScript
en Новые стандарты доступа к оборудованию устройств с использованием JavaScript
en 7 инструментов, трансформирующих JavaScript-разработку
en Введение в Clio lang: несложная реализация производительного critical js






Браузеры


habr Mozilla примет Manifest v3 для дополнений Firefox, но без мер против блокировщиков рекламы
Релиз Chrome 91
en Призрак Google Reader находит свой путь в новой сборке Chrome Canary

Дайджест за прошлую неделю.
Материал подготовили dersmoll и alekskorovin.
Подробнее..

Дайджест свежих материалов из мира фронтенда за последнюю неделю 470 (1 6 июня 2021)

07.06.2021 00:10:32 | Автор: admin
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.


Медиа|Веб-разработка|CSS|JavaScript|Браузеры


Медиа


podcast video Подкаст Goose&Duck #1 Ржавеющий JavaScript
podcast CSSSR Callback Hell: Rescript, мысли пьяного Senior-разработчика, слежка за сотрудниками
podcast Новости 512 от CSSSR: Server-Sent Events: ограничения, поддержка Node.js-проектов, плагины для VSCode, 12 лет Node.js
podcast Подкаст Фронтенд Юность #189 Рон-дом-дом

Веб-разработка


habr С помощью перехода на микросервис мы ускорили бизнес-процесс в 60 раз
en Создание нескольких прогрессивных веб-приложений в одном домене
en Тестирование фронтенда для всех
en Разрушение мифов: Jamstack не может обрабатывать динамический контент
en История веба: часть 1
en Некоторые из лучших пасхальных яиц, спрятанных на сайтах в Интернете





CSS


habr 25 лет CSS
Нативная валидация ввода в CSS
en CSS in SVG in CSS: добавление конфетти в дизайн-систему Stack Overflow
en Новые функциональные селекторы псевдоклассов CSS: is() и: where()
en Тригонометрия в CSS и JavaScript: Введение в тригонометрию
en Тригонометрия в CSS и JavaScript: творческий подход с помощью тригонометрических функций
en The CSS Layout Generator визуальный инструмент для создания компонентов лейаута на CSS Grid
en Inherit, initial, unset, revert
en Шестиугольники и не только: гибкие, отзывчивые сеточные шаблоны, без медиа-запросов

JavaScript


habr Управление зависимостями в Node.js
habr Как мы потерпели неудачу, а затем преуспели в переходе на TypeScript
habr Создание нейронной сети Хопфилда на JavaScript
ES12 сделает вашу жизнь проще!
en Обеспечение быстрой работы JavaScript в WebAssembly
en Еще одна альтернатива Javascript: ReScript
en Взгляд на компиляцию в JavaScript-фреймворках






Браузеры


habr Firefox 89 обновил интерфейс браузера
Релиз Firefox 89 с переработанным интерфейсом
Mozilla, Google, Apple и Microsoft объединили усилия в стандартизации платформы для браузерных дополнений
en Что нового в DevTools (Chrome 92)

Дайджест за прошлую неделю.
Материал подготовили dersmoll и alekskorovin.
Подробнее..

Дайджест свежих материалов из мира фронтенда за последнюю неделю 472 (7 13 июня 2021)

14.06.2021 00:15:08 | Автор: admin
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.


Медиа|Веб-разработка|CSS|JavaScript|Браузеры


Медиа


podcast Новости 512 от CSSSR: Firefox 89, Safari 15 Beta, Jest 27, цикл статей о работе браузера, разработка базовых компонентов, обзорная статья о тестировании фронтенда и анонс WebExtensions Community Group.
podcast Подкаст Веб-стандарты #285: Бета Chrome92, Firefox89, якоря ирасширения, TeamCity, JSвнутри WASM, TypeScript4.3
podcast Подкаст Фронтенд Юность #190: Как подступиться к старому проекту и не сесть на кулак
podcast Новости 512 от CSSSR: React 18, Vue 3.1, анонс ESLint 8, курсы от CSSSR, :is(), where() и :has(), как прилёг Интернет
podcast Подкаст Callback Hell: Сервисы Google с плохими Web Vitals, шеринг логики между фронтом и бэком, документация на проектах


Веб-разработка


habr Будущее веба: станет ли рендеринг в <canvas> заменой DOM?
en Правильный тег для работы: почему следует использовать семантический HTML
en 5 проблем фронтенда, которые нельзя игнорировать





CSS


habr Выкладка нетрадиционной ориентации
en Полное руководство по CSS Grid с шпаргалкой
en Системные цвета CSS
en CSS определяет значения цвета, соответствующие системным настройкам.
en Media Queries во времена @container
en Давайте узнаем об Aspect Ratio в CSS
en CSS size-adjust для @font-face
en Равные столбцы с Flexbox: это сложнее, чем вы думаете
en Эксперимент с сортируемыми мультиколоночными таблицами
en Знакомьтесь с :has: нативный CSS селектор
en Рог изобилия ContainerQueries
en Создание правил для font-size CSS и создание Fluid Type Scale

JavaScript


habr Как я ускорил движок на 13%
habr Прогнозирование временных рядов на JS: анализ данных для самых маленьких фронтендеров
habr Sparkplug неоптимизирующий компилятор JavaScript в подробностях
en Как создать фулстек-приложение с помощью Supabase и Next.js
en Реализация приватных полей в JavaScript
en Forever Functional: Мемоизация промисов
en Как реализовать принципы SOLID в JavaScript
en Автоматизируйте форматирование и исправление JavaScript кода с помощью Prettier и ESLint
en Современный JavaScript
en Выходя за рамки ESLint: обзор статического анализа в JavaScript
en Доберенные типы API для безопасности JavaScript DOM
en Как создать NFT с помощью JavaScript
en Rust с точки зрения JavaScript





Браузеры


habr Vivaldi 4.0 Первое приближение
Google признал неудачным эксперимент с показом только домена в адресной строке Chrome
en Возможности WebKit в Safari, продемонстрированные на WWDC21


Дайджест за прошлую неделю.
Материал подготовили dersmoll и alekskorovin.
Подробнее..

Дайджест свежих материалов из мира фронтенда за последнюю неделю 473 (14 20 июня 2021)

21.06.2021 00:15:47 | Автор: admin
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.


Медиа|Веб-разработка|CSS|JavaScript


Медиа


podcast Подкаст Веб-стандарты 286: Высокопроизводительное хранилище для вашего приложения: Storage Foundation API
podcast Подкаст Callback Hell: Микрофронтенды и Module Federation, почему компании боятся открывать свой код, игровая выставка E3
podcast Новости 512 от CSSSR: Canvas-рендеринг, Lighthouse 8, пропорции в CSS, PHP 8.1 alpha, Next.js 11, Линус и антипрививочник
podcast video Подкаст Ленивый фронтендер #2 Kaiwa Show | Как сохранить любовь к веб-разработке
podcast Подкаст Фронтенд Юность #191: HR'ы немножко осатанели


Веб-разработка


habr <img>. Доклад Яндекса
habr Темизация. История, причины, реализация
habr DIV должен уйти: улучшаем HTML
en Изучение Eleventy с нуля. Бесплатный курс, состоящий из 31 урока
en Как я использовал WAAPI для создания библиотеки анимации
en Десять лет веб-компонентам



CSS


video :has в CSS псевдокласс из будущего на примере карточки новости
en Использование свойства `outline` в качестве схлопывающейся границы
en Идеальные всплывающие подсказки с обрезкой и маскированием CSS
en Оптический размер, скрытая сверхспособность вариативных шрифтов
en Краткое руководство по логическим свойствам CSS
en Застенчивая кнопка стоимостью 8 миллионов долларов
en Создание таблиц с липким верхним и нижним колонтитулами стало немного проще

JavaScript


habr Скрываем номера курьеров и клиентов с помощью key-value хранилища
habr Юмористичный обзор Rust с перспективы JavaScript
en Управление состоянием: двусторонние биндинги и расширенные средства форматирования биндингов
en Что такое букмарклеты? Как использовать JavaScript для создания букмарклета в Chromium и Firefox
en Тестирование использования памяти в JavaScript
en Двойные кавычки против одинарных кавычек против обратных кавычек в JavaScript
en sorting-algos-visualizer Визуализация популярных алгоритмов сортировки: QuickSort, MergeSort, HeapSort, BubbleSort, InsertionSort







Дайджест за прошлую неделю.
Материал подготовили dersmoll и alekskorovin.
Подробнее..

Перевод Каждый браузер видит цвета видео по-разному

01.06.2021 10:11:39 | Автор: admin

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

В преобразовании значения RGB-триплета в конкретную длину волны света задействовано множество систем. Это преобразование должно быть стандартизовано, чтобы всё ПО, все декодеры видео, видеокарты и мониторы (даже изготовленные разными производителями в разные десятилетия) могли создавать одинаковые результаты по одинаковым входным данным. Для решения этой задачи были разработаны цветовые стандарты. Однако со временем дисплеи и другие технологии развивались. Телевидение стало цифровым, начали применять сжатие, а мы отказались от ЭЛТ в пользу LCD и OLED. Новое оборудование было способно отображать больше цветов при большей яркости, но получаемые им сигналы по-прежнему были адаптированы под возможности старых дисплеев.

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

Это работающее решение, но оно усложняет процесс создания видео. На каждом этапе процесса захвата, записи, редактирования, кодирования, декодирования, композитинга и отображения необходимо учитывать используемое цветовое пространство. И если хотя бы на одном этапе процесса используется старое оборудование, или есть баг ПО, из-за которого не учитывается цветовое пространство, то в результате может получиться некорректное изображение. Видео всё равно можно будет смотреть, однако цвета могут оказаться слишком тёмными или бледными.

Сегодня двумя самыми популярными цветовыми пространствами являются BT.601 (также называемое smpte170m; в статье я буду использовать оба этих названия), которое стало стандартом для SD-контента, и BT.709, которое стало стандартом HD-контента. Существует также BT.2020, которое становится популярнее благодаря HDR- и UHD-контенту. Стоит заметить, что разделение на HD/SD здесь немного ошибочно. Технические ограничения отсутствуют, это просто традиционный подход. HD-контент можно кодировать в BT.601, а SD-контент в BT.709. Если взять видеофайл с разрешением 1080p и уменьшить его до 480p, то цветовое пространство не изменится автоматически. Смена цветового пространства это дополнительный этап, который выполняется как часть процесса.

Что же происходит, если процесс выполняется неправильно? Давайте проведём эксперимент.

Программа ffmpeg настоящее чудо современности. Это очень популярный инструмент для работы с цифровым видео, и вся отрасль многим обязана её разработчикам. В своём эксперименте я воспользуюсь этим инструментом для создания и изменения видеофайлов.

Для начала я создам с помощью ffmpeg простой тестовый файл:

ffmpeg -f rawvideo -s 320x240 -pix_fmt yuv420p -t 1 -i /dev/zero -an -vcodec libx264 -profile:v baseline -crf 18 -preset:v placebo -color_range pc -y 601.mp4

Краткое объяснение этой команды:

ffmpeg исполняемый файл

-f rawvideo сообщает программе ffmpeg, что я передаю ей сырые пиксельные данные, а не видеофайл.

-s 320x240 разрешение выходных данных. Можно использовать любое значение, потому что все входящие значения будут одинаковыми. Но благодаря маленькому размеру мы ускоряем процесс.

-pix_fmt yuv420p указываем формат пикселей входящих данных. Yuv420p это способ описания пикселей. Здесь важно отметить, что значение yuv(0,0,0) представляет собой оттенок зелёного. Я использую этот формат в противовес RGB, поскольку он является самым популярным форматом, используемым в цифровом видео.

-t 1 ограничиваем входящие данные 1 секундой

-i /dev/zero это файл входящих данных. /dev/zero это виртуальный файл, существующий на всех компьютерах mac. Это бесконечно длинный файл, состоящий из одних нулей.

-an обозначает, что выходные данные не должны содержать звука.

-vcodec libx264 используем для сжатия видео потрясающую библиотеку libx264.

-profile:v baseline используем базовый профиль h.264. Он отключает некоторые расширенные возможности h.264, но в этом тесте они нам не понадобятся.

-preset:v placebo сообщаем библиотеке libx264, что она может потратить дополнительные ресурсы процессора на кодирование видео с повышенным качеством. В реальной ситуации эту опцию выбирать не стоит, потому что кодирование занимает КУЧУ времени и обеспечивает минимальное улучшение качества. Нам она подходит, потому что у меня мало входящих данных.

-color_range pc один компьютерный байт может иметь значения от 0 до 255. При оцифровке аналогового видео используется интервал 16-235. Он был выбран из-за того, как телевизор интерпретирует очень тёмные и очень яркие сигналы. Так как мы используем цифровой источник, я выбрал значение pc, а не tv.

-crf 18 опция постоянного коэффициента потока (constant rate factor) сообщает libx264, что нужно создать высококачественный видеофайл и использовать любое количество бит, необходимое для обеспечения качества 18. Чем меньше число, тем выше качество. 18 это очень высокое качество.

-y даёт ffmpeg разрешение на перезапись файла, если он существует.

601.mp4 имя получившегося файла.

Эта команда создаёт файл 601.mp4 длительностью 1 секунду, который можно открывать и воспроизводить. После выполнения этой команды мы можем проверить, что ffmpeg не исказил значения пикселей, выполнив следующую команду и изучив выходные данные:

ffmpeg -i 601.mp4 -f rawvideo - | xxd

00000000: 0000 0000 0000 0000 0000 0000 0000 0000
00000010: 0000 0000 0000 0000 0000 0000 0000 0000
00000020: 0000 0000 0000 0000 0000 0000 0000 0000
00000030: 0000 0000 0000 0000 0000 0000 0000 0000
00000040: 0000 0000 0000 0000 0000 0000 0000 0000
00000050: 0000 0000 0000 0000 0000 0000 0000 0000
...
...

Эти данные в шестнадцатеричном виде показывают, что все значения пикселей после декодирования равны нулю.

При рендеринге видео в Safari мы получаем такой скриншот:


Возникает вопрос: что это за цветовое пространство? Я назвал файл 601.mp4, но нигде в команде я не указывал цветового пространства, так как же Safari узнал, какой оттенок зелёного нужно рендерить? Откуда браузер знает, что yuv(0,0,0) должно быть равно rgb(0,135,0)? Очевидно, что существует алгоритм для вычисления этих значений. На самом деле, это простое матричное умножение. (Примечание: в некоторых форматах пикселей, в том числе и в yuv420p, для преобразования требуется этап пре- и постпроцессинга, но в этой демонстрации мы опустим такие тонкости). Для каждого цветового пространства имеется собственная матрица. Так как мы не задавали матрицу цветового пространства при кодировании видео, Safari просто делает предположение. Мы можем перебрать все матрицы, умножить все значения RGB на обратные матрицы и посмотреть, чему же они соответствуют, но давайте попробуем использовать более визуальный подход и посмотреть, удастся ли нам разобраться, что делает Safari.

Для этого я вставлю в файл метаданные, чтобы Safari знал, какое цветовое пространство используется, и не был вынужден угадывать.

ffmpeg -f rawvideo -s 320x240 -pix_fmt yuv420p -t 1 -i /dev/zero -an -vcodec libx264 -profile:v baseline -crf 18 -preset:v placebo -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range pc -y 601vui.mp4

Команда ffmpeg осталась практически такой же, но я добавил следующее:

-color_trc smpte170m

-colorspace smpte170m

-color_primaries smpte170m


Это метаданные цветового пространства, в который будет кодироваться файл. Я не буду объяснять различия между этими опциями, потому что для этого понадобится ещё одна статья. Пока мы просто задаём всем им нужное нам цветовое пространство. smpte170m это то же самое, что и BT.601.

Указание цветового пространства не влияет на способ кодирования файла, значения пикселей по-прежнему кодируются как yuv(0,0,0). Чтобы убедиться в этом, мы можем выполнить для нового файла команду ffmpeg -i zero.mp4 -f rawvideo - | xxd. Флаги цветового пространства не игнорируются, однако просто записываются в несколько битов внутри раздела video usability information (VUI) в заголовке видеопотока. Теперь декодер будет искать VUI и использовать его для загрузки нужной матрицы.

А вот результат:


И с VUI, и без него видео рендерятся с одинаковым цветом. Давайте попробуем файл BT.709:

ffmpeg -i 601vui.mp4 -an -vcodec libx264 -profile:v baseline -crf 18 -preset:v placebo -vf "colorspace=range=pc:all=bt709" -y 709.mp4

Новые опции:

-i 601vui.mp4 используем в качестве источника видео прежний файл 601vui.mp4

-vf "colorspace=all=BT.709" сообщаем ffmpeg, что нужно использовать видеофильтр цветового пространства для изменения значений пикселей. Это похоже на умножение матрицы для преобразования из yuv в rgb, но матрица имеет другие коэффициенты. all это сокращение для одновременного задания color_primaries, colorspace и color_trc.

Здесь мы берём видео 601vui.mp4 и используем фильтр цветового пространства для преобразования в BT.709. Фильтр цветового пространства может считать из vui файла 601vui.mp4 цветовое пространство входящих данных, поэтому нам достаточно только указать цветовое пространство, которое мы хотим получить на выходе.

Выполнив для этого файла команду ffmpeg -i 709.mp4 -f rawvideo - | xxd, мы получаем после преобразования цветового пространства значения пикселей yuv(93,67,68). Однако при рендеринге файла он должен выглядеть так же. Стоит заметить, что окончательные результаты могут и не быть идентичными, потому что мы продолжаем использовать 24 бита для кодирования каждого пикселя, а BT.709 имеет чуть больший диапазон цветов. Следовательно, некоторые цвета в BT.709 не сопоставляются точно с BT.601, и наоборот.

Посмотрев на результат, можно чётко заметить, что что-то не так. Новый файл рендерится со значениями rgb, равными 0,157,0 гораздо ярче, чем входящий файл.

image

Давайте внимательно изучим свойства файла при помощи приложения ffprobe:

ffprobe 601vui.mp4:
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuvj420p(pc, smpte170m), 320x240, 9 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)

И

ffprobe 709.mp4:
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuvj420p(pc), 320x240, 5 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)

Основная часть информации здесь для нас неважна, но мы заметим, что 601vui.mp4 имеет формат пикселей yuvj420p(pc, smpte170m). Так мы понимаем, что файл имеет правильный VUI. Но 709.mp4 содержит только yuvj420p(pc). Похоже, метаданные цветового пространства не были включены в выходной файл. Даже несмотря на то, что фильтр цветового пространства смог прочитать исходное цветовое пространство, и мы явным образом указали новое пространство, программа ffmpeg не записала правильный vui в конечный файл.

Это плохо Ffmpeg самый популярный инструмент для преобразования видео. И он упускает информацию о цвете. Вероятно, по этой причине многие видео не содержат метаданные цветового пространства, и поэтому многие видео рендерятся с рассогласованными цветами. В защиту ffmpeg можно сказать, что это сложная проблема. Чтобы инициализировать энкодер, нужно заранее знать цветовое пространство. Кроме того, цветовое пространство может быть изменено видеофильтром. Это сложная для решения в коде проблема, но всё равно печально, что такое поведение является стандартным.

Обойти её можно, добавив метаданные цветового пространства вручную:

ffmpeg -i 601vui.mp4 -an -vcodec libx264 -profile:v baseline -crf 18 -preset:v placebo -vf "colorspace=range=pc:all=bt709" -colorspace bt709 -color_primaries bt709 -color_trc bt709 -color_range pc -y 709vui.mp4

В результате значение цвета в 709vui.mp4 будет равно rgb(0,132,0). Яркость зелёного канала чуть меньше, чем в 601vui.mp4, но поскольку преобразование цветового пространства происходит с потерями, а результат меня устраивает, то назовём это успехом.

Из этого мы можем прийти к заключению, что когда в файле не указано цветовое пространство, Safari считает, что это BT.601. И со стороны Safari это очень хорошее допущение. Но как сказано выше, BT.601 это стандарт SD-видео, а BT.709 стандарт для HD. Давайте проверим HD-видео с VUI и без него, и посмотрим, как их рендерит Safari. Я использовал те же команды ffmpeg, только изменил разрешение на 1920x1080.

image

И в SD, и в HD цвет рендерится одинаково. Делая предположение о цветовом пространстве, Safari не учитывает разрешение. Apple уже давно работает в пространстве медиа и издательского дела, поэтому я ожидал, что продукт этой компании обеспечит достойные результаты. Но если даже в Safari всё устроено настолько хитро, то интересно, как обстоит ситуация в других браузерах.

Chrome:


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

По опыту я знаю, что когда в настройках отключено аппаратное ускорение, Chrome выполняет рендеринг иначе:


Изучив этот результат, мы увидим, что значения в 601 рендерятся очень похожими на предыдущие, но файлы 709 рендерятся так, как будто в них нет VUI. Из этого мы можем заключить, что Chrome при отключенном аппаратном ускорении просто игнорирует VUI и рендерит все файлы, как будто они имеют формат 601. Это означает, что все файлы 709 будут воспроизводиться некорректно.

И наконец, давайте изучим Firefox:


Здесь нужно разобрать многое. Так как 709.mp4 и 709vui.mp4 выглядят одинаково, можно прийти к заключению, что при отсутствии VUI браузер Firefox предполагает формат BT.709. Правильный рендеринг 601vui.mp4 означает, что для контента BT.601 раздел VUI учитывается. Однако когда файл BT.601 без VUI рендерится как 709, то становится очень тёмным. Очевидно, что невозможно отрендерить картинку правильно без всей необходимой информации, однако выбранный Firefox способ искажает цвет сильнее, чем выбранные браузерами Safari и Chrome.

Как мы видим, ситуация с рендерингом цветов видео по-прежнему представляет собой Дикий Запад. К сожалению, мы рассмотрели только часть проблемы. Мы ещё не изучали Windows. Давайте сделаем это.

Microsoft Edge:


Похоже, что Edge (по крайней мере, на моём компьютере) просто игнорирует VUI и рендерит всё как 601.

Chrome (со включенным аппаратным ускорением):


Ситуация не очень отличается от Mac. При наличии VUI он обрабатывается правильно, но если его нет, для SD-контента предполагается формат BT.601, а для HD-контента BT.709. Это единственный браузер, в котором я такое видел, но в этом есть определённая логика. Так как рендеринг выполняется иначе, чем на Mac, то подозреваю, что дело в ОС или, что более вероятно, в чём-то на уровне драйверов видеокарты, и этот выбор сделан не командой разработчиков Chrome.

Firefox ведёт себя так же, как и на Mac.


Что касается Linux, iOS, Android, Roku, Fire TV, смарт-телевизоров, игровых консолей и т.д., то я оставлю это в качестве упражнения для читателя.

Чему же мы научились? Самое главное: всегда указывайте в своих видео метаданные цветового пространства. Если вы пользуетесь ffmpeg и не задаёте флаги цвета, то вы работаете неправильно. Во-вторых, хотя ffmpeg и является потрясающей программой, её популярность, простота использования и неудачно выбранные стандартные параметры сослужили плохую службу. Никогда не стоит допускать, что ПО достаточно умно, чтобы разобраться в этом самостоятельно. Руководителям проектов Ffmpeg, Google, Mozilla, Microsoft (и, вероятно, Nvidia и AMD) нужно собраться и вместе выбрать единый способ. Я понимаю, что здесь нет хорошего решения, но плохое и предсказуемое лучше, чем плохое и случайное. Лично я рекомендую всегда предполагать формат BT.601, если раздел VUI отсутствует. Это создаёт наименьшую степень искажений. Можно выбрать для согласования этого стандарта FOMS, или даже AOM, поскольку эти организации имеют довольно неплохое представительство.

И напоследок: если у вас есть видео без информации о цвете и вам нужно его преобразовать или отрендерить, то удачи!



На правах рекламы


VDSina предлагает недорогие серверы с посуточной оплатой. Интернет-канал для каждого сервера 500 Мегабит, защита от DDoS-атак включена в тариф, возможность установить Windows, Linux или вообще ОС со своего образа, а ещё очень удобная панель управления серверами собственной разработки. Давно пора попробовать ;)

Присоединяйтесь к нашему чату в Telegram.

Подробнее..

Перевод Наблюдение за сотовыми вышками

17.05.2021 14:19:21 | Автор: admin
Одна из моих любимых книг Высокопроизводительная Браузерная Сеть Ильи Григорика. Помимо множества полезных советов, в книге есть множество увлекательных историй из реальной жизни.

image46% потребления батареи для передачи 0,2% информации от общего числа байтов.

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

Однако после передачи музыки, приложение будет проводить периодический анализ аудитории, отправляя прерывистые аналитические запросы каждые 60 секунд. Чистый эффект? На запросы аналитики приходилось 0,2% от общего числа переданных байтов и 46% от общего энергопотребления приложения!

Илья Григорик, High Performance Browser Networking

Илья не торопится, чтобы подробно изложить свою точку зрения. Чтобы просветить читателей на тему времени автономной работы мобильного телефона, он посвящает целую главу подробному описанию радиомодемов GSM, UMTS и LTE. Удивительно осознавать, что проблемы на одном уровне могут найти свои корни несколькими уровнями ниже.

image

Поездка от Саннивейла до центра Маунтин-Вью.

Изучая весь стек, High Performance Browser Networking делает больше, чем просто предоставляет факты. Он защищает философию.

Хорошие разработчики знают, как все работает.
Великие разработчики знают, почему все работает.

Стив Содерс, High Performance Browser Networking, Предисловие


Старая идея снова новая


Когда я читал это в 2013 году, я подумал, что было бы круто провести собственное исследование и визуализировать, как радио перескакивает из одной ячейки в другую, пока телефон путешествует.

Эта идея не могла быть реализована с моим телефоном на iOS 2013 года, поскольку он не предоставлял необходимые мне данные, но у моего текущего Pixel нет этой проблемы. LocationManager может предоставлять местоположение GPS (широта, долгота) каждую секунду. Между тем, TelephonyManager выдает cellID = (mmc, mcc, lac, cid), на котором сейчас находится радио.

База данных CellID [1] позволяет узнать (широту, долготу) каждого CellID. Осталось нарисовать маршрут (красным) и для каждой секунды соединение с ячейкой с цветовой кодировкой.

Приведенный выше результат показывает 7-минутную поездку, длинной 3,7 км, с телефоном с поддержкой LTE (также известное как UE для пользовательского оборудования). По пути были обнаружены пять вышек и девять ячеек (также известные как eNB для Evolved NodeB).

Анализ


imageОбъединение карты, Google StreetView и Википедии позволило разобраться во многом.

  • Несколько идентификаторов соты сопоставляются с одними и теми же координатами широты и долготы eNB. Это потому, что антенны, установленные на eNB, не имеют покрытия на 360. Угол и диапазон каждой антенны делят пространство на ячейки в форме кусочков пиццы.
  • Антенны расположены и ориентированы стратегически. На карте справа башни размещены вдоль шоссе 85, а антенны направлены параллельно ему. Некоторые антенны имеют исключительно узкую и большую дальность действия. Возможно, чтобы приспособиться к высокой плотности во время пробок.
  • eNB имеют гораздо более высокую плотность, чем я думал. Погуглив о дальности действия вышки сотового телефона, получил цифру в 45 миль. Это может быть верно для сельской местности, но в городе плотность населения и плотность eNB взаимосвязаны. Это означает, что каждую милю в Саннивейле были вышки.
  • Сайты не обязательно используются операторами совместно. Точность базы данных CellID (CellMapper) настолько высока, что я смог зайти в Google StreetView и увидеть настоящие вышки. Я ожидал увидеть огромные монолиты с большими антенными решетками для каждого оператора, но в большинстве случаев это выглядело так, как будто там была всего одна антенна.
  • Антенны eNB можно найти на многих вещах, помимо мачт[2]. Некоторые из этих мест это церкви[3], электрические опоры[4] и даже коммерческие здания.
  • Как только вы привыкнете их искать, эти некогда невидимые вышки сотовой связи станет невозможно игнорировать.
  • LTE-радио UE способно прыгать с ячеек туда и обратно. Несколько раз в течение минуты, по-видимому, является обычным явлением в городе, чтобы смягчить препятствие строительству.
  • Сопряжение башен (он же кемпинг) выглядит детерминированным. На двух предыдущих картах использование башни в общей части поездки выглядит одинаково. Выбор происходит в соответствии с конечным автоматом, настроенным каждой ячейкой через широковещательные сообщения SIB. Переход состояния происходит на основе множества факторов, таких как порог мощности сигнала предыдущей соты или порог мощности сигнала следующей соты.
  • Во время долгого (10 миль) вождения я увидел, что LAC (код зоны местоположения) часть идентификатора CellID осталась прежней. Согласно спецификациям LTE, вышки сотовой связи не должны выполнять передачу обслуживания UE, когда телефон остается в LAC. Телефон начинает располагаться на следующей башне, оставаясь в режиме RCC_IDLE без передачи данных. Это не только экономит батарею, это также означает, что операторы действительно не знают, где находится телефон, пока он остается в том же LAC (хотя точность геолокации на основе сотовой связи оспаривается еще со времен GSM [5]).
  • Кажется, что каждая башня использует три антенны 120. Это довольно очевидно, когда кружишь вокруг одной.


image

Обход башни показывает радиус 120 каждой ячейки.

Глубже в кроличью нору


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

image

Эзотерический мир


Начиная с 1998 года с 2G (GSM), все технологические стеки были стандартизированы и задокументированы 3GPP. Эти спецификации охватывают более сотни документов. Их понимание кажется достижением всей жизни.

Нет стека LTE с открытым исходным кодом, на котором можно было бы поучиться[6], и даже если бы он был, излучение в диапазонах сотовых телефонов строго регулируется, чтобы гарантировать, что частоты не будут загрязнены глючными модемами.

Немногочисленные книги из этой области очень дорогие. Мое подлинное окно интереса подпитывалось этими тремя.

  • Введение в LTE от Кристофера Кокса.
  • LTE Advanced Сасана Ахмади.
  • Долгосрочная эволюция в пулях, 2-е издание Криса Джонсона.


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

Источники


  1. Wikipedia list of CellID databases
  2. Cell tower on a mast
  3. Cell tower on a church
  4. Cell tower on an electric pylon
  5. Cell tower junk science
  6. Osmocom и srsRAN.
Подробнее..

Как синхронизировать сценарий без транзакций? Штатными средствами Java

15.06.2021 02:14:19 | Автор: admin

Давайте представим, что вы параноик, и параноик вдвойне, когда дело касается многопоточности. Предположим, что вы делаете backend некого функционала приложения, а приложение переодически дергает на вашем серверы какие-то методы. Все вроде хорошо, но есть одно но. Что если ваш функционал напрямую зависит от каких-либо других данных, того же банального профиля например? Встает вопрос, как гарантировать то, что сценарий отработает именно так, как вы планировали и не будет каких-либо сюрпризов? Транзакции? Да это можно использовать, но что если Вы фантастический параноик и уже представляете как к вам на сервер летит 10 запросов к одному методу от разных клиентов и все строго в одно время. А в этот момент бизнес-логика данного метода завязана на 100500 разных данных. Как всем этим управлять? Можно просто синхронизировать метод и все. Но что если летят еще и те запросы, держать которые нет смысла? Тут уже начинаются костыли. Я пару раз уже задавался подобным вопросом, и были интересно, ведь задача до абсурда простая и повседневная (если вы заботитесь о том, чтобы не было логических багов конечно же :). Сегодня решил подумать, как это можно очень просто и без костылей реализовать. И решение вышло буквально на 100 строк кода.

Немного наглядного примера

Давайте предположим, что есть водитель и есть пассажир. Водитель не может менять машину до тех пор, пока клиент, например подтверждает поездку. Это что получается, клиент соглашался на поездку с одними характеристиками машины, а по факту у водителя другая машина? Не дела! Можно организовать что-то подобное:

String result = l.lock(new ArrayList<Locker.Item>() {{    add(new Locker.Item(SimpleType.TRIP, 1));    add(new Locker.Item(SimpleType.USER, 2));}}, () -> {    // Тут выполняем отмену поездки и держим водителя на привязи    // Кстати если кто-то где-то вызовет USER=2 (водитель), то он также будет ждать    // ну или кто-то обратится к поездке TRIP=1    // А если обратится к USER=3, то уже все будет нормально :)    // так как никто не блокировал третьего пользователя :)    return "Тут любой результат :)";    });

Элегантно и просто! :)

Исходники тут - https://github.com/GRIDMI/GRIDMI.Sync

Камнями не бросаться! :)

Подробнее..

Открытые клиенты Hola VPN и Opera VPN

01.05.2021 04:09:42 | Автор: admin

Предлагаю вашему вниманию два простых решения для случаев, когда нужен прокси:

  • Недоступность сетевого ресурса по разным причинам.

  • Гео-ограничения.

  • Потребность спрятать трафик от интернет-провайдера и/или исключить возможность его вмешательства в трафик.

hola-proxy

https://github.com/Snawoot/hola-proxy/

hola-proxy - это клиент для прокси-серверов Hola, который использует то же API для получения доступа к ним, что и браузерное расширение Hola VPN. Соединение с прокси-серверами защищено TLS. Приложению не требуется ни установка, ни права администратора для работы. Имеется в наличии кое-какая устойчивость к попыткам блокировок самих VPN-сервисов. В частности, в отличии от оригинального расширения, приложение успешно работает в Египте.

Отличия приложения от браузерного расширения Hola VPN:

  • Нет проблем с безопасностью, которые могут иметь место с родными клиентами Hola. А именно, IP-адрес пользователя точно не будет эксплуатироваться для обслуживания других пользователей.

  • Убраны почти все ограничения бесплатного доступа.

  • Локально запускается прокси, который можно использовать и с другими приложениями, а не только с браузером.

  • Есть возможность использования резидентных IP-адресов в US для того чтобы, например, смотреть американский Netflix, Hulu и другие видео-сервисы с гео-ограничениями, требующими IP-адрес, относящийся к провайдерам потребительского доступа к интернету.

  • Улучшенная устойчивость к блокировкам по сравнению с расширением (у нативного клиента чуть больше возможностей).

  • Открытый исходный код.

  • Запускается на большом ассортименте ОС и аппаратных платформ.

  • Есть возможность каскадирования соединения с другим прокси-сервером для доступа к выходному узлу. Это полезно для случаев, когда подключение к интернету требует обязательного использования прокси-сервера (например, так выглядят некоторые корпоративные файрволы).

Порядок использования:

  1. Скачать отсюда, выбрав исполняемый файл для своей платформы.

  2. Запустить. Станет доступен обычный HTTP-прокси на локальном порте 8080.

  3. Настроить браузер и/или другое ПО на использование HTTP прокси-сервера по адресу 127.0.0.1:8080. Для браузера ради удобства крайне рекомендую использовать расширение SwitchyOmega (Chrome, Firefox).

Примечания:

Если требуются особые настройки (страна, тип прокси), то можно создать ярлык, указав дополнительные параметры командной строки через пробел после имени файла. Справка по параметрам: https://github.com/Snawoot/hola-proxy/#list-of-arguments

Запускать приложение в фоне в Windows можно с помощью "планировщика заданий", назначив старт приложению после запуска системы, либо просто добавив в автозагрузку, если окно терминала в фоне не мешает.

opera-proxy

https://github.com/Snawoot/opera-proxy/

Это совсем недавняя разработка, которая, в сущности, реализует то, что в браузере Opera называется Opera VPN, но при этом позволяет использовать его с другими браузерами и приложениями (а так же использовать его для каких-то сайтов селективно, посредством настройки браузерного расширения управления прокси в вашем браузере).

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

Порядок использования:

  1. Скачать отсюда, выбрав исполняемый файл для своей платформы.

  2. Запустить. Станет доступен обычный HTTP-прокси на локальном порте 18080.

  3. Настроить браузер и/или другое ПО на использование HTTP-прокси-сервера по адресу 127.0.0.1:18080. Для браузера ради удобства крайне рекомендую использовать расширение SwitchyOmega (Chrome, Firefox).

Примечания:

Обратите внимание, что opera-proxy по умолчанию использует порт 18080, в то время как hola-proxy - 8080.

Справка по параметрам командной строки для выбора региона и других настроек: https://github.com/Snawoot/opera-proxy/#list-of-arguments

Пара слов об Android

Оба приложения работают на Android, не требуя рута. Запустить их можно с помощью любого удобного шелла (приложения-терминала). Я бы порекомендовал Qute, так как оно поддерживает автозапуск и создание ярлыков для скриптов. Для запуска нужно положить бинарь куда-то, где его можно было бы сделать исполняемым. В случае с Qute это /data/data/files/com.ddm.qute

После этого сделать бинарный файл прокси-клиента исполняемым: chmod +x /data/data/files/com.ddm.qute/*-proxy* и запустить его командой или скриптом: /data/data/files/com.ddm.qute/*-proxy*

Перенаправить весь трафик через прокси удобнее всего будет с помощью AdGuard для Android. В его настройках можно установить адрес прокси, куда нужно перенаправить трафик. Важно не забыть добавить в исключения AdGuard само приложение-шелл (в моём примере Qute). В противном случае исходящие соединения прокси будут зацикливаться в сам прокси.

Заслуживают упоминания

  • transocks - демон, который позволяет перенаправлять произвольные TCP-соединения на роутере в SOCKS- или HTTP-прокси.

  • moproxy - аналог предыдущего пункта.

  • Мой прошлый пост о некоторых преимуществах прокси по сравнению с VPN.

Пожалуй, это всё. А наверху на картинке, кстати, муравьед. Вроде бы.

Подробнее..

Перевод Как работает приватная сеть доставки контента Brave

28.05.2021 12:18:53 | Автор: admin

В Brave приватность не фича, а требование, вокруг которого построен проект. Наш браузер это демонстрирует в полной мере: мы блокируем трекеры, не даем отслеживать цифровые отпечатки и предлагаем пользователям наш собственный, privacy-first рекламный сервиc.

В сегодняшнем выпуске рассмотрим метод сокрытия IP-адресов пользователей от нас и партнёрской CDN, а также прочие вопросы приватности браузерной рекомендательной ленты Brave Today.

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

Как не раскрыть IP-адреса пользователей браузера? В общем случае, мы отфильтровываем их из запросов к нашим бэкендам на уровне сети доставки контента (также известной как CDN), чтобы адрес даже случайно не мог попасть в логи. Но для одного из наших новых сервисов мы хотим шагнуть дальше - убедиться, что никакое изменение конфигурации CDN не могло бы засветить IP-адреса клиентов, даже если бы нам этого захотелось.

Опишем по пунктам, что и зачем мы делаем.

Начало

Новые фичи браузера требуют, чтобы IP-адреса клиентов охранялись лучше, чем мы это делали раньше. Одна из таких фич наша новостная рекомендательная лента Brave Today на браузерном новом табе.

Просто доставлять новости можно и через обычную сеть доставки контента: сами новости для всех пользователей одинаковые, а конкретная выборка и машинное обучение происходит локально в самом браузере. Нюансы есть в иллюстрациях к новостям. Если cкачивать картинки в процессе просмотра ленты, любой, кто может наблюдать эти сетевые запросы (например, CDN), может узнать, какие статьи демонстрировались в ленте. Из этих фактов можно извлечь информацию о том, какую модель использует машинное обучение на клиенте, и косвенно о том, какие страницы ранее посещались для тренировки этой модели.

Конструкция

Традиционно, контент сервисов, чувствительных к задержкам, доставляется и кэшируется при помощи CDN. Очевидно, что оператор CDN видит и содержимое пользовательских запросов, и его IP-адрес. В нашем случае (см. Приватность) эти потоки данных следует разделить. Мы решили добавить балансировщик нагрузки перед CDN. В результате получилось следующее:

В такой модели, вендор балансировщика не видит содержимого запросов или ответов. Все, что ему доступно зашифрованный трафик на 443 порту, расшифровать который может только сеть доставки контента. При этом вендору CDN доступно все, что внутри запросов и ответов, но вместо IP-адреса пользователя они получают один из адресов балансировщика нагрузки. А чтобы никакие посторонние IP-адреса не подключились сбоку к CDN, она устанавливает соединения только с IP-адресами балансировщика. Подобно этому, контейнер S3, из которого сеть берет данные, отдаёт данные только по ключу, который есть у CDN.

Важно также использовать разных вендоров балансировщика и для CDN, что мы и делаем. Это нужно, чтобы минимизировать теоретический риск их сговора для деанонимизации клиентов.

We need to go deeper

Очевидно, что балансировщик нагрузки TCP не может расшифровать идущий через него трафик. Но он может отслеживать размеры HTTP запросов и ответов, что является вектором атаки на эти данные. У нас нет причин подозревать, что наши партнёры-вендоры будут пытаться следить за пользователями, но подобные верования неуместны, когда существуют технические решения: мы добавляем паддинг к запросам, чтобы сделать их размеры максимально похожими.

Например, сервис запрашивает изображения:

/article/12/image/3927.png

/article/8/image/148.jpg

Эти запросы можно изменить так:

/article/0012/image/03927.png

/article/0008/image/00148.jpg

Что касается HTTP-ответов, приводить все файлы к единому объему может быть затратно, но можно задать несколько типоразмеров и подбирать нужный. Этим должно заниматься каждое приложение, использующее CDN для своих конкретных запросов. Ясно дело, что для правильной работы этого алгоритма нужно отключить сжатие на стороне CDN.

Даже при том, что IP-адрес пользователя не попадает в CDN ни в каком виде, некоторые HTTP-заголовки могут использоваться для фингерпринтинга в зависимости от степени уникальности их значений. Поэтому каждое приложение, которое использует нашу приватную сеть доставки контента, должно вычищать такие заголовки из запросов. Это:

  • Accept-Language

  • Cookie

  • DNT

  • Referer

  • User-Agent

А что там в браузере?

Всё, о чем говорилось до сего момента, больше относится к вендорам нашей инфраструктуры. Однако что насчет собственно компании Brave, ведь у нас-то есть доступ к дашбордам партнёров?

Для того, чтобы идентифицировать пользователя по набору запросов, нам потребовалось бы:

  • Иметь доступ к логам обеих систем,

  • Добавлять к запросам дополнительную информацию, когда они направляются от балансировщика нагрузки TCP.

С логами все просто по договору с вендором балансировщика у нашей учётки отключен доступ к механизмам логгирования. Добавлять информацию в заголовки мы тоже не можем, поскольку балансировщик нагрузки не может расшифровать TLS-поток. Теоретически, мы могли бы настроить его так, чтобы прокси-протокол дописывал IP-адрес клиента во все исходящие запросы, но, по счастью, наш CDN-провайдер этого в принципе не умеет делать. На случай, если такая возможность появится в будущем, в нашем контракте есть специальный пункт, который оговаривает это ограничение.

Доверяй, но проверяй

Важность тщательного проектирования такой системы неоспорима, но слова и схемы ничего не значат без возможности проверить наши утверждения. Чтобы оправдать доверие наших пользователей мы стараемся максимально прозрачно показывать нашу работу.

Во-первых, каждый может посмотреть как данные обрабатываются на стороне клиента, так как Brave браузер с открытым кодом. Во-вторых, легко проверить, к какому именно IP-адресу обращается браузер, проанализировав трафик, например, с помощью mitmproxy или просто посмотрев, во что резолвится хост pcdn.brave.com. Наконец, для проверки переадресации запросов от первого вендора и точки, где расшифровывается TLS, можно сравнить заголовки ответов от https://pcdn.brave.com/ и сайтов, которые обслуживаются непосредственно первым вендором например, https://haveibeenpwned.com/.

В маловероятном случае обнаружения любых багов или нарушений модели приватности немедленно сообщайте в нашу программу поиска багов

Подробнее..

Vivaldi 4.0 Первое приближение

09.06.2021 10:16:43 | Автор: admin
image

Привет, Хабр!

Наверное, каждый из нас бывал в ситуации, когда, например, увидев издалека некий крупный интересный объект или сооружение, мы отправлялись его рассмотреть и только приблизившись вдруг понимали, насколько это творение человеческих рук монументально и как грандиозны его масштабы. Вот примерно такое же ощущение вызывает и сегодняшний релиз браузера Vivaldi 4.0. Ну, то, что одновременно подготовлены и десктопная, и мобильная версии это уже почти традиция. Дело не в этом.

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

Мир без барьеров


Вот так интересно мы живём: в то время, как во всём мире возводятся границы, мы эти границы убираем. По крайней мере языковые. В новой версии браузеров Vivaldi появился встроенный переводчик. И браузеров это не опечатка. Переводчик есть и в десктопной, и в мобильной версии Vivaldi. Если вы входите на страницу, язык которой отличается от установленного в браузере по умолчанию, то в адресной строке появится соответствующая иконка а под ней небольшое всплывающее окно с предложением перевести страницу:


Если подобная автоматизация вам не очень подходит, вы можете воспользоваться кнопкой настроек функции и не откладывая в долгий ящик сделать соответствующие распоряжения:


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


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


А теперь немного о самом переводчике, как о компоненте.

Движок переводчика разработан компанией Lingvanex, которая стала нашим партнёром. Принцип работы переводчика вполне стандартный: текст из браузера отправляется на сервер, где осуществляется перевод и результаты возвращаются в браузер. И вот здесь нужно обратить внимание на важный момент: движок переводчика работает на наших собственных серверах, установленных в Исландии. Другими словами, вы можете пользоваться данным переводчиком не опасаясь, что посещаемые вами веб-сайты и, как следствие, ваши интересы станут известны неким крупным сервисам, которые смогут использовать полученные данные по назначению. Короче продать рекламщикам. Мы, как вы знаете, данными пользователей не торгуем и принципиально не интересуемся, что вы посещаете, переводите, пишете или думаете.

Так что мы продолжаем повышать вашу приватность при работе в сети, с каждой новой функцией. Собственно, не в последнюю очередь именно желание защитить частную жизнь пользователей и стало одной из причин разработки следующих наших новинок.

Почта, которая всегда под рукой


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

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


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


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


Вы выбираете новости, а не наоборот


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


Визуально новостные компоненты отделены от почты, но и по интерфейсу, и по настройкам они сходны с почтовиком:


И, конечно, вы будете видеть свои подписки и в интерфейсе почтового клиента. Кстати, подписываться можно не только на новости, но и на подкасты, и даже на видеоканалы YouTube. Причём, прослушивать подкасты вы сможете непосредственно в браузере при этом будет задействован собственный медиа-компонент браузера. То же самое касается и видеороликов с YouTube, причём новостной клиент будет загружать видео по специальной ссылке, не тянущей за собой различные Cookies.

В общем и целом, новостной клиент позволяет контролировать поток получаемой вами информации вы подписываетесь только на те новости, которые вам действительно интересны и важны, а весь мусорный контент идёт лесом. И да, клиент новостей тоже пока в бета-режиме. Как и следующая важная функция

Календарь для тех, кто управляет своим временем


Это ещё один бета-компонент новой версии Vivaldi и он также содержит огромный набор опций, режимов и прочих средств по управлению различными событиями вашей жизни.


Здесь огромный простор для изучения возможностей данного компонента. Вы можете использовать только локальный календарь или подключаться к онлайновым сервисам, доступно приглашение участников на ваши мероприятия, и вы можете принимать приглашения от других (здесь очень кстати пригодится почтовый клиент), вы даже можете управлять своими задачами есть и такой режим в календаре. И, конечно, масса глобальных настроек находится в настройках браузера.


Мы подготовили ещё одно видео, которое расскажет чуть подробнее об этих и других функциях новой версии Vivaldi.


Выбор, как встроенная функция


Как видите, с каждой версией в браузере Vivaldi появляется всё больше новых функций. С одной стороны это здорово, но есть и обратная сторона медали: приходится всё больше времени тратить на настройку браузера под свои нужды. Поэтому мы решили немного упростить задачу. Теперь при первом запуске браузера вы увидите новое окно приветствия, где вам будет предложено выбрать между тремя вариантами браузера точнее, наборами функций, доступных непосредственно из интерфейса приложения. Вы можете выбрать минимализм, классический набор функций или включить всё по максимуму.


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

И если разговор о выборе, то мы подготовили для вас новые фоновые рисунки, которые вы можете выбрать для использования на Экспресс-панели.


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

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

Get it on Google Play

Get it on Uptodown

Всем спасибо за помощь в подготовке и тестировании новых версий браузера Vivaldi!
Подробнее..

Категории

Последние комментарии

  • Имя: Билал
    04.12.2024 | 19:28
  • Имя: Murshin
    13.06.2024 | 14:01
    Нейросеть-это мозг вселенной.Если к ней подключиться,то можно получить все знания,накопленные Вселенной,но этому препятствуют аннуннаки.Аннуннаки нас от неё отгородили,установив в головах барьер. Подр Подробнее..
  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2025, personeltest.ru