מה שונה בפרוטוקול WebSocket החדש

מפרט הפרוטוקול של WebSocket עודכן לאחרונה כדי לפתור בעיות אבטחה קודמות, והוא יציב במידה רבה. בהמשך מופיע סיכום של השינויים, יחד עם הערות לגבי הטמעות קיימות.

מה השתנה מאז WebSocket HyBi 00?

  • פורמט המסגרת של הפרוטוקול השתנה. בעבר, ב-HyBi 00 השתמשו ב-"0x00" לתחילת ה-frame וב-"0xff" לסוף ה-frame. ב-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 מתווספים במקום שלושת המפתחות של HyBi 00. הדפדפן מעביר למשתנה Sec-WebSocket-Key מספר שנוצר באופן אקראי. לאחר מכן, השרת משתמש בו עם GUID ספציפי של פרוטוקול WebSocket‏ (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) ו-SHA1 / BASE64 וכו' כדי להחזיר את הערך Sec-WebSocket-Accept, כדי שהדפדפן יוכל לאשר שהוא מבין את WebSocket. כך אפשר למנוע התקפה בפרוטוקולים שונים.
  • עכשיו צריך לבצע אנונימיזציה של פריימים בכל פריים. כך אפשר למנוע זיהום מטמון בשרת proxy. 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() השתנתה כדי לקבל את שני הארגומנטים האלה בהתאם.

תוספים

  • Sec-WebSocket-Extensions is added. התוספים המוצעים הם:
  • 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 שצוינו למעלה עדיין בדרך. בנוסף, אנחנו מתכננים להוסיף תמיכה ב-HyBi 10 ל-Firefox 7.