Как отключить websocket в chrome

Обновлено: 07.07.2024

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

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

Изучив WebSocket с разных сторон, образовался следующий список проблем, которые в WebSocket есть, а в других популярных и используемых местах их не имеется, либо не несут важных или критичных проблем. Но давайте сперва изучим другую сторону WebSocket, ту, которая лежит в его основе: TCP-keepalive.

TCP KeepAlive

Что такое KeepAlive? Это способ оставлять TCP-соединение открытым долгое время.

Как это делается? Раз в определенный период происходит обмен специальными пакетами, которые озаглавлены в документации "keepalive probes". Выполняется это с помощью PSH- и RST-пакетов.

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

В ядре Linux вокруг этого есть три настройки:

Здесь показаны их значения по умолчанию. net.ipv4.tcp_keepalive_time - это как раз максимальное время между пакетами с данными.

net.ipv4.tcp_keepalive_intvl - интервал обмена пакетами "keepalive probes" по умолчанию 75 секунд. "net.ipv4.tcp_keepalive_probes" - это количество возможных неотвеченных "keepalive probes" пакетов - по сути попыток возобновить соединение.

Как переводится соединение в режим KeepAlive? На языке C очень просто:

Так же можно использовать для своих сокетов свои величины intvl и probes:

В комментариях к этим опциям в документации отмечено: "This option should not be used in code intended to be portable." Эти опции требуется применять очень аккуратно: это настройки, которые ДОЛЖНЫ быть одинаковы и на клиенте, и на сервере.

Если величины, например, tcp_keepalive_intvl разойдутся, то клиент, работающий по умолчанию, и сервер, работающий в режиме tcp_keepalive_intvl=25, будут иметь разную информацию о соединении. В этом примере 75/25 - клиент может долго думать, что соединение еще открыто, когда сервер будет уже знать о том, что оно закрылось. Это будет приводить к отправке пакетов в уже закрытое на том конце соединение и потере пакетов.

Но, тем не менее, если вы контролируете и клиентский код, и серверный, то эти величины для вас доступны.

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

WebSocket

Websocket использует TCP-KeepAlive соединения. В конкретном применении это дает как плюсы, так и минусы. Плюсы очевидны:

  1. Постоянное соединение, которое можно просунуть в Web-браузер, от которого наступает счастье и на FrontEnd, и на BackEnd в Web-приложении или мобильном приложении, работающем с сервером.
  2. Кратковременное отсутвие связи вообще не обрывает такое соединение.
  3. Позволяет работать асинхронно, вместо привычной для web-а работы в режиме запрос-ответ.

Проблемы WebSocket в современном использовании менее очевидны:

Смена сети клиентом. В сетях мобильной связи часто бывает так, что ваш внешний IP, NAT и вообще сеть, в которой присутствует мобильное устройство, меняются. Это даже не зависит от оператора: вы пришли домой, подключился Wi-Fi и весь websocket рухнул очень забавным образом:

  1. Сервер ничего не знает о вашей смене адреса, если клиент не закрыл соединение при переподключении к другой сети.
  2. Сервер продолжает отправлять ваши приватные данные на старый IP, а вас там уже нет. Там уже кто-то другой их получает и это утечка (только не говорите мне, что SSL решает эту проблему, к сожалению, он решает её на уровне криптографии, но не на уровне доступа. Иногда сам факт передачи Вам какой-либо информации от известного получателя, без деталей, являтеся ценным и это не редкость, а ежедневный кейс при борьбе с утечками информации)

