Co się zmieniło w nowym protokole WebSocket

Eiji Kitamura
Eiji Kitamura

Specyfikacja protokołu WebSocket została niedawno zaktualizowana, aby rozwiązać wcześniejsze problemy z bezpieczeństwem i jest w dużej mierze stabilna. Poniżej znajduje się podsumowanie wprowadzonych zmian oraz kilka uwag na temat bieżących implementacji.

Co się zmieniło od WebSocket HyBi 00?

  • Format ramki protokołu został zmieniony. HyBi 00 używało parametru "0x00" do śledzenia głowy i "0xff" jako ogona dla każdej klatki. HyBi 10 wykorzystuje teraz nowy format:
      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 ...                |
     +---------------------------------------------------------------+

Problemy dotyczące bezpieczeństwa zostały rozwiązane

  • Zamiast 3 kluczy HyBi 00 dodano Sec-WebSocket-Key i Sec-WebSocket-Accept. Przeglądarka przekazuje losowo wygenerowaną liczbę do Sec-WebSocket-Key. Następnie serwer używa go z określonym dla protokołu WebSocket identyfikatorem GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11), SHA1 / BASE64 itd., aby zwrócić Sec-WebSocket-Accept, dzięki czemu przeglądarka może potwierdzić, że obsługuje WebSocket. Zapobiega to atakom międzyprotokołowym.
  • W przypadku każdej klatki wymagane jest teraz maskowanie klatek. Zapobiega to zatruciu pamięci podręcznej na serwerze proxy. Dodano tag Sec-WebSocket-Origin, aby zablokować dostęp do skryptów, o których dostawca usług nie wie.
  • Zamiast klucza źródła HyBi 00 został dodany Sec-WebSocket-Origin, aby zablokować dostęp do skryptów, o których dostawca usług nie wie. Pamiętaj, że na HyBi 11 będzie to tylko „Origin”.

Zmiany w interfejsie JS API

  • subprotocol może być teraz tablicą, co umożliwia podpis metody new WebSocket(String url, Array subprotocol)
  • Atrybut .protocol [ciąg znaków]
  • Atrybut .binaryType [Blob|TrackBuffer]
  • .extension [ciąg znaków]
  • Kod stanu i przyczyna (dlaczego połączenie jest zamknięte) zostały dodane do: CloseEvent. Zmieniliśmy też funkcję close(), tak by odpowiednio przyjmowała te dwa argumenty.

Rozszerzenia

  • Dodano użytkownika Sec-WebSocket-Extensions. Proponowane rozszerzenia to:
  • deflate-frame skompresuje klatki u źródła i wyodrębni w miejscu docelowym.
  • x-google-mux, aby umożliwić obsługę multipleksu, ale jest na wczesnym etapie rozwoju.

Czy HyBi 00 i HyBi 10 są zgodne zarówno z implementacją serwera, jak i przeglądarki?

  • Implementacje z serwerem mogą obsługiwać zarówno HyBi 00, jak i HyBi 10, sprawdzając nagłówek HTTP uzgadniania połączenia. Nie zalecamy jednak obsługi HyBi 00, ponieważ wiadomo, że jest ona podatna na ataki.
  • Interfejs WebSocket JavaScript API jest w starej i nowej wersji bardzo podobny. Jak już wspomnieliśmy, nie zalecamy obsługiwania HyBi 00, ponieważ wiadomo, że jest ono podatne na ataki.

Która przeglądarka obsługuje HyBi 10?

  • Chrome 14 obsługuje protokół HyBi 10, ale zmiany interfejsu WebSocket JavaScript API opisane powyżej wciąż są wprowadzane. Planujemy też obsługiwać przeglądarkę Firefox 7 i HyBi 10.