jekcms'in varsayılan olarak gönderdiği CSP başlığı neyi kısıtlıyor, neyi bilerek açık bırakıyor ve kendi sitenizde politikayı nasıl adım adım daraltabilirsiniz.
jekcms kurulumla birlikte bir İçerik Güvenlik Politikası (CSP) başlığı gönderiyor. Bu politika her şeyi kilitleyen katı bir şablon değil. Asıl tehlikeli olan şeyi, yani sayfada hangi kaynaklardan script çalışabileceğini kısıtlıyor; geri kalanını bilerek açık bırakıyor. Bu yazıda başlığın içinde ne olduğunu, neden böyle kurulduğunu ve kendi sitenizde nasıl daraltabileceğinizi anlatıyoruz.
Varsayılan Başlık
Başlık kök dizindeki .htaccess dosyasından gönderiliyor. Okunabilsin diye satırlara bölünmüş hâli:
Content-Security-Policy:
base-uri 'self';
object-src 'none';
frame-ancestors 'self';
script-src 'self' 'unsafe-inline'
https://*.googlesyndication.com https://*.google.com
https://*.google-analytics.com https://*.googletagmanager.com
https://*.googleadservices.com https://*.googleapis.com
https://*.gstatic.com https://*.doubleclick.net
https://news.google.com https://*.adtrafficquality.google
https://fundingchoicesmessages.google.com
https://cdn.jsdelivr.net https://cdnjs.cloudflare.com
https://connect.facebook.net https://static.cloudflareinsights.com
base-uri 'self': Sayfaya sızdırılan bir<base>etiketinin göreli adresleri başka bir alan adına yönlendirmesini engelliyor.object-src 'none': Flash ve benzeri eklenti içeriklerini tamamen kapatıyor.frame-ancestors 'self': Sitenin başka bir sitede çerçeve içinde açılmasını, yani tıklama tuzaklarını engelliyor. Aynı iş içinX-Frame-Options: SAMEORIGINbaşlığı da gönderiliyor.script-src: Script'ler yalnızca sitenin kendisinden ve listedeki alan adlarından yüklenebiliyor.
Neden default-src Yok
Başlıkta default-src bilerek yer almıyor. Bu yönerge, ayrıca tanımlanmamış bütün kaynak türleri (yazı tipleri, görseller, bağlantılar, çerçeveler) için varsayılan kural oluyor. default-src 'self' eklenirse Google Fonts, ödeme sayfaları, Google ile giriş pencereleri ve analiz istekleri, her biri ayrıca izin listesine alınmadıkça çalışmaz. Her sitenin kullandığı servisler farklı olduğu için tek bir hazır liste herkese uymuyor. Varsayılan politika bu yüzden XSS saldırılarında asıl zararı veren script çalıştırmayı kısıtlıyor ve diğer kaynak türlerini site sahibine bırakıyor.
unsafe-inline Neden Duruyor
script-src içinde 'unsafe-inline' var ve bu da bilinçli bir karar. İki nedeni var:
- Paneldeki özel başlık kodu ayarı, site sahibinin yapıştırdığı doğrulama ve izleme kodlarını sayfaya olduğu gibi basıyor. Bu kodlar tek kullanımlık bir anahtarla (nonce) işaretlenemiyor; işaretlemeye kalkmak bu özelliği bozar.
- Temalarda ve çekirdek şablonlarda satır içi script'ler var.
Nonce tabanlı bir politikaya geçmek için önce bu ikisinin çözülmesi gerekiyor. Bu, yapılacaklar listesinde açık bir iş.
Başlıkta 'unsafe-eval' ise yok. jekcms'in kendi kodu da, panelin kullandığı kütüphaneler de, Google ve Facebook'un reklam ve analiz script'leri de eval() gerektirmiyor.
Google Alan Adlarındaki Joker Karakterler
Listedeki Google alan adları *.google.com biçiminde. AdSense, Analytics ve Tag Manager script'leri zaman içinde yeni alt alan adlarından yükleniyor ve tek tek yazılmış bir liste bir süre sonra reklamları sessizce bozabiliyor. Joker karakter bu bakım yükünü kaldırıyor, karşılığında da izin verilen alanı genişletiyor. Sitenizde reklam ve analiz yoksa bu alan adlarını kendi politikanızdan çıkarabilirsiniz.
Kendi Sitenizde Daraltmak
Politikayı sıkılaştırmak istiyorsanız şu sırayla ilerleyin:
- Önce yalnızca raporlayın. Yeni politikayı
Content-Security-Policy-Report-Onlybaşlığıyla ve kendi kontrol ettiğiniz bir adrese gidenreport-uriile gönderin. jekcms'te ihlalleri toplayan hazır bir uç nokta yok. En az bir hafta bekleyin; hafta sonu trafiği farklı sayfaları çalıştırabiliyor. - Gerçekten kullandığınız kaynakları yazın. Raporlara göre
style-src,img-src,font-src,connect-srcveframe-srcyönergelerini doldurun, en sondefault-src 'self'ekleyin. - Yazı tiplerini kendi sunucunuzdan verin. Hazır temalar yazı tiplerini Google Fonts'tan yüklüyor. Yazı tiplerini sitenizden sunarsanız
fonts.googleapis.comvefonts.gstatic.comizinlerine gerek kalmaz, ziyaretçinin bilgisi de üçüncü bir tarafa gitmez. - Paneli de test edin. Yönetim paneli ön yüzden farklı script'ler yüklüyor (editör, medya seçici). Yalnızca ön yüzü kontrol edip bırakmayın.
Başlığı .htaccess dosyasında değiştirirseniz bir jekcms güncellemesinin bu dosyayı yenileyebileceğini unutmayın. Değişikliğinizi ayrıca saklayın.
Sık Yapılan Hatalar
- Bir kütüphane
eval()kullandığı için'unsafe-eval'eklemek. Mümkünse başka bir kütüphane seçin. img-src https:gibi her HTTPS kaynağına izin veren kısayollar kullanmak. Bu, görsel yönergesini anlamsız hâle getiriyor.connect-srcyönergesini unutmak. AJAX istekleri sessizce bozuluyor ve panelde bazı ekranlar çalışmıyor.- Raporlama aşamasını atlayıp politikayı doğrudan zorunlu hâle getirmek.