Хотите пример такой утечки? Легко:

  1. Боб говорит Алисе что не пользуется услугами ТТТ-Банка и не может перевести ей денег.
  2. Боб покинул 4G сеть и ушел в Wi-Fi.
  3. Алиса знала, что на этом IP минуту назад был Боб.
  4. Сейчас IP Боба достался Алисе. (это не маловероятная ситуация, а вполне подстраиваемая, если сделать для этого некоторые усилия)
  5. Алиса получает пакет от сервера его банка "ТТТ-банк". Алиса знает, что IP отправителя принадлежит TTT-Банку (через whois, путем запросов на 443/80 порт и визуальное наблюдение API и т.п.). Теперь Алиса знает, что Боб пользуется мобильным приложением ТТТ-Банка и, скорее всего, у него есть карта.
  6. Итог:
    1. Боб пойман на вранье, чего Боб никак не хотел.
    2. Личная информация о том, каким банком пользуется Боб, известна Алисе, отчасти это уже может быть утечкой тайны (например, банковской)
    3. SSL не спас, что и ожидалось, т.к. ssl существует выше уровня IP, а IP отправителя (банка) известен Алисе.

    Повышенная нагрузка на серверы. Клиент ничего не знает о своей смене внешнего IP и сует данные в отпавшее соединение - сервер получает пакеты старого соединения уже с нового IP и отбрасывает их. Если у вас популярное мобильное приложение и, как результат, нагруженный сервер, то маленький чих в сети оператора мобильной связи устроит DDoS атаку на ваш сервер и вам прилетят старые пакеты, реконнекты, данные, вместо того, чтобы просто передать данные 1 раз. Т.е. вам требуется иметь многократный запас пропускной способности на серверах.

    Способы решения проблем WebSocket

    На данный момент решения для отработки обрыва соединения костыльно-ориентированные:

    • Решать на L7 задачи L4 - гонять "свои пинги" по websocket-у
    • Тюнить сеть и на клиентах, и на серверах путем установки tcp_keepalive_intvl в коде или настройках сервера:
      • Очень чреватый путь, особенно в настройках сервера, т.к. затронет работу всех приложений.
      • Недоступен для мобильных клиентов на Android (если я не прав и на Android есть способ установить setsockopt - поправьте меня, плиз, в комментариях в FB или VK).
      • Требует грамотных админов, разработчиков, разбирающихся в сети, и усложняет продукт на ровном месте.

      Универсальных способов решения проблем утечки информации об отправляемых пакетах при смене мобильным клиентом сети до сих пор нет.

      Сеть для нужд мониторинга: как устроено у нас

      Не секрет, что хорошо настроенный сервер "падает" гораздо реже, чем доступ из него в Интернет

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

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

      И снова о маленьких сетевых фокусах ради надежности работы web-сервисов

      Руководитель в IT: плюсы и минусы профессии

      Немного о том, как оно, быть хорошим руководителем в IT?

      IoT Highload: особенности и подводные камни

      Особенности серверных приложений, работающих с сетью IoT-устройств на практике и в теории

      Я хочу временно отключить веб-сокет в Google Chrome для отладки javascript, чтобы убедиться, что он работает в любом браузере без поддержки веб-сокетов.

      4 ответа

      Для начала я бы сказал, что существуют более эффективные механизмы для тестирования вашего JavaScript в среде без веб-сокетов. Например, вы можете запустить свой JavaScript в IE9, который не реализует протокол. Они все еще отключены на данный момент и в Firefox 4, если это вам больше нравится.

      Предполагая, что есть веская причина, по которой вам нужно протестировать в Chromium без веб-сокетов, я думаю, вам не повезло. Нет тривиального механизма для отключения веб-сокетов в Chromium. Он не встроен в качестве переключателя командной строки и не имеет настраиваемого флага. Поскольку механизма, позволяющего реализовать это изначально, нет, я бы не советовал тратить время на тестирование сценария. В каждой версии Chromium, которую используют ваши пользователи (например, 9+), включены веб-сокеты.

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

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

      Чтобы отключить ws, вы можете просто добавить «Блокировку запросов» в инструментах chrome dev, но только если конкретный файл запускает веб-сокет, чтобы предотвратить его загрузку, если вы не можете это сделать, это решение может не работать

      enter image description here

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

      enter image description here

      Файл инициатора находится на вкладке сети

      Увидев ответ на другой вопрос от @ user3661841, я создал сценарий GreaseMonkey / TamperMonkey, который позволит вам отключить веб-сокеты в аналогичном способ.

      Вот инструкции для браузеров на основе Chromium (Chrome, Brave, Sidekick и т. Д.):

      1. Загрузите расширение TamperMonkey из Chrome Store.
      2. Установите этот скрипт из GreasyFork. По умолчанию установка этого сценария отключает WebSockets на каждом посещаемом вами сайте . Если вы не хотите немедленно блокировать WebSockets, щелкните значок TamperMonkey и тумблер, чтобы отключить блокировку.
      3. Если вы хотите отключить WebSockets, щелкните значок TamperMonkey и тумблер, чтобы включить блокировку. Обновите страницу.
      4. Отключите сценарий, если вы больше не хотите блокировать WebSockets.

      Вот переключатель, который вы хотите нажать, чтобы отключить / включить блокировку WebSocket:

      enter image description here

      ПРИМЕЧАНИЕ 1 . Вы должны увидеть в своей консоли вывод, указывающий, что соединение WebSocket было предпринято, но заблокировано.

      ПРИМЕЧАНИЕ 2 : обязательно отключите это, когда закончите отключать WebSockets для разработки. Если вы используете TamperMonkey только для отключения WebSockets, вам нужно, чтобы ваш TamperMonkey в большинстве случаев выглядел так:

      Tamper Monkey when not testing

      И вот так, когда вы хотите заблокировать:

      Tamper Monkey when testing

      Мне удалось заблокировать веб-сокеты с помощью Fiddler.

      Перейдите в Rules / Customize Rules . в меню Fiddler.

      Добавьте этот код в класс Handlers (я поставил его после существующих пунктов RulesOption):

      Добавьте этот код в OnBeforeRequest:

      При этом в меню «Правила» добавляется пункт Блокировать веб-узлы . Когда он включен, ws-соединения должны блокироваться на основании заголовка Connection: Upgrade.

      Я хочу временно отключить websocket в Google Chrome для отладки javascript, чтобы убедиться, что он работает для любого браузера без поддержки websocket.

      3 ответа

      Я тестирую пинги и понги в своем приложении websocket. Я пропинговал клиент websocket в Chrome. Google Chrome прислал мне в ответ смайлики. Данные были: ☺☻♥´┐¢´┐¢´┐¢ В Scala, вот как я генерирую массив байтов: val byteData = (new.

      Для начала я бы сказал, что есть лучшие механизмы для тестирования вашего JavaScript в среде без websocket. Например, вы можете запустить свой JavaScript в IE9, который не реализует протокол. Они все еще отключены на данный момент в Firefox 4, если это больше в вашем стиле.

      Предполагая, что есть какая-то веская причина, по которой вам нужно протестировать в хроме без websocket, я думаю, что вам не повезло. В Chromium нет тривиального механизма для отключения WebSockets. Он не встроен в качестве переключателя командной строки и не имеет настраиваемого флага. Поскольку нет никакого механизма, чтобы это произошло изначально, я бы не советовал тратить время на тестирование сценария. В каждой версии Chromium, используемой вашими пользователями (например, 9+), включены websockets.

      Тем не менее, если вам действительно нужно отключить websockets, самое близкое, что вы можете сделать без перекомпиляции браузера, - это удалить соответствующие переменные в вашем тестовом коде:

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

      Я смог заблокировать WebSockets с помощью Fiddler .

      Перейдите в раздел Правила / Настройка правил. в меню Fiddler

      Добавьте этот код в обработчики классов (я поставил его после существующих элементов RulesOption):

      Добавьте этот код в OnBeforeRequest:

      Это добавляет опцию меню Блокировать Websockets в меню Правил. Когда он включен, соединения ws должны быть заблокированы на основе заголовка Connection: Upgrade.

      Чтобы отключить ws, вы можете просто добавить "Request blocking" в chrome dev tools, но только если конкретный файл инициирует websocket, чтобы предотвратить его загрузку, Если вы не можете этого сделать, это решение может не сработать

      enter image description here

      Websocket соединение инициируется echo.js, так что вы можете предотвратить этот файл от laoding и websocket никогда не запустится.

      enter image description here

      enter image description here

      Файл инициатора можно найти на вкладке Сеть

      Кто-нибудь знает, как отключить Google Chrome для автоматического обновления самого себя, это приводит к тому, что мое веб-приложение всегда меняется? Я пробовал эти методы: Используйте шаблоны Google Update ADM, представленные на этой странице или описанные в этой статье. Установите значение.

      Я видел это в MSDN magazine.i хотел временно отключить Foreignkeys, могу ли я сделать это с помощью следующего кода.. Не нужно было удалять, но временно отключить, потому что я хотел включить снова ALTER TABLE Orders NOCHECK CONSTRAINT FK_Orders_Customers

      Похожие вопросы:

      Я изменяю внешний вид сайта WordPress (незначительные изменения), но не вижу результата в chrome из-за раздражающего постоянного кэша. Я попробовал shift+refresh, но это не работает. как я могу.

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

      Поддерживает ли Google chrome frame websocket?

      Я хотел бы знать, как отключить автоматическое использование протокола SPDY в Google Chrome. Мне нужно сделать некоторые тесты, связанные с IDS, и для этой цели я хотел бы временно получить доступ к.

      Я тестирую пинги и понги в своем приложении websocket. Я пропинговал клиент websocket в Chrome. Google Chrome прислал мне в ответ смайлики. Данные были: ☺☻♥´┐¢´┐¢´┐¢ В Scala, вот как я генерирую.

      Кто-нибудь знает, как отключить Google Chrome для автоматического обновления самого себя, это приводит к тому, что мое веб-приложение всегда меняется? Я пробовал эти методы: Используйте шаблоны.

      Я видел это в MSDN magazine.i хотел временно отключить Foreignkeys, могу ли я сделать это с помощью следующего кода.. Не нужно было удалять, но временно отключить, потому что я хотел включить снова.

      Я только начинаю с create-react-app, и мне было неприятно видеть ошибки WebSocket в консоли (и индикатор загрузки Chrome отображается дольше). Возможно, когда-нибудь мне понадобится WebSocket, но.

      Я хочу отладить локальную проблему среды разработки, потенциально вызванную CORB в Chrome 74. Я хочу посмотреть, исчезнет ли - когда я выключу CORB - проблема. По Гугл разработчика, доктора сказали.

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

      У меня нет таких проблем при использовании IE.

      Я за рабочей сетью, и оба браузера используют одинаковые настройки локальной сети. Когда я захожу в настройки локальной сети, ставится только галочка Use automatic configuration script и там есть URL.

      Почему веб-сокеты не являются проблемой в IE, и как я могу предотвратить их появление в других браузерах?

      Информация: Вот некоторая информация о версиях браузера. Хром: 52.02743.116 IE: 11.0.9600

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

      Я подозреваю несоответствие в настройках прокси разных браузеров.

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

      Скрипт автоматической настройки прокси (PAC) в вашей среде мог использовать некоторые функции, работающие только в IE. Сценарий PAC загружен в ваш браузер (результат «Определение настроек прокси . ») или виден в настройках прокси вашего браузера?

      Если вы дойдете до точки, где все настройки прокси браузеров одинаковы и PAC-файл задействован. То есть Возможно, файл, полученный с помощью wpad, может работать в одном браузере, но не в другом, вам придется исследовать его глубже.

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

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

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

      и некоторая справочная информация:

      Вот обратный пример где функция сценария PAC не работает в IE11, но работает в других браузерах.

      Тем не менее, похоже, что в заголовке спецификации

      Обновлено 2 раза

      Краткий ответ: Нет, можно указать только путь и поле протокола.

      Более длинный ответ:

      Заголовок Sec-WebSocket-Protocol (который иногда расширяется для использования при аутентификации, специфичной для веб-сокета) генерируется из необязательного второго аргумента в конструкторе WebSocket:

      Выше приведены следующие заголовки:

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

      Основная информация об аутентификации (устарела):

      Заголовок авторизации создается из поля имени пользователя и пароля (или просто имени пользователя) URI WebSocket:

      Я протестировал базовую аутентификацию в Chrome 55 и Firefox 50 и убедился, что базовая аутентификационная информация действительно согласовывается с сервером (это может не работать в Safari).

      Спасибо Дмитрию Франку за базовый ответ .

      Я хочу использовать Bearer , но я применил следующий трюк: я подключаюсь к серверу следующим образом:

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

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

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

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

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

      Вы не можете отправлять пользовательский заголовок, если хотите установить соединение WebSockets с помощью JavaScript WebSockets API.
      Вы можете использовать заголовки Subprotocols , используя второй конструктор класса WebSocket:

      и затем вы можете получить заголовки подпротоколов, используя клавишу Sec-WebSocket-Protocol на сервере.

      Существует также ограничение: значения заголовков ваших подпротоколов не могут содержать запятую ( , )!

      Отправка заголовка авторизации невозможна.

      Полностью взломал его так, благодаря ответу Канаки.

      Сервер (с использованием Koa2 в этом примере, но должен быть одинаковым везде):

      Вы можете передать заголовки как значение ключа в третьем параметре (опции) внутри объекта.
      Пример с токеном авторизации. Оставил протокол (второй параметр) как ноль

      Технически вы будете отправлять эти заголовки через функцию соединения до фазы обновления протокола. Это сработало для меня в проекте nodejs :

      Читайте также: