SRI Nedir?
Web Güvenliğinde Kritik Bir Katman: Subresource Integrity (SRI)
Giriş
Modern web geliştirme süreçlerinde, performans ve ölçeklenebilirlik adına JavaScript kütüphaneleri, CSS dosyaları ve yazı tipleri sıklıkla İçerik Dağıtım Ağları (CDN) üzerinden çağrılır. Ancak bu yaklaşım, uygulamanın güvenliğini üçüncü taraf bir sağlayıcının güvenliğine bağımlı hale getirir. Subresource Integrity (SRI), bu bağımlılıktan doğan güvenlik risklerini minimize etmek için geliştirilmiş bir güvenlik standardıdır.
SRI Nedir ve Neden Gereklidir?
SRI, bir web tarayıcısının, yüklediği kaynağın (dosyanın) beklenmedik bir şekilde değiştirilmediğini doğrulamasını sağlayan bir mekanizmadır. Tedarik Zinciri Saldırıları (Supply Chain Attacks) Eğer kullandığınız bir CDN sunucusu siber saldırıya uğrar ve barındırdığı popüler bir kütüphanenin (örneğin jQuery veya Bootstrap) içine kötü amaçlı kod (malware/cryptojacker) yerleştirilirse, bu kütüphaneyi kullanan tüm web siteleri otomatik olarak enfekte olur. SRI, dosya içeriği bir bit bile değişse bunu fark eder ve kodun çalışmasını durdurur.
Tedarik Zinciri Saldırıları (Supply Chain Attacks)
Eğer kullandığınız bir CDN sunucusu siber saldırıya uğrar ve barındırdığı popüler bir kütüphanenin (örneğin jQuery veya Bootstrap) içine kötü amaçlı kod (malware/cryptojacker) yerleştirilirse, bu kütüphaneyi kullanan tüm web siteleri otomatik olarak enfekte olur. SRI, dosya içeriği bir bit bile değişse bunu fark eder ve kodun çalışmasını durdurur.
Çalışma Mekanizması
SRI sistemi, kriptografik özetleme (hashing) prensibine dayanır:
1. Özet Oluşturma: Geliştirici, orijinal dosyanın içeriğinden bir hash değeri (SHA-256, SHA-384 veya SHA512) üretir.
2. Entegrasyon: Bu hash değeri, HTML içindeki <script> veya <link> etiketine integrity özniteliği olarak eklenir.
3. Tarayıcı Doğrulaması:
- Tarayıcı dosyayı uzak sunucudan indirir.
- İndirilen dosyanın hash değerini anlık olarak hesaplar.
- Hesaplanan değer ile HTML'deki integrity değeri karşılaştırılır.
- Eşleşme Sağlanırsa: Dosya yürütülür.
- Eşleşme Sağlanmazsa: Tarayıcı dosyayı reddeder ve konsolda bir ağ hatası (network error) gösterir.
Uygulama ve Kod Örnekleri
Bir kaynağı SRI ile korumak için iki temel özniteliğe ihtiyaç vardır: integrity ve crossorigin.
Örnek Kullanım:
<script src="https://jquery.com"
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"></script>
-
integrity: Kriptografik algoritmanın adıyla başlayan (örneğin sha256-) ve base64 ile kodlanmış hash değeridir.
-
crossorigin: Tarayıcının, kaynağı başka bir domainden çekerken CORS (Cross-Origin Resource Sharing) kurallarına uygun hareket etmesini sağlar. anonymous değeri genellikle yeterlidir.
SRI Hash Değeri Nasıl Oluşturulur?
SRI hash değerlerini manuel olarak oluşturmak için farklı yöntemler kullanılabilir:
-
Online Araçlar: srihash.org gibi platformlar üzerinden URL girerek hızlıca oluşturulabilir.
-
Komut Satırı (OpenSSL): cat dosya.js | openssl dgst -sha384 -binary | openssl base64 -A
-
Build Araçları: Webpack veya Gulp gibi araçlar, build sürecinde bu değerleri otomatik olarak üreten eklentilere sahiptir.
Dikkat Edilmesi Gereken Noktalar ve Sınırlamalar
-
Sürüm Güncellemeleri: Dosya güncellendiğinde (örneğin kütüphane sürümü yükseltildiğinde) hash değeri de değişir. Eski hash değeriyle yeni dosya çalışmayacaktır.
-
CORS Gereksinimi: SRI'nın çalışması için sunucunun Access-Control-Allow-Origin başlığını göndermesi şarttır.
-
Yedek Plan (Fallback): CDN üzerinden yükleme başarısız olursa (SRI hatası dahil), yerel bir kopyanın yüklenmesi için küçük bir JavaScript kontrolü (fallback script) eklemek iyi bir pratiktir.
Sonuç
Subresource Integrity, modern web uygulamaları için "opsiyonel" değil, "temel" bir güvenlik gereksinimidir. Üçüncü taraf risklerini yönetmek ve kullanıcı verilerini korumak adına, harici tüm kaynakların SRI ile doğrulanması kurumsal güvenlik politikalarımızın bir parçası olmalıdır.