โปรโตคอล WebSocket ใหม่มีความแตกต่างอย่างไร

ข้อมูลจำเพาะของโปรโตคอล WebSocket ได้รับการอัปเดตเมื่อเร็วๆ นี้เพื่อแก้ปัญหาด้านความปลอดภัยก่อนหน้านี้และมีความเสถียรในระดับหนึ่ง ด้านล่างนี้เป็นสรุปการเปลี่ยนแปลงที่เกี่ยวข้อง พร้อมทั้งหมายเหตุบางส่วนเกี่ยวกับการใช้งานในปัจจุบัน

มีอะไรเปลี่ยนแปลงบ้างตั้งแต่ WebSocket HyBi 00

  • เปลี่ยนรูปแบบเฟรมโปรโตคอลแล้ว HyBi 00 เคยใช้ "0x00" สำหรับส่วนหัวและ "0xff" สำหรับส่วนหางในแต่ละเฟรม ตอนนี้ HyBi 10 ใช้รูปแบบใหม่ดังต่อไปนี้
      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 ...                |
     +---------------------------------------------------------------+

ปัญหาด้านความปลอดภัยได้รับการแก้ไขแล้ว

  • ระบบจะเพิ่ม Sec-WebSocket-Key และ Sec-WebSocket-Accept แทนคีย์ 3 รายการของ HyBi 00 เบราว์เซอร์จะส่งตัวเลขที่สร้างขึ้นแบบสุ่มไปยัง Sec-WebSocket-Key จากนั้นเซิร์ฟเวอร์จะใช้ GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) และ SHA1 / BASE64 เฉพาะของโปรโตคอล WebSocket เพื่อแสดงผล Sec-WebSocket-Accept เพื่อให้เบราว์เซอร์ยืนยันว่าเข้าใจ WebSocket ซึ่งจะช่วยป้องกันโจมตีข้ามโปรโตคอล
  • ตอนนี้แต่ละเฟรมจะต้องมีการมาสก์เฟรม ซึ่งจะช่วยป้องกันแคชพอยโซนิงในพร็อกซี มีการเพิ่ม Sec-WebSocket-Origin เพื่อป้องกันการเข้าถึงจากสคริปต์ที่ผู้ให้บริการไม่รู้จัก
  • ระบบจะเพิ่ม Sec-WebSocket-Origin แทนคีย์ต้นทางของ HyBi 00 เพื่อป้องกันไม่ให้สคริปต์ที่ผู้ให้บริการไม่ทราบเข้าถึง โปรดทราบว่าใน HyBi 11 จะเป็น "Origin" เท่านั้น

การเปลี่ยนแปลง JS API

  • ตอนนี้ subprotocol จะเป็นอาร์เรย์ได้ ซึ่งช่วยให้มีลายเซ็นเมธอดของ new WebSocket(String url, Array subprotocol)
  • แอตทริบิวต์ .protocol [สตริง]
  • แอตทริบิวต์ .binaryType [Blob|ArrayBuffer]
  • .extension [สตริง]
  • เพิ่มรหัสสถานะและเหตุผล (สาเหตุที่การเชื่อมต่อถูกปิด) ไปยัง CloseEvent แล้ว นอกจากนี้ ฟังก์ชัน close() ยังมีการเปลี่ยนแปลงให้ยอมรับอาร์กิวเมนต์ 2 รายการนี้ด้วย

ส่วนขยาย

  • เพิ่ม Sec-WebSocket-Extensions แล้ว ส่วนขยายที่เสนอมีดังนี้
  • deflate-frame ทำให้เฟรมถูกบีบอัดที่ต้นทางและดึงข้อมูลได้ที่ปลายทาง
  • x-google-mux เพื่อรองรับมัลติเพล็กซิบ แต่อยู่ในขั้นเริ่มต้น

HyBi 00 และ HyBi 10 ใช้งานร่วมกันได้ไหมทั้งกับเซิร์ฟเวอร์และเบราว์เซอร์

  • การใช้งานเซิร์ฟเวอร์จะรองรับทั้ง HyBi 00 และ HyBi 10 ได้โดยดูที่ส่วนหัว HTTP ของแฮนด์เชค อย่างไรก็ตาม เราไม่แนะนําให้รองรับ HyBi 00 เนื่องจากเป็นที่ทราบว่ามีความเสี่ยง
  • WebSocket JavaScript API เวอร์ชันเก่าและเวอร์ชันใหม่มีความคล้ายคลึงกันมาก แต่ตามที่ระบุไว้ข้างต้น เราขอแนะนำว่าอย่ารองรับ HyBi 00 เนื่องจากเป็นที่ทราบกันดีว่ามีความเปราะบาง

เบราว์เซอร์ใดบ้างที่รองรับ HyBi 10

  • Chrome 14 รองรับโปรโตคอล HyBi 10 แม้ว่าการเปลี่ยนแปลง WebSocket JavaScript API ที่กล่าวถึงข้างต้นจะยังไม่เสร็จสมบูรณ์ นอกจากนี้ Firefox 7 มีแผนจะสนับสนุน HyBi 10 ด้วย