jekcms'te İçerik Güvenlik Politikası (CSP): Ne Gönderiliyor, Nasıl Sıkılaştırılır

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'te İçerik Güvenlik Politikası (CSP): Ne Gönderiliyor, Nasıl Sıkılaştırılır, jekcms blog kapağı

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çin X-Frame-Options: SAMEORIGIN baş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:

  1. 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.
  2. 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:

  1. Önce yalnızca raporlayın. Yeni politikayı Content-Security-Policy-Report-Only başlığıyla ve kendi kontrol ettiğiniz bir adrese giden report-uri ile 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.
  2. Gerçekten kullandığınız kaynakları yazın. Raporlara göre style-src, img-src, font-src, connect-src ve frame-src yönergelerini doldurun, en son default-src 'self' ekleyin.
  3. Yazı tiplerini kendi sunucunuzdan verin. Hazır temalar yazı tiplerini Google Fonts'tan yüklüyor. Yazı tiplerini sitenizden sunarsanız fonts.googleapis.com ve fonts.gstatic.com izinlerine gerek kalmaz, ziyaretçinin bilgisi de üçüncü bir tarafa gitmez.
  4. 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-src yö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.

Yazar

Celil Uyanıkoğlu

25 yılı aşkın süredir bilgi işlem sektöründe çalışan bir bilgisayar mühendisi. jekcms'i geliştiriyor ve kendi yayın ağındaki sitelerin tamamını jekcms üzerinde çalıştırıyor - burada yayımlanan her rehber önce o canlı kurulumlarda denenir.

Tüm yazılarını gör →

Lisansınızı Seçin

İlk yıl indirimli yıllık lisans; güncelleme ve destek dahil. Kurulum 30 dakika.

Fiyatlara Bak
  • 30 dakikada kurulum ve yayın
  • 14 profesyonel tema
  • AVIF/WebP görsel optimizasyonu
  • Otomatik SEO - Sitemap, Schema.org
  • ZeroTrack çerezsiz analitik

Yeniliklerden ilk sen haberdar ol

Yeni özellikler, sürüm notları ve CMS rehberleri. Ayda birkaç e-posta gönderiyoruz.