Türkçe

Web sitenizi yaygın saldırılara karşı korumak için güvenlik başlıklarını uygulamaya yönelik, küresel kitle için güvenliği artıran kapsamlı bir rehber.

Web Güvenlik Başlıkları: Pratik Bir Uygulama Rehberi

Günümüzün dijital dünyasında, web güvenliği her şeyden önemlidir. Web siteleri sürekli olarak siteler arası betik çalıştırma (XSS), tıklama tuzağı (clickjacking) ve veri enjeksiyonu gibi çeşitli saldırıların hedefi olmaktadır. Web güvenlik başlıklarını uygulamak, bu riskleri azaltmada ve kullanıcılarınızı ve verilerinizi korumada çok önemli bir adımdır. Bu rehber, temel güvenlik başlıklarına kapsamlı bir genel bakış sunar ve bunların nasıl etkili bir şekilde uygulanacağını anlatır.

Web Güvenlik Başlıkları Nedir?

Web güvenlik başlıkları, web tarayıcılarına web sitenizin içeriğini işlerken nasıl davranmaları gerektiğini bildiren HTTP yanıt başlıklarıdır. Tarayıcıya hangi eylemlere izin verildiğini ve hangilerinin yasak olduğunu söyleyen bir dizi kural olarak işlev görürler. Bu başlıkları doğru bir şekilde ayarlayarak, web sitenizin saldırı yüzeyini önemli ölçüde azaltabilir ve genel güvenlik duruşunu iyileştirebilirsiniz. Güvenlik başlıkları, mevcut güvenlik önlemlerini güçlendirir ve yaygın web güvenlik açıklarına karşı ekstra bir savunma katmanı sağlar.

Güvenlik Başlıkları Neden Önemlidir?

Temel Güvenlik Başlıkları ve Uygulamaları

İşte en önemli güvenlik başlıklarının ve nasıl uygulanacaklarının bir dökümü:

1. Content-Security-Policy (CSP)

Content-Security-Policy (CSP) başlığı en güçlü güvenlik başlıklarından biridir. Tarayıcının betikler, stil sayfaları, resimler ve yazı tipleri gibi kaynakları hangi kaynaklardan yüklemesine izin verildiğini kontrol etmenizi sağlar. Bu, tarayıcının web sitenize enjekte edilen kötü amaçlı kodu çalıştırmasını önleyerek XSS saldırılarını önlemeye yardımcı olur.

Uygulama:

CSP başlığı, `Content-Security-Policy` yönergesi ile ayarlanır. Değer, her biri belirli bir kaynak türü için izin verilen kaynakları belirten bir yönergeler listesidir.

Örnek:

Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:; font-src 'self'; connect-src 'self' wss://example.com;

Açıklama:

Önemli CSP Yönergeleri:

CSP Sadece Raporlama Modu:

Bir CSP politikasını zorunlu kılmadan önce, sadece raporlama modunu kullanmanız önerilir. Bu, herhangi bir kaynağı engellemeden politikanın etkisini izlemenizi sağlar. Bu amaçla `Content-Security-Policy-Report-Only` başlığı kullanılır.

Örnek:

Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://example.com; report-uri /csp-report-endpoint;

Bu örnekte, CSP politikasının herhangi bir ihlali `/csp-report-endpoint` URL'sine raporlanacaktır. Bu raporları almak ve analiz etmek için sunucu tarafında bir uç nokta kurmanız gerekir. Sentry ve Google CSP Evaluator gibi araçlar, CSP politikası oluşturma ve raporlama konusunda yardımcı olabilir.

2. X-Frame-Options

X-Frame-Options başlığı, tıklama tuzağı (clickjacking) saldırılarına karşı koruma sağlamak için kullanılır. Tıklama tuzağı, bir saldırganın, genellikle meşru bir web sitesini kötü amaçlı bir iframe içine yerleştirerek, bir kullanıcıyı algıladığından farklı bir şeye tıklaması için kandırmasıyla meydana gelir.

Uygulama:

X-Frame-Options başlığının üç olası değeri olabilir:

Örnekler:

X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN

Çoğu web sitesi için `SAMEORIGIN` seçeneği en uygun olanıdır. Web siteniz asla çerçevelenmemeliyse, `DENY` kullanın. `ALLOW-FROM` seçeneği, tarayıcı uyumluluk sorunları nedeniyle genellikle önerilmez.

Önemli: `X-Frame-Options` eski kabul edildiğinden, daha iyi kontrol ve uyumluluk için bunun yerine CSP'nin `frame-ancestors` yönergesini kullanmayı düşünün. `frame-ancestors`, kaynağı yerleştirmesine izin verilen kaynakların bir listesini belirtmenize olanak tanır.

