Genel internete açık bir WebSocket sunucusu cazip bir hedeftir. Protokolün yerleşik bir mesaj boyutu sınırı yoktur, dolayısıyla tek bir bağlantı, özel hazırlanmış bir çerçeveyle tüm süreci çökertmeyi deneyebilir ve yükseltme el sıkışması, özensiz doğrulamayı araştırmak için kolay bir noktadır. En son sgcWebSockets, bu kapıları varsayılan olarak kapatan bir dizi koruma sunar; böylece sunucunuz düşmanca trafik altında bile çalışmaya devam eder.
Aşağıdaki her şey üç WebSocket sunucusunun tümü için geçerlidir: TsgcWebSocketServer, TsgcWebSocketHTTPServer ve http.sys tabanlı TsgcWebSocketServer_HTTPAPI. .NET sürümü aynı korumaları devralır, çünkü aynı yerel kütüphane üzerinde çalışır.
Üç bellek saldırısını durduran tek bir sınır
Öne çıkan ekleme, gelen bir mesajın ne kadar büyük olabileceğini sınırlayan tek bir özellik olan MaxMessageSize'dır. Varsayılan değeri 64 MB'dır; bu, neredeyse her uygulama için cömert bir değerdir ve bunu yükseltebilir veya düşürebilir ya da sınırı devre dışı bırakmak için 0 olarak ayarlayabilirsiniz.
O tek özellik, hepsi aynı şekilde, sunucunun RAM'i tükenmiş halde son bulan üç farklı bellek tüketme tekniğine karşı savunma sağlar:
- Aşırı büyük çerçeveler. Bir istemci devasa bir yük uzunluğu bildirir. Sunucu artık gövdeyi okumaya başlamadan önce çerçeveyi reddeder.
- Bitmeyen parçalanma. Bir istemci parçalanmış bir mesaj açar ve onu hiç bitirmez, devam çerçevelerini sonsuza dek akıtır. Sunucu artık tüm parçalar boyunca yeniden birleştirilen toplam boyutu sınırlar.
- Sıkıştırma bombaları. Gigabaytlara şişen küçük bir per-message-deflate çerçevesi. Sunucu artık şişen çıktı sınıra ulaştığı anda açma işlemini durdurur.
Her durumda bağlantı, WebSocket kapatma kodu 1009 (Message Too Big) ile temiz bir şekilde kapatılır ve sunucunun belleği asla sınırın ötesine geçmez.
oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 80;
// accept messages up to 16 MB, reject anything larger with close 1009
oServer.MaxMessageSize := 16 * 1024 * 1024;
oServer.Active := True;
Güvenli çerçeve uzunluğu ayrıştırma
WebSocket çerçeveleri 64-bit bir uzunluk alanı taşıyabilir. RFC 6455 uyarınca bu alanın en anlamlı biti sıfır olmalıdır. sgcWebSockets artık 64-bit uzunluğunun yüksek biti ayarlanmış bir çerçeveye güvenmek yerine onu reddeder; böylece yukarıdaki boyut sınırı, başa saran bir tam sayıyla aşılamaz. Bu kontrol her zaman açıktır ve MaxMessageSize'a bağlı değildir.
Daha sıkı el sıkışmalar
SecurityOptions altındaki iki yeni seçenek, WebSocket yükseltmesinin kendisini sağlamlaştırır ve her ikisi de varsayılan olarak etkindir.
EnforceWebSocketVersion, yükseltmeyi tamamlamak yerine, 13 dışında bir sürüm isteyen herhangi bir el sıkışmaya 426 Upgrade Required ve bir Sec-WebSocket-Version: 13 başlığıyla yanıt verir. ValidateWebSocketKey, Sec-WebSocket-Key'i eksik olan veya geçerli bir 16 baytlık base64 nonce olmayan herhangi bir el sıkışmayı 400 Bad Request ile reddeder. Her iki kontrol de yalnızca RFC 6455 yoluna uygulanır, dolayısıyla eski belirtimlerdeki daha eski istemciler etkilenmez.
oServer := TsgcWebSocketServer.Create(nil);
oServer.SecurityOptions.EnforceWebSocketVersion := True; // 426 on a wrong version
oServer.SecurityOptions.ValidateWebSocketKey := True; // 400 on a malformed key
// lock the server to your own site while you are at it
oServer.SecurityOptions.OriginsAllowed := 'https://app.example.com';
oServer.Active := True;
Güvenlik duvarıyla nasıl uyum sağlar
Bu korumalar, bellek saldırılarının tam olarak gerçekleştiği yer olan çerçeve ayrıştırıcısının içinde, protokol katmanında bulunur. Burası, Firewall ve RateLimiter bileşenlerinin erişemediği kısımdır, çünkü onlar bir mesajı yalnızca çözümlendikten sonra görürler. İki katman birbirini tamamlar: IP filtreleme, bağlantı ve mesaj hız sınırları ve köken politikası için güvenlik duvarını ve hız sınırlayıcıyı kullanmaya devam edin ve yeni yerleşik sınırların ayrıştırıcının kendisini korumasına izin verin. Genel bir sunucu için MaxMessageSize'ı gerçek maksimum değerinize ayarlamanızı, OriginsAllowed'ı ön ucunuza kilitlemenizi ve MaxConnections'ı sınırlamanızı öneririz.
Yükseltme
Yeni korumalar, güvenli varsayılanlarla, güncelleme yapar yapmaz etkin olur; böylece çoğu sunucu, tek bir kod değişikliği olmadan bellek ve el sıkışma sağlamlaştırması kazanır. Uygulamanız meşru olarak 64 MB'dan büyük mesajlar alıp veriyorsa, MaxMessageSize'ı buna göre yükseltin. Mevcut istemci kodu etkilenmez.
sgcWebSockets indirme sayfasından güncelleyin ya da GetIt veya kayıtlı hesabınız aracılığıyla edinin.
Sorularınız, geri bildirimleriniz veya geçiş yardımına mı ihtiyacınız var? Bize ulaşın, kodu yazan kişilerden bir yanıt alacaksınız.
