Yeni WebSocket protokolündeki farklar

Eiji Kitamura
Eiji Kitamura

WebSocket protokol spesifikasyonu, önceki güvenlik sorunlarını çözmek için kısa süre önce güncellenmiştir ve büyük ölçüde kararlıdır. Aşağıda, ilgili değişikliklerin bir özeti ve mevcut uygulamalara ilişkin bazı notlar bulunmaktadır.

WebSocket HyBi 00'den bu yana neler değişti?

  • Protokol çerçevesi biçimi değiştirildi. HyBi 00, her karede baş için "0x00" ve kuyruk için "0xff" kullanıyordu. HyBi 10 artık aşağıdaki gibi yeni biçimi kullanıyor:
      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 ...                |
     +---------------------------------------------------------------+

Güvenlik sorunları giderildi

  • HyBi 00'ün üç tuşunun yerine Sec-WebSocket-Key ve Sec-WebSocket-Accept eklendi. Tarayıcı, rastgele oluşturulmuş sayıyı Sec-WebSocket-Key adresine gönderir. Ardından sunucu, tarayıcının WebSocket'i anladığını onaylayabilmesi için Sec-WebSocket-Accept değerini döndürmek için WebSocket protokolüne özgü GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) ve SHA1 / BASE64 vb. ile kullanır. Bu sayede protokoller arası saldırılar önlenir.
  • Artık her karede çerçeve maskeleme zorunludur. Bu, proxy'de önbellek zehirlenmesini önler. Servis sağlayıcının farkında olmadığı komut dosyalarının erişimini engellemek için Sec-WebSocket-Origin eklenmiştir.
  • Servis sağlayıcının farkında olmadığı komut dosyalarının erişimini engellemek için HyBi 00'ın Kaynak anahtarının yerine Sec-WebSocket-Origin eklenir. HyBi 11'de bunun sadece "Origin" olacağını unutmayın.

JS API değişiklikleri

  • subprotocol artık new WebSocket(String url, Array subprotocol) yöntemi imzasına izin verecek şekilde diziye dönüştürülebilir
  • .protocol özelliği [String]
  • .binaryType özelliği [Blob|ArrayBuffer]
  • .extension [Dize]
  • Durum kodu ve nedeni (bağlantının neden kapatıldığı) CloseEvent öğesine eklendi. close() işlevi de bu iki bağımsız değişkeni uygun şekilde kabul edecek şekilde değiştirildi.

Uzantılar

  • Sec-WebSocket-Extensions eklendi. Önerilen uzantılar şunlardır:
  • deflate-frame, karelerin kaynakta sıkıştırılmasını ve hedefte ayıklanmasını sağlar.
  • Çoğullamayı destekleyecek, ancak başlangıç aşamasında olan x-google-mux.

Hem sunucu hem de tarayıcı uygulamasında HyBi 00 ve HyBi 10 arasında uyumluluk var mı?

  • Sunucu uygulamaları, el sıkışma HTTP başlığına bakarak hem HyBi 00 hem de HyBi 10'u destekleyebilir. Ancak, HyBi 00'ün savunmasız olduğu bilindiği için desteklenmesi önerilmez.
  • WebSocket JavaScript API, eski ve yeni sürümler arasında büyük ölçüde benzerdir. Ancak, yukarıda belirtildiği gibi, HyBi 00'ün savunmasız olduğu bilindiği için desteklenmesini önermeyiz.

Hangi tarayıcı HyBi 10'u destekler?

  • Chrome 14, HyBi 10 protokolünü destekler, ancak yukarıda bahsedilen WebSocket JavaScript API değişiklikleri hâlâ yolda. Firefox 7'nin de HyBi 10'u desteklemesi planlanıyor.