3. Strict-Transport-Security (HSTS)

Strict-Transport-Security (HSTS) başlığı, tarayıcıları web sitenizle yalnızca HTTPS üzerinden iletişim kurmaya zorlar. Bu, bir saldırganın güvensiz HTTP trafiğini ele geçirip kullanıcıları kötü amaçlı bir web sitesine yönlendirebileceği ortadaki adam (man-in-the-middle) saldırılarını önler.

Uygulama:

HSTS başlığı, tarayıcının siteye yalnızca HTTPS üzerinden erişmeyi ne kadar süre (saniye cinsinden) hatırlaması gerektiğini belirten `max-age` yönergesini belirtir. HSTS politikasını tüm alt alan adlarına uygulamak için `includeSubDomains` yönergesini de ekleyebilirsiniz.

Örnek:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Açıklama:

Önemli: HSTS'yi etkinleştirmeden önce, tüm web sitenizin ve tüm alt alan adlarının HTTPS üzerinden erişilebilir olduğundan emin olun. Aksi takdirde, kullanıcılar web sitenize erişemeyebilir.

4. X-Content-Type-Options

X-Content-Type-Options başlığı, MIME sniffing saldırılarını önler. MIME sniffing, sunucu farklı bir içerik türü belirtmiş olsa bile tarayıcının bir kaynağın içerik türünü tahmin etmeye çalıştığı bir tekniktir. Bu, tarayıcının bir dosyayı yanlışlıkla çalıştırılabilir kod olarak yorumlaması durumunda güvenlik açıklarına yol açabilir.

Uygulama:

X-Content-Type-Options başlığının yalnızca bir olası değeri vardır: `nosniff`.

Örnek:

X-Content-Type-Options: nosniff

Bu başlık, tarayıcıya bir kaynağın içerik türünü tahmin etmeye çalışmamasını ve yalnızca sunucu tarafından belirtilen `Content-Type` başlığına güvenmesini söyler.

5. Referrer-Policy

