# Веб-сокеты

### Что такое веб-сокеты&#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\:// для шифрования данных.
* Обеспечить аутентификацию и авторизацию на уровне каналов веб-сокетов.
* Применять белые списки исходных точек, чтобы контролировать, кто может устанавливать соединения.
* Проводить тщательную валидацию и санацию всех данных, получаемых через веб-сокеты.
* Применять механизмы защиты от пересечения сессий.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://notes.kraken-security.ru/kraken/krupicy-znanii/obshie-stati/veb-sokety.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
