O que há de diferente no novo protocolo WebSocket

A especificação do protocolo WebSocket foi atualizada recentemente para solucionar as preocupações de segurança anteriores e é, em grande parte, estável. Confira abaixo um resumo das mudanças e algumas observações sobre as implementações atuais.

O que mudou desde o WebSocket HyBi 00?

  • O formato do frame do protocolo foi alterado. HyBi 00 costumava usar "0x00" para a cabeça e "0xff" para a cauda em cada frame. O HyBi 10 agora usa um novo formato, como o seguinte:
      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 ...                |
     +---------------------------------------------------------------+

Os problemas de segurança foram resolvidos

  • Sec-WebSocket-Key e Sec-WebSocket-Accept são adicionados no lugar das três chaves do HyBi 00. O navegador fornece o número gerado aleatoriamente para Sec-WebSocket-Key. Em seguida, o servidor usa o GUID específico do protocolo WebSocket (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) e SHA1 / BASE64, etc. para retornar Sec-WebSocket-Accept, para que o navegador possa confirmar que entende o WebSocket. Isso evita um ataque entre protocolos.
  • Em cada frame, o mascaramento de frame agora é obrigatório. Isso evita o envenenamento do cache no proxy. Sec-WebSocket-Origin é adicionado para impedir o acesso de scripts que o provedor de serviços não conhece.
  • Sec-WebSocket-Origin foi adicionado no lugar da chave de origem do HyBi 00 para evitar o acesso a scripts que o provedor de serviços não conhece. Observe que será apenas "Origin" no HyBi 11.

Mudanças na API JS

  • subprotocol agora pode ser uma matriz, permitindo uma assinatura de método de new WebSocket(String url, Array subprotocol)
  • Atributo .protocol [String]
  • Atributo .binaryType [Blob|ArrayBuffer]
  • .extension [String]
  • O código de status e o motivo (por que a conexão foi encerrada) foram adicionados a CloseEvent. A função close() também foi alterada para aceitar esses dois argumentos.

Extensões

  • Sec-WebSocket-Extensions foi adicionado. As extensões propostas são:
  • O deflate-frame cria frames compactados na origem e extraídos no destino.
  • x-google-mux para oferecer suporte à multiplexação, mas está em estágio inicial.

Há compatibilidade entre o HyBi 00 e o HyBi 10 na implementação do servidor e do navegador?

  • As implementações do servidor podem oferecer suporte a HyBi 00 e HyBi 10 ao analisar o cabeçalho HTTP de handshake. No entanto, não é recomendável oferecer suporte a HyBi 00, porque ela é vulnerável.
  • A API JavaScript WebSocket é bastante semelhante entre as versões antigas e novas. No entanto, como observado acima, não recomendamos oferecer suporte ao HyBi 00, porque ele é conhecido por ser vulnerável.

Qual navegador é compatível com o HyBi 10?

  • O Chrome 14 oferece suporte ao protocolo HyBi 10, mas as mudanças da API JavaScript WebSocket mencionadas acima ainda estão a caminho. O Firefox 7 também será compatível com o HyBi 10.