Blog’a Dön

HTTP Güvenlik Başlıkları: HSTS, CSP ve Diğerleri

HTTP güvenlik başlıkları nedir? HSTS, Content-Security-Policy, X-Content-Type-Options ve Referrer-Policy, Nginx ve .htaccess ile ekleme ve test.

Nodesty Ekibi5 dk okumaGüvenlik
Koyu Nodesty arka planında Security Headers yazısı ile HSTS, CSP ve nosniff ifadeleri

HTTP güvenlik başlıkları, web sunucunuzun her sayfayla birlikte gönderdiği ve tarayıcıya sayfayı nasıl güvenli şekilde işleyeceğini söyleyen kurallardır. Sitenin yalnızca HTTPS ile açılmasını zorunlu kılmak, sayfanın başka sitelerde gizlice çerçeve içinde gösterilmesini engellemek ve izin verilmeyen betiklerin çalışmasını durdurmak gibi korumalar, birkaç satırlık ayarla eklenir.

Bu rehberde en önemli güvenlik başlıklarını, her birinin ne işe yaradığını, Nginx ve .htaccess ile nasıl ekleneceklerini, Content-Security-Policy'yi siteyi bozmadan uygulamayı ve başlıkları test etmeyi anlatıyoruz.

Önerilen başlıklar

BaşlıkNe yapar?Örnek değer
Strict-Transport-SecurityTarayıcının siteyi yalnızca HTTPS ile açmasını sağlar (HSTS)max-age=31536000; includeSubDomains
X-Content-Type-OptionsTarayıcının dosya türünü tahmin etmesini engellernosniff
X-Frame-OptionsSayfanın başka sitelerde çerçeve içinde açılmasını engellerSAMEORIGIN
Referrer-PolicyBaşka sitelere giden bağlantılarda hangi adres bilgisinin iletileceğistrict-origin-when-cross-origin
Permissions-PolicyKamera, mikrofon ve konum gibi tarayıcı özelliklerini kısıtlarcamera=(), microphone=(), geolocation=()
Content-Security-PolicyHangi kaynaklardan betik, stil ve görsel yüklenebileceğini belirlerSiteye özel

HSTS: Strict-Transport-Security

HSTS, tarayıcıya sitenizi belirli bir süre boyunca yalnızca HTTPS ile açmasını söyler. Kullanıcı adresi http:// ile yazsa ya da eski bir bağlantıya tıklasa bile tarayıcı doğrudan HTTPS'e geçer; bu, bağlantının ilk anında araya girilmesini zorlaştırır.

Strict-Transport-Security: max-age=31536000; includeSubDomains
  • max-age: Kuralın saniye cinsinden geçerlilik süresi. 31536000 bir yıldır.
  • includeSubDomains: Kuralı bütün alt alan adlarına uygular. HTTPS'i olmayan bir alt alan adınız varsa bu seçeneği eklemeyin.

Dikkat: Tarayıcılar HSTS kuralını max-age boyunca hatırlar. Önce kısa bir süreyle (örneğin max-age=300) deneyin, sitenizin ve alt alan adlarınızın her yerinde HTTPS'in çalıştığından emin olduktan sonra süreyi uzatın. Tarayıcılara gömülü HSTS listesine eklenmeyi sağlayan preload seçeneği geri alınması zor bir adımdır; ne yaptığınızdan emin değilseniz kullanmayın. SSL kurulumunu SSL sertifikası nedir? yazımızda anlattık.

X-Content-Type-Options, X-Frame-Options ve Referrer-Policy

Bu üç başlık neredeyse her siteye risksiz eklenebilir:

  • X-Content-Type-Options: nosniff: Tarayıcının bir dosyanın türünü tahmin etmeye çalışmasını engeller; örneğin bir görsel gibi yüklenen bir dosyanın betik olarak çalıştırılmasını önler.
  • X-Frame-Options: SAMEORIGIN: Sayfanızın yalnızca kendi sitenizde çerçeve içinde açılmasına izin verir. Bu, sayfanızın görünmez bir çerçeveye yerleştirilip kullanıcıların farkında olmadan tıklatıldığı saldırıları (clickjacking) engeller. Sitenizin başka bir sitede gömülü gösterilmesi gerekiyorsa CSP'deki frame-ancestors ayarını kullanın.
  • Referrer-Policy: strict-origin-when-cross-origin: Başka sitelere giden bağlantılarda tam sayfa adresini değil, yalnızca alan adını iletir. Adreslerde oturum bilgisi ya da kişisel veri taşınıyorsa bunların sızmasını önler.

Permissions-Policy

Sitenizin kullanmadığı tarayıcı özelliklerini kapatır. Sitenize eklenen bir betik ele geçirilse bile kamera, mikrofon ya da konuma erişemez:

Permissions-Policy: camera=(), microphone=(), geolocation=()

Siteniz bu özelliklerden birini kullanıyorsa (örneğin bir mağaza bulucu için konum), ilgili özelliği listeden çıkarın ya da yalnızca kendi alan adınıza izin verin: geolocation=(self).

Content-Security-Policy (CSP)

CSP, en güçlü ama ayarlaması en dikkat isteyen başlıktır. Tarayıcıya hangi kaynaklardan betik, stil, yazı tipi, görsel ve bağlantı yüklenebileceğini söyler. İzin verilmeyen kaynaklar engellenir; bu, sitenize sızdırılan bir betiğin çalışmasını ya da veri göndermesini zorlaştırır.

Basit bir başlangıç kuralı:

Content-Security-Policy: default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'

Analiz, reklam, sohbet ya da ödeme araçları kullanıyorsanız bunların alan adlarını ilgili kurallara eklemeniz gerekir; aksi hâlde çalışmazlar.

CSP'yi siteyi bozmadan uygulamak:

  1. Kuralı önce Content-Security-Policy-Report-Only başlığıyla ekleyin. Bu modda tarayıcı hiçbir şeyi engellemez, yalnızca kuralı ihlal eden kaynakları konsola yazar.
  2. Sitenizin bütün sayfalarını gezin ve tarayıcı konsolundaki CSP uyarılarını not edin.
  3. Gerçekten ihtiyacınız olan kaynakları kurala ekleyin.
  4. Uyarı kalmadığında başlığı Content-Security-Policy olarak değiştirin.

Nginx'te başlık ekleme

Server block'unuza ekleyin:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
  • always: Başlığın hata sayfalarında da gönderilmesini sağlar.
  • Önemli bir tuzak: Nginx'te bir location bloğuna kendi add_header satırını eklerseniz, o blok üst seviyedeki bütün add_header satırlarını devralmayı bırakır. Önbellek başlığı gibi bir şey eklediğiniz location bloklarında güvenlik başlıklarını da tekrar yazın ya da başlıkları ortak bir dosyada toplayıp include ile ekleyin.

Ardından sudo nginx -t ve sudo systemctl reload nginx. Nginx'in temellerini Nginx kurulumu rehberimizde anlattık.

Web hostingde .htaccess ile ekleme

Apache ve LiteSpeed kullanan hostinglerde sitenin kök klasöründeki .htaccess dosyasına ekleyin:

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>

.htaccess dosyasındaki tek bir yazım hatası bütün sitenin 500 hatası vermesine yol açabilir; değişiklikten önce dosyanın yedeğini alın ve değişiklikten sonra sitenizi hemen kontrol edin. Hata alırsanız HTTP hata kodları yazımızdaki adımlara bakın.

Çerezler için güvenli ayarlar

Oturum çerezleri, güvenlik başlıkları kadar önemlidir. Uygulamanızın oturum çerezlerinde şu özelliklerin açık olduğundan emin olun:

  • Secure: Çerez yalnızca HTTPS bağlantılarında gönderilir.
  • HttpOnly: Çereze JavaScript ile erişilemez; sızdırılan bir betik oturum çerezini çalamaz.
  • SameSite=Lax (ya da Strict): Çerezin başka sitelerden gelen isteklerle gönderilmesini sınırlar.

WordPress, Laravel ve diğer yaygın yazılımlar bu ayarları HTTPS kullanıldığında çoğunlukla kendisi yapar; kendi uygulamanızı yazıyorsanız oturum ayarlarında kontrol edin.

