Güvenlik başlıkları ve HTTPS
Güvenlik başlıkları, sunucunun her yanıtla birlikte tarayıcıya gönderdiği kısa talimatlardır: "bu siteye yalnızca HTTPS ile bağlan", "bu sayfayı başka sitelerin çerçevesinde gösterme", "yalnızca şu kaynaklardan betik çalıştır". Kodunuzu değiştirmeden, birkaç satır yapılandırmayla eklenirler ve tarayıcının yerleşik korumalarını devreye sokarlar.
Başlıklar koddaki açıkları kapatmaz; hata yapıldığında zararı sınırlayan ikinci katmandır. Bu rehber önce HTTPS'in zorunlu kılınmasını, sonra her başlığın ne işe yaradığını ve Apache'de nasıl tanımlandığını anlatır. SSL'in ne olduğu için SSL nedir? rehberine bakın.
Örnekler Apache 2.4 ve mod_headers içindir. Başlıkları eklemeden önce bir test ortamında ya da düşük trafikli bir saatte deneyin; özellikle HSTS ve CSP yanlış ayarlanırsa siteyi erişilemez ya da bozuk gösterebilir.
Dört adımda uygulama
-
Tüm trafiği HTTPS'e yönlendirin
Sertifika kurulduktan sonra sitenin
http://adresi açık kalırsa ziyaretçiler şifresiz bağlanmaya devam edebilir. Tüm istekleri kalıcı (301) yönlendirmeyle HTTPS'e gönderin.RewriteEngine On # Doğrudan sunucuya gelen istekler için RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # CDN / ters vekil arkasındaysanız yukarıdaki koşul yerine: # RewriteCond %{HTTP:X-Forwarded-Proto} =http # RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]Siteniz bir CDN ya da ters vekil sunucunun (ör. Cloudflare) arkasındaysa sunucunuz isteği HTTP olarak görebilir ve bu kural sonsuz yönlendirmeye yol açabilir. Bu durumda yönlendirmeyi CDN panelinden yapın ya da koşulda
X-Forwarded-Protobaşlığını kullanın.
-
Temel başlıkları ekleyin
Aşağıdaki blok, hemen her site için güvenle eklenebilecek başlıkları içerir.
.htaccessdosyasının web kökündeki kopyasına ekleyin.<IfModule mod_headers.c> # Yalnız HTTPS yanıtlarında: tarayıcı bu siteye hep HTTPS ile bağlansın. # Önce max-age=300 ile deneyin, sorun yoksa 31536000 (1 yıl) yapın. Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" "expr=%{HTTPS} == 'on'" # Dosya türünü tahmin etme Header always set X-Content-Type-Options "nosniff" # Başka sitelerin çerçevesinde gösterilme Header always set X-Frame-Options "SAMEORIGIN" # Başka sitelere yalnız alan adı gitsin Header always set Referrer-Policy "strict-origin-when-cross-origin" # Kullanılmayan tarayıcı özelliklerini kapat Header always set Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=()" </IfModule>
-
CSP'yi raporlama modunda başlatın
Content-Security-Policy en güçlü ama en dikkat isteyen başlıktır. Önce
Content-Security-Policy-Report-Onlyadıyla ekleyin: hiçbir şey engellenmez, ihlaller tarayıcı konsolunda görünür. İhlalleri giderdikten sonra uygulamaya geçin.
-
Sonucu doğrulayın
Tarayıcının geliştirici araçlarında Ağ sekmesinden sayfa isteğini seçip yanıt başlıklarına bakın ya da komut satırından başlıkları isteyin. Başlıkların yalnızca ana sayfada değil, hata sayfalarında ve alt sayfalarda da geldiğini kontrol edin.
# Yanıt başlıklarını göster (kendi alan adınızla) curl -sI https://www.ornek-site.com/ # HTTP adresinin HTTPS'e yönlendiğini doğrula curl -sI http://www.ornek-site.com/ | grep -i -E "^(HTTP|location)"
Belirtiler: eksik başlık nasıl fark edilir?
- Sitenin
http://adresi HTTPS'e yönlenmeden açılıyor. - Tarayıcı konsolunda "karışık içerik" (mixed content) uyarıları var: HTTPS sayfa, HTTP üzerinden görsel ya da betik yüklüyor.
- Yanıt başlıklarında
Strict-Transport-Security,X-Content-Type-Optionsya daContent-Security-Policyyok. - Siteniz başka bir sitenin içinde çerçeve (iframe) olarak açılabiliyor.
- Yanıtta
X-Powered-Byya da ayrıntılıServerbaşlığı sürüm bilgisi veriyor.
Başlıkların ayrıntısı
Strict-Transport-Security (HSTS)
Tarayıcıya, belirtilen süre boyunca bu alan adına yalnızca HTTPS ile bağlanmasını söyler. Kullanıcı adresi http:// ile yazsa bile tarayıcı isteği göndermeden HTTPS'e çevirir; böylece ilk istekteki şifresiz anın araya girilerek kötüye kullanılması önlenir.
- Yalnızca HTTPS yanıtlarında gönderilmelidir.
- Önce kısa bir süreyle (ör.
max-age=300) deneyin; sorun yoksa bir yıla (31536000) çıkarın. includeSubDomains, tüm alt alan adlarını kapsar. Eklemeden önce HTTPS desteklemeyen alt alan adınız olmadığından emin olun.preload, alan adının tarayıcıların yerleşik listesine alınması içindir ve geri dönüşü zordur; emin olmadan eklemeyin.
X-Content-Type-Options
nosniff değeri, tarayıcının bir dosyanın türünü içeriğine bakarak tahmin etmesini engeller. Örneğin görsel olarak yüklenmiş bir dosyanın betik gibi yorumlanmasını önler. Yan etkisi yok denecek kadar azdır; her sitede açık olmalıdır.
X-Frame-Options ve frame-ancestors
Sitenizin başka bir sitenin çerçevesi içinde gösterilmesini engeller. Bu, görünmez bir çerçeve üzerinden kullanıcıya fark ettirmeden tıklama yaptırılmasına (clickjacking) karşı korur. SAMEORIGIN yalnızca kendi sitenizin çerçevelemesine izin verir. Güncel karşılığı CSP'nin frame-ancestors yönergesidir; ikisini birlikte göndermek eski ve yeni tarayıcıları kapsar.
Referrer-Policy
Ziyaretçi sitenizden başka bir siteye geçtiğinde tarayıcının hangi adres bilgisini ileteceğini belirler. strict-origin-when-cross-origin dengeli bir değerdir: başka sitelere yalnızca alan adınız gider, sayfa yolu ve parametreler gitmez.
Permissions-Policy
Sayfanın ve içine gömülen çerçevelerin kamera, mikrofon, konum gibi tarayıcı özelliklerini kullanıp kullanamayacağını belirler. Kullanmadığınız özellikleri kapatmak, sayfaya karışan yabancı bir betiğin bunları istemesini engeller. Sitenizde harita ya da konum özelliği varsa ilgili izni kendi kaynağınız için açık bırakın.
Content-Security-Policy adım adım
CSP, sayfanın hangi kaynaklardan içerik yükleyebileceğini tanımlar. Başlıca yönergeler:
default-src: Diğer yönergelerde belirtilmeyen türler için varsayılan kaynak.script-src: Betiklerin yüklenebileceği kaynaklar. XSS'e karşı asıl korumayı bu sağlar.style-src,img-src,font-src,connect-src: Stil, görsel, yazı tipi ve arka plan istekleri.frame-ancestors: Sayfayı kimlerin çerçeveleyebileceği.object-src 'none'vebase-uri 'self': Eski eklenti içeriklerini ve<base>etiketinin değiştirilmesini engeller.form-action: Formların gönderilebileceği adresler.
Başlangıç için raporlama modunda bir politika:
<IfModule mod_headers.c>
Header always set Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'"
</IfModule>
Konsoldaki ihlallere göre politikayı düzenleyin: kullandığınız harici kaynakları (yazı tipi, analiz, harita) ilgili yönergeye tek tek ekleyin. Satır içi betikleri ve onclick gibi olay özniteliklerini ayrı dosyalara taşımak, script-src yönergesinden 'unsafe-inline' değerini çıkarabilmenizi sağlar; CSP'nin XSS'e karşı gerçek değeri budur. İhlaller bittiğinde başlığı uygulama moduna alın:
<IfModule mod_headers.c>
# İhlaller giderildikten sonra: aynı politika, bu kez uygulanır
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'"
</IfModule>
Taşınamayan satır içi betikler için her yanıtta yeniden üretilen bir nonce değeri kullanılabilir; bu durumda başlık PHP tarafından gönderilir.
<?php
// Her yanıtta yeni bir nonce üretilir
$nonce = base64_encode(random_bytes(16));
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-$nonce'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'");
?>
<script nonce="<?= htmlspecialchars($nonce, ENT_QUOTES, 'UTF-8') ?>">
// Yalnız bu nonce değerini taşıyan satır içi betikler çalışır
document.documentElement.classList.add('js');
</script> Sürüm bilgisini azaltın
Yanıt başlıklarında PHP ve sunucu sürümünün görünmesi tek başına bir açık değildir, ancak otomatik taramalara gereksiz bilgi verir. PHP için expose_php = Off ayarı X-Powered-By başlığını kaldırır. Apache'nin Server başlığındaki ayrıntı sunucu yapılandırmasındaki ServerTokens ile azaltılır; paylaşımlı barındırmada bu ayar sağlayıcıdadır.
<IfModule mod_headers.c>
Header always unset X-Powered-By
Header unset X-Powered-By
</IfModule>
# php.ini ya da .user.ini içinde:
# expose_php = Off
Asıl koruma sürümü gizlemek değil, güncel tutmaktır.
Sık yapılan hatalar
- HSTS'yi uzun süreyle ve denemeden açmak: Sertifika sorunu çıktığında ziyaretçiler siteye hiç giremez; süre dolana kadar geri alınamaz.
- CSP'de her şeye izin vermek:
script-src * 'unsafe-inline' 'unsafe-eval'gibi bir politika koruma sağlamaz. - Başlıkları yalnızca PHP'de göndermek: Görsel, hata sayfası ve statik dosyalarda başlık gelmez. Sunucu yapılandırmasında tanımlamak daha kapsayıcıdır.
- Karışık içerik bırakmak: Şablonlarda ve veritabanındaki içerikte
http://ile başlayan kendi adreslerinizihttps://yapın. - Çerezleri unutmak: HTTPS'e geçtikten sonra oturum çerezine
Securebayrağını ekleyin. Bkz. Giriş ve oturum güvenliği.
Kontrol listesi
- HTTP istekleri 301 ile HTTPS'e yönleniyor; yönlendirme döngüsü yok.
- Sertifika geçerli ve otomatik yenileniyor.
- Karışık içerik uyarısı yok.
- HSTS kısa süreyle denendi, sonra uzatıldı.
X-Content-Type-Options: nosnifftanımlı.- Çerçeveleme
X-Frame-Optionsveframe-ancestorsile sınırlı. Referrer-PolicyvePermissions-Policytanımlı.- CSP en az raporlama modunda; ihlaller inceleniyor.
- Başlıklar alt sayfalarda ve hata sayfalarında da geliyor.
Sık sorulan sorular
Başlıkları eklemek sitemi yavaşlatır mı?
Hayır. Başlıklar birkaç yüz baytlık metindir; ölçülebilir bir yavaşlama yaratmaz. HSTS, sonraki ziyaretlerde yönlendirme adımını atladığı için küçük bir hız kazancı bile sağlar.
X-XSS-Protection başlığını eklemeli miyim?
Güncel tarayıcılar bu başlığı desteklemeyi bıraktı; bazı durumlarda sorun da yaratabiliyordu. Yerine Content-Security-Policy kullanın.
.htaccess kullanamıyorum; ne yapabilirim?
Nginx gibi sunucularda aynı başlıklar sunucu yapılandırmasında add_header ile tanımlanır. Paylaşımlı barındırmada sağlayıcınızın panelinde ya da destek ekibinden yardım alarak ekleyebilirsiniz; CDN kullanıyorsanız başlıklar CDN panelinden de eklenebilir.
CSP yüzünden bir özellik bozuldu; ne yapmalıyım?
Tarayıcı konsolundaki ihlal mesajı hangi kaynağın hangi yönergeye takıldığını gösterir. O kaynağı ilgili yönergeye ekleyin ya da satır içi betiği ayrı dosyaya taşıyın. Bu yüzden önce raporlama modunda başlamak önemlidir.
BYK Yazılım Destek Ekibi
Bu rehber BYK Yazılım destek ekibi tarafından hazırlanır ve düzenli olarak gözden geçirilir. Son güncelleme: 04.10.2026.
İlgili rehberler
Web sitenizi birlikte gözden geçirelim
BYK Yazılım kurumsal web siteleri geliştirir. Sitenizle ilgili sorularınız için bize yazabilirsiniz.
Bize ulaşın Kurumsal web sitesi hizmetimiz