Specyfikacja protokołu WebSocket została niedawno zaktualizowana, aby rozwiązać wcześniejsze problemy z bezpieczeństwem. Obecnie jest ona w dużej mierze stabilna. Poniżej znajdziesz podsumowanie tych zmian oraz kilka uwag na temat bieżących wdrożeń.
Co się zmieniło od wersji WebSocket HyBi 00?
- Format ramki protokołu został zmieniony. W przypadku każdego kadru model HyBi 00 używał wartości
"0x00"dla głowy i"0xff"dla ogona. HyBi 10 używa teraz nowego formatu:
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 ... |
+---------------------------------------------------------------+
Rozwiązano problemy z zabezpieczeniami
- Zamiast 3 kluczy HyBi 00 dodano klucze
Sec-WebSocket-KeyiSec-WebSocket-Accept. Przeglądarka przekazuje losowo wygenerowaną liczbę doSec-WebSocket-Key. Następnie serwer używa go z specyficznym identyfikatorem GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) i protokołem WebSocket (SHA1 / BASE64 itp.), aby zwrócićSec-WebSocket-Accept, dzięki czemu przeglądarka może potwierdzić, że rozumie 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.
Sec-WebSocket-Originjest dodawane, aby uniemożliwić dostęp skryptom, których dostawca usługi nie zna. - Zamiast klucza Origin usługi HyBi 00 dodawany jest klucz
Sec-WebSocket-Origin, aby uniemożliwić dostęp skryptom, których dostawca usługi nie zna. Pamiętaj, że w HyBi 11 będzie to tylko „Origin”.
Zmiany w interfejsie JS API
- Argument
subprotocolmoże teraz być tablicą, co pozwala na użycie sygnatury metodynew WebSocket(String url, Array subprotocol) - Atrybut
.protocol[String] - Atrybut
.binaryType[Blob|ArrayBuffer] .extension[ciąg znaków]- Do
CloseEventdodano kod stanu i powód (dlaczego połączenie zostało zamknięte). Zmieniliśmy też funkcjęclose(), aby przyjmowała te 2 argumenty.
Rozszerzenia
- Dodano partnera
Sec-WebSocket-Extensions. Proponowane rozszerzenia: deflate-framepowoduje kompresję klatek w źródle i ich wyodrębnienie w miejscu docelowym.x-google-mux, aby obsługiwać multipleksowanie, ale jest to rozwiązanie na wczesnym etapie.
Czy HyBi 00 i HyBi 10 są zgodne ze sobą zarówno w implementacji na serwerze, jak i w przeglądarce?
- Implementacje serwera mogą obsługiwać zarówno HyBi 00, jak i HyBi 10, analizując nagłówek HTTP protokołu inicjalizacji. Nie zalecamy jednak obsługi HyBi 00, ponieważ jest ona podatna na ataki.
- Interfejs WebSocket JavaScript API jest w dużej mierze podobny w starej i nowej wersji. Jak już wspomnieliśmy, nie zalecamy obsługi HyBi 00, ponieważ jest ona podatna na ataki.
Które przeglądarki obsługują HyBi 10?
- Chrome 14 obsługuje protokół HyBi 10, ale wspomniane wyżej zmiany interfejsu WebSocket JavaScript są jeszcze w drodze. Firefox 7 ma też obsługiwać HyBi 10.