Test etme

curl -I https://alanadiniz.com

Komut, sitenizin gönderdiği başlıkları listeler. Tarayıcıda F12 ile açılan geliştirici araçlarının Network sekmesinden de bir sayfanın cevap başlıklarını görebilirsiniz. securityheaders.com gibi test siteleri, adresinizi yazdığınızda eksik başlıkları ve önerileri listeler.

Güvenlik başlıkları bir korunma katmanıdır; güncel yazılım, güçlü şifreler ve düzenli yedekler yine temel korumadır. Kendi sunucunuz için genel güvenlik adımlarını Linux sunucu güvenliği kontrol listemizde anlattık.

Nodesty'de güvenlik başlıkları

Nodesty web hosting paketlerinde LiteSpeed web sunucusu .htaccess kurallarını destekler; güvenlik başlıklarını dosya yöneticisinden .htaccess dosyanıza ekleyebilir, ücretsiz SSL ile HSTS'yi güvenle kullanabilirsiniz. Imunify360 de zararlı istekleri sitenize ulaşmadan durdurur. Kendi web sunucunuzu AMD Ryzen 9 9950X VDS üzerinde yönetiyorsanız bütün başlıkları Nginx yapılandırmanızda dilediğiniz gibi tanımlayabilirsiniz.

Sıkça Sorulan Sorular

Güvenlik başlıkları sitemi hacklenmekten korur mu?

Tek başına hayır. Güvenlik başlıkları tarayıcıya ek kurallar vererek bazı saldırı türlerinin etkisini sınırlar; örneğin bir sayfanın başka bir sitede gizlice çerçeve içinde açılmasını ya da beklenmeyen betiklerin çalışmasını engeller. Güncel yazılım, güçlü şifreler ve yedekler yine temel korumadır.

HSTS açtıktan sonra geri dönebilir miyim?

Tarayıcılar HSTS kuralını max-age süresi boyunca hatırlar. Süreyi 0 yaparak kuralı kaldırabilirsiniz, ama bu yalnızca siteyi yeniden ziyaret eden tarayıcılarda etkili olur. Bu yüzden HSTS'yi önce kısa bir süreyle deneyin ve sitenizin her yerinde HTTPS'in sorunsuz çalıştığından emin olduktan sonra süreyi uzatın.

Content-Security-Policy sitemi bozabilir mi?

Evet. CSP, izin verilmeyen kaynaklardan betik, stil, yazı tipi ve görsel yüklenmesini engeller. Analiz, reklam ve sohbet araçları gibi dış kaynaklar listede yoksa çalışmaz. Önce Content-Security-Policy-Report-Only başlığıyla deneyip tarayıcı konsolundaki uyarılara göre kuralı genişletin.

X-XSS-Protection başlığını eklemeli miyim?

Hayır. Bu başlık eski tarayıcılarda kullanılan bir korumayı açıyordu ve güncel tarayıcılar onu desteklemiyor. XSS'e karşı asıl koruma, kullanıcı girdisinin doğru işlenmesi ve iyi ayarlanmış bir Content-Security-Policy'dir.

Web hostingde güvenlik başlıklarını nasıl eklerim?

Apache ve LiteSpeed kullanan hostinglerde site kök klasöründeki .htaccess dosyasına Header always set satırlarıyla ekleyebilirsiniz. WordPress'te bazı güvenlik eklentileri bu başlıkları ayarlarından eklemenizi de sağlar.

Başlıkların çalışıp çalışmadığını nasıl kontrol ederim?

Tarayıcının geliştirici araçlarında Network sekmesinden sayfanın cevap başlıklarına bakabilir, komut satırında curl -I ile başlıkları görebilir ya da securityheaders.com gibi bir test sitesine adresinizi yazarak eksik başlıkları listeleyebilirsiniz.

Nodesty

Yazar hakkında

Nodesty Ekibi · Altyapı ve Destek

Nodesty ekibi sunucularımızı, ağımızı ve DDoS korumamızı her gün işletir ve müşteri destek taleplerini 7/24 yanıtlar. Bu rehberler o deneyimden yazılır.

