Gerçek zamanlı uygulamaları ortak güvenlik açıklarından korumak için WebSocket’i güvence altına alma kılavuzu.
Bu makale, gerçek zamanlı çift yönlü iletişim ve temel metodolojilerin bunlara karşı savunmasını sağlayan WebSocket’in güvenlik açıklarını kapsamaktadır. HTTP’den farklı olarak, WebSocket bir bağlantı kurulduktan sonra sürekli veri alışverişine izin verdiği için etkilidir, ancak bu özellik onu yeni güvenlik tehditlerine maruz bırakabilir.
WebSocket güvenliğinin temel ilkeleri
WebSocket güvenliğini güçlendirmek için aşağıdaki temel ilkeler dikkate alınmalıdır. Her madde potansiyel saldırı vektörlerinin engellenmesinde önemli bir rol oynar.
İlke | Tanım |
---|---|
Şifreleme İletişimi (WSS) | Her zaman kullanın wss:// İletişimi şifrelemek için protokol. ws:// Verileri düz metin olarak ileterek, koklama saldırılarına karşı savunmasız hale gelirken wss:// Verileri TLS (taşıma katmanı güvenliği) aracılığıyla şifreler, iletişimi ortadaki insan (MITM) saldırılarından korur. |
Origin başlıklarını doğrulayın | Siteler arası WebSocket Kaçırma (CSWSH) saldırılarına karşı savunmak için sunucunun doğrulanması gerekir. Origin WebSocket el sıkışma istekleri sırasında başlık. İzin verilen alanların bir izin verilmesi oluşturun ve bu listede değil Origins’ten bağlantı isteklerini reddedin. |
Sağlam kimlik doğrulama uygulayın | WebSocket protokolünün kendisinin kimlik doğrulama mekanizması yoktur. Bu nedenle, kullanıcıların ilk bağlantı aşaması olan HTTP el sıkışma işlemi sırasında kimlik doğrulaması yapılması gerekir. Çerezler, oturumlar ve JWT (JSON Web jetonu) gibi kanıtlanmış yöntemler kullanılabilir. |
Tüm girişleri sterilize edin ve doğrulayın | Müşterilerden alınan tüm veriler güvenilmez olarak kabul edilmelidir. XSS (siteler arası komut dosyası) ve SQL enjeksiyonu gibi enjeksiyon saldırılarını önlemek için sunucular tüm mesajlarda güçlü doğrulama ve veri dezenfekte etmelidir. |
Ortak güvenlik açıkları ve hafifletmeler
WebSocket ortamlarında yaygın olarak bulunan ana güvenlik açıkları ve bunların nasıl ele alınacağı:
Siteler arası WebSocket Kaçırma (CSWSH)
CSWSH, saldırganların kullanıcıların tarayıcılarını yetkisiz WebSocket bağlantıları kurmaya teşvik ettikleri bir saldırıdır. Bir kullanıcının doğrulanmış bir oturumu (örn. Çerezler) varsa, saldırganın kötü amaçlı sayfası, kullanıcının ayrıcalıklarını kullanarak sunucu ile iletişim kurabilir.
- Azaltma: Daha önce de belirtildiği gibi, sunucu.
Origin
El sıkışma isteklerinin başlığı ve yalnızca izin verilen kökenlerden gelen istekleri kabul edin.
// Example: Origin header validation in Node.js (ws library)
const allowedOrigins = ['https://hahwul.com', 'https://sub.hahwul.com'];
wsServer.on('request', (request) => {
const origin = request.origin;
if (!allowedOrigins.includes(origin)) {
// Reject the connection
request.reject();
console.log(`Connection from origin ${origin} rejected.`);
return;
}
// ... accept connection
});
Veri Enjeksiyon Saldırıları (XSS, SQLI)
WebSocket aracılığıyla iletilen veriler düzgün bir şekilde işlenmezse, sunucu veya diğer istemciler üzerinde kötü amaçlı etkileri olabilir. Örneğin, bir sohbet uygulamasında, bir kullanıcı tarafından gönderilen bir komut dosyası diğer kullanıcıların tarayıcılarında yürütülürse, bir XSS saldırısı meydana geldi.
- Azaltma: Sunucu, istemcilerden alınan tüm mesaj içeriğini doğrulamalı ve veritabanı sorgularında veya HTML çıktısında kullanmadan önce her zaman kaçmalı veya sterilize etmelidir. Güvenilmeyen verileri ele alırken daima dikkat edin.
Hizmet Reddi (DOS)
Saldırganlar, sayısız bağlantı oluşturarak veya büyük miktarda kaynak yoğun mesaj göndererek sunucu kaynaklarını tüketebilir. Bu, normal kullanıcıların hizmetlere erişimini bozar.
- Azaltma:
- Oran Sınırlama: IP adresi veya kullanıcı hesabı başına bağlantı sayısını ve mesaj iletim oranlarını kısıtlayın.
- Mesaj Boyutu Sınırları: Tampon taşmalarını veya kaynak atıklarını önlemek için anormal derecede büyük mesajları engelleyin.
Kimlik Doğrulama ve Yetkilendirme
WebSocket durumlu bir protokol olsa da, özetleme vatansız HTTP el sıkışma yoluyla gerçekleştirilmelidir.
sequenceDiagram participant Client participant Server Client->>Server: HTTP GET /chat (Upgrade: websocket) Note over Server: 1. Verify Origin Header Note over Server: 2. Authenticate User (e.g., via Cookie/JWT) alt Authentication/Origin Check Fails Server-->>Client: HTTP 401/403 Unauthorized else Authentication & Origin OK Server-->>Client: HTTP 101 Switching Protocols Note over Client,Server: WebSocket Connection Established Client-->>Server: WebSocket Message (JSON) Note over Server: 3. Validate & Sanitize Message Server-->>Client: WebSocket Message (Broadcast) end
Yaygın olarak kullanılan kimlik doğrulama yöntemleri şunları içerir:
- Çerez tabanlı kimlik doğrulama: WebSocket’i web uygulamasıyla aynı etki alanında çalıştırırken, tarayıcılar otomatik olarak kimlik doğrulama çerezleri gönderir. Sunucu, bu çerezleri doğrulayarak kullanıcıları tanımlayabilir.
- Token tabanlı kimlik doğrulama: İstemciler, sorgu parametreleri aracılığıyla veya ilk WebSocket mesajı olarak giriş sırasında elde edilen jetonlar (örn. JWT) gönderir. Sunucu, bağlantıya izin vermeden önce jetonun geçerliliğini doğrular.
// Token via query parameter
const socket = new WebSocket('wss://api.hahwul.com/ws?token=YOUR_JWT_TOKEN');
// Token as the first message
socket.onopen = () => {
socket.send(JSON.stringify({ type: 'auth', token: 'YOUR_JWT_TOKEN' }));
};
Jetonları sorgu parametreleri olarak göndermenin uygulanması kolaydır, ancak sunucu günlüklerinde potansiyel olarak jeton bırakmanın dezavantajına sahiptir. Tersine, bunları bağlantıdan sonra ilk mesaj olarak göndermek daha güvenlidir, ancak kimlik doğrulaması tamamlanana kadar diğer mesajları işlemekten kaçınmak için mantığın uygulanmasını gerektirir.
Çözüm
WebSocket, modern web uygulamalarında önemli bir unsur haline gelmiştir, ancak kolaylığının yanı sıra dikkate alınması gereken güvenlik sorunları. Zorunlu kullanımı wss://
doğrulanması Origin
Başlıklar, giriş verilerinin işlenmesi ve bu makalede tartışılan sağlam kimlik doğrulama mekanizmalarının uygulanması, güvenli bir WebSocket ortamı oluşturmak için minimum gereksinimlerdir. Kırmızı takım perspektifinden bakıldığında, bu temel savunmalardan yoksun sistemler saldırılar için kolayca hedef haline gelebilir. Bu nedenle, erken gelişim aşamalarından gelen güvenlik göz önünde bulundurularak tasarım yapmak çok önemlidir.