Чем отличается новый протокол WebSocket

Спецификация протокола 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.