Спецификация протокола 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
".
Изменения API JS
-
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, поскольку известно, что он уязвим.
- WebSocket JavaScript API во многом схож между старой и новой версиями. Но, как отмечено выше, мы не рекомендуем поддерживать HyBi 00, поскольку известно, что он уязвим.
Какой браузер поддерживает HyBi 10?
- Chrome 14 поддерживает протокол HyBi 10, хотя изменения WebSocket JavaScript API, упомянутые выше, все еще находятся в разработке. Firefox 7 также планирует поддерживать HyBi 10.