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
iSec-WebSocket-Accept
. Przeglądarka przekazuje losowo wygenerowaną liczbę doSec-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 metodynew 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.