Điểm khác biệt trong giao thức WebSocket mới

Thông số kỹ thuật của giao thức WebSocket gần đây đã được cập nhật để giải quyết những vấn đề bảo mật trước đây và phần lớn là ổn định. Dưới đây là bản tóm tắt các thay đổi có liên quan, cùng với một số lưu ý về cách triển khai hiện tại.

Có gì thay đổi kể từ WebSocket HyBi 00?

  • Đã thay đổi định dạng khung giao thức. HyBi 00 dùng "0x00" cho phần đầu và "0xff" cho đuôi của mỗi khung hình. HyBi 10 hiện sử dụng định dạng mới như sau:
      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 ...                |
     +---------------------------------------------------------------+

Đã xử lý các vấn đề bảo mật

  • Sec-WebSocket-KeySec-WebSocket-Accept được thêm vào thay cho ba khoá của HyBi 00. Trình duyệt cung cấp số được tạo ngẫu nhiên cho Sec-WebSocket-Key. Sau đó, máy chủ sử dụng nó với GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) và SHA1 / BASE64 cụ thể của giao thức WebSocket, v.v. để trả về Sec-WebSocket-Accept sao cho trình duyệt có thể xác nhận rằng đã hiểu WebSocket. Việc này giúp ngăn chặn hành vi tấn công giữa nhiều giao thức.
  • Giờ đây, bạn bắt buộc phải sử dụng tính năng tạo lớp phủ khung trên mỗi khung hình. Điều này giúp ngăn ngừa hiện tượng nhiễm độc bộ nhớ đệm trên proxy. Sec-WebSocket-Origin được thêm vào để ngăn quyền truy cập vào các tập lệnh mà nhà cung cấp dịch vụ không biết.
  • Sec-WebSocket-Origin được thêm vào thay cho khoá Origin của HyBi 00 để ngăn quyền truy cập vào các tập lệnh mà nhà cung cấp dịch vụ không biết. Xin lưu ý rằng đây sẽ chỉ là "Origin" trên HyBi 11.

Thay đổi API JS

  • subprotocol hiện có thể là mảng, cho phép chữ ký phương thức của new WebSocket(String url, Array subprotocol)
  • Thuộc tính .protocol [Chuỗi]
  • Thuộc tính .binaryType [Blob|ArrayBuffer]
  • .extension [Chuỗi]
  • Thêm mã trạng thái và lý do (lý do kết nối bị đóng) vào CloseEvent. Hàm close() cũng được thay đổi để chấp nhận 2 đối số này một cách phù hợp.

Phần mở rộng

  • Đã thêm Sec-WebSocket-Extensions. Các tiện ích được đề xuất là:
  • deflate-frame làm cho khung được nén tại nguồn và trích xuất tại đích.
  • x-google-mux để hỗ trợ tính năng ghép kênh nhưng đang ở giai đoạn đầu.

Có khả năng tương thích giữa HyBi 00 và HyBi 10 khi triển khai cả máy chủ và trình duyệt không?

  • Việc triển khai máy chủ có thể hỗ trợ cả HyBi 00 và HyBi 10 bằng cách xem xét tiêu đề HTTP bắt tay. Tuy nhiên, bạn không nên hỗ trợ HyBi 00 vì hệ thống này được biết là dễ bị tổn thương.
  • API JavaScript WebSocket rất giống nhau giữa phiên bản cũ và phiên bản mới. Nhưng như đã lưu ý ở trên, bạn không nên hỗ trợ HyBi 00 vì hệ thống này được biết là dễ bị tấn công.

Trình duyệt nào hỗ trợ HyBi 10?

  • Chrome 14 hỗ trợ giao thức HyBi 10 mặc dù các thay đổi về API WebSocket JavaScript nêu trên vẫn đang được phát triển. Firefox 7 cũng được lên kế hoạch hỗ trợ HyBi 10.