Sıkı CSP, Unsafe Eval’e izin vermez
İçindekiler tablosu
Bu ne anlama geliyor?
İçerik Güvenlik Politikası (CSP), tarayıcılara bir web sayfasında hangi tür kodların çalıştırılabileceğini belirten bir güvenlik politikasıdır. unsafe-eval yönergesi, özellikle JavaScript’in çalışma zamanında, örneğin eval() veya Function() yapıcı aracılığıyla dinamik olarak oluşturulup çalıştırılıp çalıştırılamayacağını kontrol eder. Unsafe-eval'i izin vermeyen katı bir CSP, tarayıcıda tam da bu tür dinamik kod yürütmesini engeller. Bu durum, yalnızca web sitesinin kendi kodunu değil, aynı zamanda çalışma zamanında içerik yükleyip yürüten harici araçları da etkiler; örneğin, istemci tarafındaki A/B test araçlarında olduğu gibi.
Oluşturma ve teslimat, `unsafe-eval` kullanılmadan da çalışıyor mu?
Hayır, deneylerin oluşturulması ve sunulması teknik olarak unsafe-eval olmadan mümkün değildir. Bunun nedeni, snippet’in işleyişinde yatmaktadır: Deneyler, sayfanın dağıtımı sırasında statik olarak eklenmez; bunun yerine çalışma zamanında snippet tarafından bir yapılandırma olarak çağrılır ve tarayıcıda bir JS motoru tarafından uygulanır. İşte bu özellik, müşteri tarafında yeni bir dağıtım yapılmasına gerek kalmadan kontrol panelinde bir deneyin oluşturulmasını veya düzenlenmesini mümkün kılar.
Ancak bir CSP, yalnızca önceden bildiği, sabit bir kaynak, bir hash veya bir nonce aracılığıyla kodlara izin verebilir. Bu yöntemlerin hiçbiri, sayfa yüklendikten sonra birleştirilen içerikler için işe yaramaz. Tarayıcının bu kodu yine de çalıştırabilmesi için eval() veya Function() yapıcıya ihtiyaç vardır; yani tam da unsafe-eval'in kontrol ettiği şeylere. Hedefleme mantığı ve içerik değişiklikleri aynı motor üzerinden yürütüldüğünden, yalnızca basit denemeler (metin, CSS, resimler) için etkinleştirilebilecek ayrı bir “güvenli” yürütme yolu bulunmamaktadır.
Olası çözüm
Site genelinde unsafe-eval'e izin vermek yerine, CSP her bir rota için ayrı ayrı yapılandırılabilir. Özellikle katı gereksinimleri olan sayfalar (örneğin, oturum açma veya kimlik doğrulama akışları) katı kurallara tabi ve eval'den arındırılmış kalırken, unsafe-eval yalnızca gerçekten denemelerin gerçekleştirilmesi gereken sayfalarda izin verilir.