מפרט הפרוטוקול של 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.