Веб-сокеты

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

Что такое веб-сокеты

Технология, которая обеспечивает двустороннее, непрерывное соединение между клиентом (чаще всего браузером) и сервером. Она позволяет передавать данные в реальном времени без необходимости постоянно обновлять страницу или выполнять новые HTTP-запросы. Давайте представим, что соединение нашего компьютера с сайтом это что-то вроде телефонной связи. По этой метафоре вот как происходит соединение без веб-сокетов: Мы заходим на веб-сайт → наш компьютер «звонит» на сайт → запрашивает информацию → сайт «отвечает" один раз. Если мы хотим что-то ещё → нам нужно сделать новый «звонок».

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

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

Как происходит соединение в веб-сокетах

Здесь даже есть термин — «рукопожатие» (handshake). Вот что происходит:

1. Запрос на установку соединения.

Клиент посылает специальный HTTP-запрос на сервер с заголовком Upgrade, который указывает на желание переключиться с HTTP на веб-сокет протокол. Этот запрос также содержит заголовок Connection: Upgrade. Он говорит серверу, что клиент хочет установить постоянное соединение.

2. Ответ сервера.

Если сервер поддерживает веб-сокеты и готов принять соединение → отвечает на HTTP-запрос клиента статусным кодом 101 Switching Protocols. Сервер также отправляет заголовок Upgrade: websocket и Connection: Upgrade. То есть подтверждает, что переключение протоколов произошло, и теперь будет использоваться протокол веб-сокет.

3. Открывается постоянное соединение.

После «рукопожатия» HTTP-соединение переходит в режим веб-сокетов, устанавливается постоянное, двустороннее TCP-соединение.

4. Передача данных.

Сразу после соединения, клиент и сервер могут отправлять и получать данные в любое время. Данные обычно передаются в виде «кадров» (frames), которые могут содержать как текст, так и бинарные данные.

5. Закрытие соединения.

Клиент или сервер могут инициировать закрытие соединения, отправив управляющий кадр с кодом операции, указывающим на закрытие соединения (опкод 0x8). Этот кадр может также содержать статусный код, который говорит другой стороне причину закрытия соединения, и, опционально, короткое текстовое сообщение с пояснением.

Есть ли у веб-сокетов разновидности?

Если коротко: нет. Но веб-сокеты можно рассмотреть в разном контексте и как-то их распределить:

1. Библиотеки и Фреймворки.

Разработчики часто используют различные библиотеки и фреймворки, чтобы упростить работу с веб-сокетами. Например, Socket.IO, WebSocket-Node и ws для Node.js, а также Socket.IO и Websocket-Rails для других языков программирования.

2. Безопасные Веб-Сокеты (WSS).

Есть два типа протоколов: обычные веб-сокеты (WS), в которых нешифрованное соединение, и безопасные веб-сокеты (WSS), которые используют шифрование через TLS (тот же протокол, который используется для HTTPS). WSS обеспечивает безопасное соединение и предотвращает перехват данных.

3. Серверные реализации.

Веб-сокеты поддержаны различными веб-серверами и платформами: Apache, Nginx, IIS, а также серверами, базирующимися на Node.js.

Какие есть потенциальные уязвимости у веб-сокетов

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

  2. Традиционные веб-сокеты (ws://) не используют шифрование. Это может привести к MITM.

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

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

  5. Могут быть подвержены проблемам безопасности, аналогичным традиционному веб-трафику, например, инъекция кода. Это в случае, если не проводится должная валидация вводимых данных.

  6. Неправильное управление ошибками и логирование могут привести к утечке конфиденциальной информации о внутренней работе сервера через веб-сокеты.

Что можно сделать?

  • Использовать wss:// для шифрования данных.

  • Обеспечить аутентификацию и авторизацию на уровне каналов веб-сокетов.

  • Применять белые списки исходных точек, чтобы контролировать, кто может устанавливать соединения.

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

  • Применять механизмы защиты от пересечения сессий.

Last updated