Referrer-Policy başlığı, bir kullanıcı web sitenizden ayrıldığında diğer web sitelerine ne kadar yönlendiren bilgisi (önceki sayfanın URL'si) gönderileceğini kontrol eder. Bu, hassas bilgilerin üçüncü taraf sitelere sızmasını önleyerek kullanıcı gizliliğini korumaya yardımcı olabilir.

Uygulama:

Referrer-Policy başlığının birkaç olası değeri olabilir, her biri gönderilecek farklı bir yönlendiren bilgisi seviyesini belirtir:

Örnekler:

Referrer-Policy: strict-origin-when-cross-origin
Referrer-Policy: no-referrer

`strict-origin-when-cross-origin` politikası genellikle güvenlik ve işlevsellik arasında iyi bir denge sağlar. Tam URL'yi farklı kaynaklara göndermeyerek kullanıcı gizliliğini korurken, web sitelerinin temel yönlendirme bilgilerini izlemesine olanak tanır.

6. Permissions-Policy (eski adıyla Feature-Policy)

Permissions-Policy başlığı (eski adıyla Feature-Policy), web siteniz ve gömülü iframe'ler tarafından hangi tarayıcı özelliklerinin (ör. kamera, mikrofon, coğrafi konum) kullanılmasına izin verildiğini kontrol etmenizi sağlar. Bu, kötü amaçlı kodun kullanıcının açık onayı olmadan hassas tarayıcı özelliklerine erişmesini önlemeye yardımcı olabilir.

Uygulama:

Permissions-Policy başlığı, her biri belirli bir tarayıcı özelliğine erişimi kontrol eden bir yönergeler listesi belirtir. Her yönerge, bir özellik adı ve izin verilen kaynakların bir listesinden oluşur.

Örnek:

Permissions-Policy: geolocation 'self' https://example.com; camera 'none'; microphone (self)

Açıklama:

Yaygın Permissions-Policy Özellikleri:

7. Diğer Güvenlik Başlıkları

Yukarıda tartışılan başlıklar en yaygın kullanılan ve önemli olanlar olsa da, diğer güvenlik başlıkları ek koruma sağlayabilir:

Güvenlik Başlıklarını Uygulama

Güvenlik başlıkları, web sunucunuza veya içerik dağıtım ağınıza (CDN) bağlı olarak çeşitli şekillerde uygulanabilir.

1. Web Sunucusu Yapılandırması

Web sunucunuzu (ör. Apache, Nginx) HTTP yanıtına güvenlik başlıkları ekleyecek şekilde yapılandırabilirsiniz. Bu genellikle güvenlik başlıklarını uygulamanın en doğrudan ve verimli yoludur.

Apache:

Güvenlik başlıklarını ayarlamak için Apache yapılandırma dosyanızda (`.htaccess` veya `httpd.conf`) `Header` yönergesini kullanabilirsiniz.

Örnek:

Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com;"
Header set X-Frame-Options "SAMEORIGIN"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header set X-Content-Type-Options "nosniff"
Header set Referrer-Policy "strict-origin-when-cross-origin"
Header set Permissions-Policy "geolocation 'self'"

Nginx:

Güvenlik başlıklarını ayarlamak için Nginx yapılandırma dosyanızda (`nginx.conf`) `add_header` yönergesini kullanabilirsiniz.

Örnek:

add_header Content-Security-Policy "default_src 'self'; script-src 'self' https://example.com;";
add_header X-Frame-Options "SAMEORIGIN";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "strict-origin-when-cross-origin";
add_header Permissions-Policy "geolocation 'self';";

2. İçerik Dağıtım Ağı (CDN)

Cloudflare, Akamai ve Fastly gibi birçok CDN, güvenlik başlıklarını yapılandırmak için özellikler sunar. Bu, özellikle zaten bir CDN kullanıyorsanız, güvenlik başlıklarını uygulamanın kolay bir yolu olabilir.

Örnek (Cloudflare):

Cloudflare'de, "Rules" veya "Transform Rules" özelliklerini kullanarak güvenlik başlıklarını yapılandırabilirsiniz. URL veya istek türü gibi çeşitli kriterlere göre HTTP başlıkları eklemek, değiştirmek veya kaldırmak için kurallar tanımlayabilirsiniz.

3. Sunucu Taraflı Kod

Güvenlik başlıklarını sunucu taraflı kodunuzda da ayarlayabilirsiniz (ör. PHP, Python, Node.js kullanarak). Bu yaklaşım, isteğe veya kullanıcı bağlamına göre başlıkları dinamik olarak ayarlamak için size daha fazla esneklik sağlar.

Örnek (Node.js ile Express):

const express = require('express');
const app = express();

app.use((req, res, next) => {
  res.setHeader('Content-Security-Policy', "default-src 'self'; script-src 'self' https://example.com;");
  res.setHeader('X-Frame-Options', 'SAMEORIGIN');
  res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload');
  res.setHeader('X-Content-Type-Options', 'nosniff');
  res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
  res.setHeader('Permissions-Policy', "geolocation 'self'");
  next();
});

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log('Server listening on port 3000');
});

Test ve Doğrulama

Güvenlik başlıklarını uyguladıktan sonra, doğru çalıştıklarını test etmek ve doğrulamak çok önemlidir. Birkaç çevrimiçi araç bu konuda size yardımcı olabilir:

Chrome DevTools kullanarak örnek:

  1. Chrome Geliştirici Araçları'nı açın (sayfaya sağ tıklayıp "İncele"yi seçin).
  2. "Ağ" (Network) sekmesine gidin.
  3. Sayfayı yeniden yükleyin.
  4. Ana belge isteğini seçin (genellikle listedeki ilk istek).
  5. "Başlıklar" (Headers) sekmesine gidin.
  6. Güvenlik başlıklarını görmek için "Yanıt Başlıkları" (Response Headers) bölümüne gidin.

Yaygın Hatalar ve En İyi Uygulamalar

İşte güvenlik başlıklarını uygularken kaçınılması gereken bazı yaygın hatalar:

En İyi Uygulamalar:

Sonuç

Web güvenlik başlıklarını uygulamak, web sitenizi ve kullanıcılarınızı yaygın saldırılardan korumak için önemli bir adımdır. Her başlığın amacını anlayarak ve bu kılavuzda belirtilen en iyi uygulamaları takip ederek, web sitenizin güvenlik duruşunu önemli ölçüde iyileştirebilir ve kullanıcılarınızla güven oluşturabilirsiniz. Güvenlik başlıklarınızın etkili bir şekilde çalıştığından emin olmak ve gelişen güvenlik tehditlerine uyum sağlamak için düzenli olarak test etmeyi ve izlemeyi unutmayın. Güvenlik başlıklarını uygulamak için harcanan zaman ve çaba, uzun vadede web sitenizi ve kullanıcılarınızı zarardan koruyarak karşılığını verecektir. Son bir not olarak, web sitenizin güvenliğini değerlendirmek ve herhangi bir güvenlik açığını belirlemek için bir güvenlik uzmanına danışmayı veya bir güvenlik denetim hizmeti kullanmayı düşünün.