# Веб-сокеты

### Что такое веб-сокеты&#x20;

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

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

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

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

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

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

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

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

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

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

После «рукопожатия» HTTP-соединение переходит в режим веб-сокетов, устанавливается постоянное, двустороннее [TCP-соединение](https://notes.kraken-security.ru/kraken/krupicy-znanii/chto-takoe-tcp-ip).

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

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

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

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

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

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

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.<br>

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

1. Могут быть уязвимы для DoS. Кибержулики могут просто попытаться исчерпать ресурсы сервера, устанавливая множество соединений.
2. Традиционные веб-сокеты (ws\://) не используют шифрование. Это может привести к [MITM](https://notes.kraken-security.ru/kraken/krupicy-znanii/ob-atake-mitm).&#x20;
3. Механизмы аутентификации и проверки прав доступа для веб-сокетов могут быть менее развиты, чем для традиционного веб-трафика. Это может создать дополнительные риски, если веб-сокеты не интегрированы с системами контроля доступа.
4. Могут использоваться в сочетании с уязвимостями XSS для построения сетевых атак, поскольку могут позволять злоумышленникам направлять злой код прямо в браузер пользователя.
5. Могут быть подвержены проблемам безопасности, аналогичным традиционному веб-трафику, например, инъекция кода. Это в случае, если не проводится должная валидация вводимых данных.
6. Неправильное управление ошибками и логирование могут привести к утечке конфиденциальной информации о внутренней работе сервера через веб-сокеты.

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

* Использовать wss\:// для шифрования данных.
* Обеспечить аутентификацию и авторизацию на уровне каналов веб-сокетов.
* Применять белые списки исходных точек, чтобы контролировать, кто может устанавливать соединения.
* Проводить тщательную валидацию и санацию всех данных, получаемых через веб-сокеты.
* Применять механизмы защиты от пересечения сессий.
