Спецификация протокола WebSocket недавно была обновлена для решения предыдущих проблем безопасности и в целом стабильна. Ниже приводится краткое описание внесенных изменений, а также некоторые примечания по текущим реализациям.
Что изменилось по сравнению с WebSocket HyBi 00?
- Изменен формат кадра протокола. HyBi 00 раньше использовал
"0x00"
для заголовка и"0xff"
для хвоста для каждого кадра. HyBi 10 теперь использует новый формат, например следующий:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/63) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
Проблемы безопасности решены
-
Sec-WebSocket-Key
иSec-WebSocket-Accept
добавляются вместо трех ключей HyBi 00. Браузер присваиваетSec-WebSocket-Key
случайно сгенерированный номер. Затем сервер использует его со специальным GUID протокола WebSocket (258EAFA5-E914-47DA-95CA-C5AB0DC85B11
) и SHA1 / BASE64 и т. д., чтобы вернутьSec-WebSocket-Accept
, чтобы браузер мог подтвердить, что он понимает WebSocket. Это предотвращает межпротокольную атаку. - На каждом кадре теперь требуется маскирование кадров . Это предотвращает отравление кэша на прокси-сервере.
Sec-WebSocket-Origin
добавляется для предотвращения доступа из сценариев, о которых поставщик услуг не знает. -
Sec-WebSocket-Origin
добавляется вместо ключа Origin HyBi 00, чтобы предотвратить доступ со стороны сценариев, о которых поставщик услуг не знает. Обратите внимание, что на HyBi 11 это будет просто «Origin
».
Изменения JS API
-
subprotocol
теперь может быть массивом, что позволяет использовать сигнатуру методаnew WebSocket(String url, Array subprotocol)
- Атрибут
.protocol
[Строка] - Атрибут
.binaryType
[Blob|ArrayBuffer] -
.extension
[Строка] - В
CloseEvent
добавлен код состояния и причина (почему соединение закрыто). Функцияclose()
также была изменена, чтобы принимать эти два аргумента соответственно.
Расширения
- Добавлен
Sec-WebSocket-Extensions
. Предлагаемые расширения: -
deflate-frame
сжимает кадры в источнике и извлекает их в пункте назначения. -
x-google-mux
для поддержки мультиплексирования, но находится на ранней стадии.
Существует ли совместимость между HyBi 00 и HyBi 10 как в серверной, так и в браузерной реализации?
- Реализации сервера могут поддерживать как HyBi 00, так и HyBi 10, просматривая HTTP-заголовок рукопожатия. Однако не рекомендуется поддерживать HyBi 00, поскольку известно, что он уязвим.
- API JavaScript WebSocket во многом схож в старой и новой версиях. Но, как отмечалось выше, мы не рекомендуем поддерживать HyBi 00, поскольку известно, что он уязвим.
Какой браузер поддерживает HyBi 10?
- Chrome 14 поддерживает протокол HyBi 10, хотя упомянутые выше изменения API JavaScript WebSocket все еще находятся в стадии разработки. Планируется, что Firefox 7 также будет поддерживать HyBi 10.