Unterschiede beim neuen WebSocket-Protokoll

Eiji Kitamura
Eiji Kitamura

Die WebSocket-Protokollspezifikation wurde vor Kurzem aktualisiert, um frühere Sicherheitsprobleme zu lösen, und ist weitgehend stabil. Nachfolgend finden Sie eine Zusammenfassung der Änderungen sowie einige Hinweise zu den aktuellen Implementierungen.

Was hat sich seit WebSocket HyBi 00 geändert?

  • Das Protokollframe-Format wurde geändert. Mit HyBi 00 wurden "0x00" für den Kopf und "0xff" für das Ende für jeden Frame verwendet. HyBi 10 verwendet jetzt ein neues Format wie das folgende:
      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 ...                |
     +---------------------------------------------------------------+

Sicherheitsprobleme wurden behoben

  • Sec-WebSocket-Key und Sec-WebSocket-Accept werden anstelle der drei Schlüssel von HyBi 00 hinzugefügt. Der Browser weist Sec-WebSocket-Key eine zufällig generierte Zahl zu. Der Server verwendet ihn dann mit der spezifischen GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) und SHA1 / BASE64 des WebSocket-Protokolls, um Sec-WebSocket-Accept zurückzugeben, sodass der Browser bestätigen kann, dass er WebSocket versteht. Dies verhindert protokollübergreifende Angriffe.
  • Auf jedem Frame ist nun eine Frame-Maskierung erforderlich. Dies verhindert Cache-Poisoning auf dem Proxy. Sec-WebSocket-Origin wird hinzugefügt, um den Zugriff von Skripts zu verhindern, die dem Dienstanbieter nicht bekannt sind.
  • Sec-WebSocket-Origin wird anstelle des Ursprungsschlüssels von HyBi 00 hinzugefügt, um den Zugriff über Skripts zu verhindern, die dem Dienstanbieter nicht bekannt sind. Auf HyBi 11 ist dies nur „Origin“.

JS API-Änderungen

  • subprotocol kann jetzt ein Array sein, was die Methodensignatur new WebSocket(String url, Array subprotocol) zulässt
  • Attribut .protocol [String]
  • Attribut .binaryType [Blob|ArrayBuffer]
  • .extension [String]
  • Statuscode und Grund (warum die Verbindung getrennt wurde) wurden CloseEvent hinzugefügt. Die Funktion close() wurde ebenfalls so geändert, dass sie diese beiden Argumente akzeptiert.

Erweiterungen

  • Sec-WebSocket-Extensions wurde hinzugefügt. Folgende Erweiterungen werden vorgeschlagen:
  • Mit deflate-frame werden Frames an der Quelle komprimiert und am Ziel extrahiert.
  • x-google-mux unterstützt Multiplexing, befindet sich aber in einer frühen Phase.

Ist HyBi 00 und HyBi 10 sowohl in der Server- als auch in der Browserimplementierung kompatibel?

  • Serverimplementierungen können sowohl HyBi 00 als auch HyBi 10 unterstützen, indem der HTTP-Header des Handshakes geprüft wird. Es wird jedoch nicht empfohlen, HyBi 00 zu unterstützen, da es bekanntermaßen angreifbar ist.
  • Die WebSocket JavaScript API ist zwischen der alten und der neuen Version weitgehend ähnlich. Wie oben erwähnt, raten wir jedoch davon ab, HyBi 00 zu unterstützen, da es bekanntermaßen gefährdet ist.

Welche Browser unterstützen HyBi 10?

  • Chrome 14 unterstützt das HyBi 10-Protokoll, obwohl die oben genannten WebSocket JavaScript API-Änderungen noch in Arbeit sind. Außerdem soll HyBi 10 in Firefox 7 unterstützt werden.