- Konu sahibi
- #1
SRI nedir?
SRI (Subresource Integrity), başka bir alan adından yüklenen JavaScript dosyasının beklediğiniz dosyayla aynı olup olmadığını tarayıcıya doğrulatır. Bunun için
script etiketine dosyanın kriptografik özeti integrity özniteliğiyle eklenir. Tarayıcı indirdiği dosyanın özetini bu değerle karşılaştırır; eşleşme yoksa dosyayı çalıştırmaz.Bu koruma, CDN hesabı veya dağıtım sunucusu değiştirilerek JavaScript içine zararlı kod eklenmesi gibi durumlarda etkilidir. SRI yalnızca dosyanın beklenen içerikle aynı olduğunu denetler; dosyayı sunan alan adının güvenilirliğini, sitenizin HTTPS yapılandırmasını veya JavaScript'in ne yaptığını tek başına garanti etmez.
Nasıl çalışır?
Bir üçüncü taraf dosyası için genellikle
sha256, sha384 veya sha512 algoritmalarından biriyle özet üretilir. Bu özet Base64 biçiminde integrity değerine yazılır. Tarayıcı dosyanın gerçek yanıt gövdesini özetler; içerik baytlarının değişmesi özetin eşleşmemesine yol açar. Sıkıştırma HTTP katmanında çözüldükten sonraki temsil önemlidir; dosyayı düzenleyen bir derleme/dağıtım adımı varsa son sunulan içerikle doğrulayın.Başka bir alan adından gelen dosyada
crossorigin="anonymous" kullanmak da doğru uygulamadır. Sunucunun dosyayı anonim çapraz kaynak isteğine izin verecek şekilde sunması gerekir. CORS yanıtı uygun değilse tarayıcı dosyayı doğrulayamayıp yüklemeyebilir.Uygulanabilir örnek
Ön koşul: Aşağıdaki komutlar curl ve OpenSSL kurulu POSIX kabuk içindir. Adresteki example.com temsili olduğundan gerçek, sürümü sabit resmî dosya URL'sini kullanın. Önce yayımlanacak dosyayı indirin. Dosya indirildikten sonra aşağıdaki komutla SHA-384 özetini üretin:
Kod:
curl -fsSL 'https://cdn.example.com/library.js' -o library.js
openssl dgst -sha384 -binary library.js | openssl base64 -A
Komutun çıktısını
sha384- önekiyle birleştirin. Örneğin çıktı ORNEK_BASE64_OZET ise HTML etiketi şu yapıda olur:
Kod:
<script
src="https://cdn.example.com/library.js"
integrity="sha384-ORNEK_BASE64_OZET"
crossorigin="anonymous"
defer></script>
Buradaki özet gerçek dosyadan üretilmelidir; örnekteki değer kopyalanacak geçerli bir özet değildir. Dosyayı sağlayan hizmet kendi SRI değerini yayımlıyorsa, indirme sırasında değişme ihtimaline karşı değeri güvenilir resmî kaynaktan alın ve dosyanın aynı sürümüne ait olduğunu kontrol edin.
Başarılı durumda tarayıcı dosyayı yükler ve sayfadaki JavaScript normal şekilde çalışır. Geliştirici araçlarının Console bölümünde bütünlük hatası görürseniz önce indirilen dosyanın değişip değişmediğini, farklı bir sürüm sunulup sunulmadığını ve
integrity değerinin doğru algoritma ile üretildiğini kontrol edin. Hash eşleşmiyorsa integrity özniteliğini kaldırmak yerine doğru dosya sürümünü ve doğru özeti yeniden doğrulayın.SRI kararını verirken
Aşağıdaki ayrım, SRI'nin ne zaman uygun olduğunu gösterir:
| Durum | SRI kararı | Gerekçe |
|---|---|---|
| Sürümü sabitlenmiş, nadiren değişen CDN dosyası | Kullan | Beklenen içerik sabittir ve değişiklik fark edilir. |
| Her istekte içeriği değişen veya kişiselleştirilen dosya | Uygun değil | Statik özet değişken yanıtla eşleşmez. |
| Kendi sunucunuzdaki dosya | İsteğe bağlı | SRI kullanılabilir; ancak üçüncü taraf kaynağı riskini azaltma amacı daha sınırlıdır. |
SRI kullandığınız dosyayı güncellediğinizde yeni dosyanın özeti de değişir. Bu nedenle dosya yükseltmesiyle birlikte HTML içindeki
integrity değerini de yenileyin; eski özeti korursanız tarayıcı yeni dosyayı engeller. Birden fazla alternatif kaynak tanımlanıyorsa integrity içindeki hash seçeneklerinin nasıl değerlendirileceğini ayrıca test edin; en basit ve denetlenebilir yapı, tek bir sabit sürüm ve tek bir doğrulanmış özet kullanmaktır.Olumlu testte doğru özetle dosyanın çalıştığını doğrulayın. Olumsuz test için kontrollü test dosyasında bir baytı değiştirip özeti sabit bırakın: tarayıcının çalıştırmayı engellemesi beklenir. Canlı bağımlılık üzerinde deneme yapmayın. Üst HTML de saldırganca değiştirilebiliyorsa saldırgan özeti de değiştirebilir; SRI bu durumu tek başına çözmez.
Sık yapılan hatalar
Dosyanın adresini hash'lemek: Özet URL'den değil, JavaScript yanıtının gerçek baytlarından üretilir.
Sürüm değiştiği hâlde eski özeti bırakmak: Bu durumda dosyanın yüklenmemesi beklenen bir güvenlik davranışıdır.
Dinamik dosyaya sabit SRI eklemek: Sunucu her istekte farklı içerik üretiyorsa sabit özet kullanılamaz. İçeriği sabitleyin veya bu kaynak için farklı bir dağıtım yaklaşımı seçin.
SRI'yi tek güvenlik katmanı sanmak: SRI, yalnızca belirli bir kaynağın içeriğinin değişmediğini doğrular; bağımlılığın güvenli tasarımı, güncelleme süreci ve sunucu güvenliği yine ayrıca ele alınmalıdır.
Sık sorulan sorular
SRI kullanmak JavaScript dosyasını şifreler mi?
Hayır. SRI şifreleme yapmaz; dosyanın bütünlüğünü, yani beklenen içerikle aynı olup olmadığını doğrular. Aktarım güvenliği için HTTPS gerekir.
SRI doğrulaması başarısız olursa dosya neden çalışmaz?
Tarayıcı, indirilen içeriğin belirtilen özetle eşleşmediğini gördüğünde dosyayı güvenlik amacıyla çalıştırmaz. Önce dosya sürümünü, gerçek yanıtı ve hash üretim yöntemini karşılaştırın.