Diferencias del nuevo protocolo WebSocket

Eiji Kitamura
Eiji Kitamura

La especificación del protocolo WebSocket se actualizó recientemente para resolver los problemas de seguridad anteriores y es bastante estable. A continuación, se ofrece un resumen de los cambios involucrados, junto con algunas notas sobre las implementaciones actuales.

¿Qué cambió desde WebSocket HyBi 00?

  • Se cambió el formato de la trama de protocolo. HyBi 00 solía usar "0x00" para la cabeza y "0xff" para la cola en cada fotograma. HyBi 10 ahora usa un nuevo formato como el siguiente:
      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 ...                |
     +---------------------------------------------------------------+

Se solucionaron los problemas de seguridad

  • Se agregaron Sec-WebSocket-Key y Sec-WebSocket-Accept en lugar de las tres claves de HyBi 00. El navegador le asigna un número generado de forma aleatoria a Sec-WebSocket-Key. Luego, el servidor lo usa con el GUID específico del protocolo WebSocket (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) y SHA1 / BASE64, etc., para mostrar Sec-WebSocket-Accept y que el navegador pueda confirmar que comprende WebSocket. Esto evita un ataque entre protocolos.
  • Ahora se requiere enmascaramiento de marcos en cada fotograma. Esto evita el envenenamiento de la caché del proxy. Se agregó Sec-WebSocket-Origin para evitar el acceso a secuencias de comandos que el proveedor de servicios no conoce.
  • Se agregó Sec-WebSocket-Origin en lugar de la clave Origin de HyBi 00 para evitar el acceso desde secuencias de comandos que el proveedor de servicios no conoce. Ten en cuenta que será solo “Origin” en HyBi 11.

Cambios en la API de JS

  • subprotocol ahora puede ser un array, lo que permite una firma de método de new WebSocket(String url, Array subprotocol).
  • Atributo .protocol [String]
  • Atributo .binaryType [Blob|ArrayBuffer]
  • .extension [cadena]
  • Se agregaron el código de estado y el motivo (por el que se cerró la conexión) a CloseEvent. También se modificó la función close() para aceptar estos dos argumentos según corresponda.

Extensiones

  • Se agregó Sec-WebSocket-Extensions. Las extensiones propuestas son las siguientes:
  • deflate-frame comprime los marcos en el origen y los extrae en el destino.
  • x-google-mux para admitir la multiplexación, pero está en su etapa inicial

¿Hay compatibilidad entre HyBi 00 y HyBi 10 en la implementación del servidor y el navegador?

  • Las implementaciones de servidor pueden admitir HyBi 00 y HyBi 10 mediante la observación del encabezado HTTP del protocolo de enlace. Sin embargo, no se recomienda admitir HyBi 00, ya que se sabe que es vulnerable.
  • La API de JavaScript de WebSocket es muy similar entre las versiones anteriores y nuevas. Sin embargo, como se indicó más arriba, no recomendamos admitir HyBi 00, ya que se sabe que es vulnerable.

¿Qué navegador es compatible con HyBi 10?

  • Chrome 14 es compatible con el protocolo HyBi 10, aunque los cambios de la API de JavaScript de WebSocket mencionados anteriormente todavía están en camino. Además, Firefox 7 es compatible con HyBi 10.