İlgili yazılar

Sunucunuzu şimdi başlatın.

Nodesty'nin üstün altyapısı ile projelerinizi özgürce inşa edin ve sınır tanımadan ölçeklendirin.

                                                                                                                                                                                                                            
                                                                                                                                                                                                                            
                                                                                                                                                                                                                            
                                                                                                                             ············································                                                   
                                                ··································································································..........···························                                     
                                       ················..........................................................................................................................··············                             
                                  ·············.................::::::::::::::::::::::::::::::::::::::::::::::....................:::::::::::::::::::::::::::::::::::::::................···········                        
                             ············................:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::............·········                     
                         ············.................:::::::::::::::::::::::::::::::::::::::::::::::::::------------::::::::::::::::::::::::::::::----------------:::::::::::::::::::::..........········                  
                    ············......................::::::::::::::::::::::::::::::::::::------------------------------------------------------------------------------------:::::::::::::.........········                
                ··········.............................................::::::::::::::::::-------------==========================================-----------------------------------:::::::::::........·······               
             ········..................:.....................................::::::::::--------=======+++++++++++++++++++++++++++++++++++++=========================------------------::::::::::.......·······              
           ······.........::::::::::::::::::::................................:::::::-----=====++++xxxxxx**************************xxxxxxxxx++++++++++++++===================------------::::::::.......·······             
          ·····.......:::::::::::::::::::::::::::.............................:::::----===+++xxx****%%%%&&&&&&#############&&&&&&&%%%%%*******xxxxxxxx++++++++++++++==============----------:::::::......······             
         ····......::::::::-------------:::::::::::..........................::::---===+++xx***%%%&&&####@@@@@@@@@@@@@@@@@@@@@@@@####&&&&&%%%%*******xxxxxxxxx+++++++++++++===========--------::::::......·····             
        ····.....:::::::--------------------:::::::::.......................::::---===++xxx**%%&&&###@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###&&&&%%%%%********xxxxxxxxxxx++++++++++++========------::::::.....······            
        ····.....:::::--------------------------::::::::....................::::---===++xx***%%&&&####@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###&&&&&%%%%%**********xxxxxxxxxxxxx+++++++++=======------:::::.....·····            
        ····....::::::-------=============---------:::::::::................:::::---===+++xx***%%%&&&#####@@@@@@@@@@@@@@@@@@@@@@@@@#####&&&&&%%%%%%*************xxxxxxxxxxxxxx+++++++++======-----:::::....·····            
         ····....:::::-------================---------:::::::::...............:::::----===++++xxx***%%%%&&&&&&#################&&&&&&%%%%%%%*******************xxxxxxxxxxxxxxxxx++++++++======----:::::....·····            
         ·····....:::::--------=================---------::::::::::..............:::::::-----====+++++xxxxxx**************************xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx++++++++=====-----::::....·····            
          ·····.....:::::--------=================----------:::::::::::.................:::::::::-------=============++++++++++++++++++++++++++++++++++++xxxxxxxxxxxxxxxxxxxxxxx++++++++======-----::::....·····            
            ·····.....:::::::----------===========-------------::::::::::::.........................::::::::::::::::::------------------=============+++++++++++++++++++++++++++++++++=======-----::::.....·····            
              ······......:::::::---------------------------------:::::::::::::........................................:::::::::::::::-----------============+++++++++++++++++++++========------:::::.....·····             
                 ······........:::::::::---------------------------:::::::::::::::::...........................................:::::::::::::------------=============================--------::::::.....······              
                    ·········.........:::::::::::::::-------------::::::::::::::::::::::::.......................................::::::::::::::::--------------------------------------::::::::......·······                
                          ··········............::::::::::::::::::::::::::::::::::::::::::::::::::................................::::::::::::::::::::::::::-------------:::::::::::::::.........········                   
                                  ············..................:::::::::::::::::::::::::::::::::::::::::::.........................:::::::::::::::::::::::::::::::::::::................···········                        
                                             ················.............................................................................................................·················                                 
                                                           ······················................................................................···························                                                
                                                                               ·········································································