Web Güvenliği: HTTP Başlıkları (Headers) ile Application Güvenliği
Web uygulamalarının güvenliği, yalnızca firewall ve SSL sertifikalarıyla sağlanamaz. HTTP başlıkları (headers), istemci ile sunucu arasındaki iletişimin güvenliğini doğrudan etkileyen önemli bir koruma katmanıdır. Bu yazıda, Content-Security-Policy, HSTS, X-Frame-Options ve diğer kritik güvenlik başlıklarını detaylıca inceleyeceğiz.
HTTP Başlıkları Nedir?
HTTP başlıkları, istek (request) ve yanıt (response) mesajlarıyla birlikte gönderilen ek bilgi parçalarıdır. Güvenlik başlıkları, tarayıcıya belirli davranışları nasıl uygulaması gerektiğini söyler.
En Kritik Güvenlik Başlıkları
1. Content-Security-Policy (CSP)
CSP, hangi kaynaklardan içerik yüklenebileceğini belirleyerek XSS (Cross-Site Scripting) saldırılarını önler. En karmaşık ama en etkili güvenlik başlığıdır.
``` Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' 'unsafe-inline'; img-src * data:; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.example.com; frame-ancestors 'none'; form-action 'self'; base-uri 'self'; ```
CSP direktifleri:
default-src: Diğer direktifler için varsayılan kaynakscript-src: Hangi kaynaklardan JavaScript yüklenebilirstyle-src: Hangi kaynaklardan CSS yüklenebilirimg-src: Hangi kaynaklardan görüntü yüklenebilirconnect-src: AJAX, WebSocket gibi bağlantılara izin verilen kaynaklarframe-ancestors: Sayfanın hangi sitelerde çerçeve olarak gösterilebileceğiform-action: Formlar nereye gönderilebilir
Nonce tabanlı CSP:
```javascript // Next.js middleware örneği import { NextResponse } from 'next/server'
export function middleware(request) {
const nonce = Buffer.from(crypto.randomUUID()).toString('base64')
const cspHeader = default-src 'self'; script-src 'self' 'nonce-${nonce}'; style-src 'self' 'unsafe-inline';
const response = NextResponse.next() response.headers.set('Content-Security-Policy', cspHeader) response.headers.set('X-Content-Type-Options', 'nosniff') return response } ```
2. Strict-Transport-Security (HSTS)
HSTS, tarayıcının siteyi yalnızca HTTPS üzerinden bağlanmasını zorunlu kılar. Ortadaki adam (MITM) saldırılarını önler.
``` Strict-Transport-Security: max-age=31536000; includeSubDomains; preload ```
Parametreler:
max-age: Tarayıcının bu politikayı ne kadar süreyle uygulayacağı (saniye cinsinden). Minimum 6 ay önerilir.includeSubDomains: Alt alan adlarını da kapsarpreload: HSTS preload listesine dahil edilir. Büyük siteler için önerilir.
Dikkat: HSTS'i test ederken dikkatli olun. Yanlış yapılandırma, sitenize erişilemez hale gelebilir. Önce düşük max-age değerleri ile test edin.
3. X-Frame-Options
Clickjacking saldırılarını önler. Sayfanızın çerçeve (iframe) içinde gösterilip gösterilemeyeceğini belirler.
``` X-Frame-Options: DENY ```
Değerler:
DENY: Sayfa hiçbir çerçevede gösterilemezSAMEORIGIN: Yalnızca aynı kök alan adı çerçevede gösterebilirALLOW-FROM: Yalnızca belirtilen alan adında çerçevede gösterilebilir
Not: X-Frame-_options, CSP'in frame-ancestors direktifi tarafından değiştirilmiştir. Her ikisini birden ayarlamak önerilir.
4. X-Content-Type-Options
Tarayıcının MIME türünü otomatik olarak algılamasını engeller. MIME-sniffing saldırılarını önler.
``` X-Content-Type-Options: nosniff ```
Bu başlık, sunucunun gönderdiği Content-Type başlığının tarayıcı tarafından güvenilir olmasını sağlar.
5. X-XSS-Protection
Eski tarayıcılarda yerleşik XSS korumasını etkinleştirir. Modern tarayıcılar bu özelliği desteklemez, ancak geriye dönük uyumluluk için eklenmesi önerilir.
``` X-XSS-Protection: 1; mode=block ```
6. Referrer-Policy
Sayfadan ayrılan isteklerde ne kadar Referrer bilgisi paylaşılacağını kontrol eder.
``` Referrer-Policy: strict-origin-when-cross-origin ```
Popüler değerler:
no-referrer: Hiçbir bilgi gönderilmezsame-origin: Yalnızca aynı origin'e bilgi gönderilirstrict-origin-when-cross-origin: Cross-origin isteklerde yalnızca kök URL gönderilir
7. Permissions-Policy
Tarayıcının belirli özelliklere erişimini kontrol eder (kamera, mikrofon, konum vb.).
``` Permissions-Policy: camera=(), microphone=(), geolocation=(self), payment=(self) ```
Next.js'te Güvenlik Başlıkları Yapılandırması
Middleware Kullanımı
Next.js 12 ve üzeri sürümlerde middleware, güvenlik başlıklarını ayarlamak için idealdir:
```typescript // middleware.ts import { NextResponse } from 'next/server' import type { NextRequest } from 'next/server'
export function middleware(request: NextRequest) { const response = NextResponse.next()
// CSP başlığı const csp = [ "default-src 'self'", "script-src 'self' 'unsafe-eval'", "style-src 'self' 'unsafe-inline'", "img-src 'self' data: https:", "font-src 'self'", "connect-src 'self'", "frame-ancestors 'none'", "form-action 'self'", ].join('; ')
response.headers.set('Content-Security-Policy', csp) response.headers.set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload') response.headers.set('X-Content-Type-Options', 'nosniff') response.headers.set('X-Frame-Options', 'DENY') response.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin') response.headers.set('Permissions-Policy', 'camera=(), microphone=(), geolocation=(self)')
return response }
export const config = { matcher: '/((?!api|_next/static|_next/image|favicon.ico).*)', } ```
next.config.js ile Başlık Ekleme
Daha basit bir yaklaşım olarak next.config.js'de başlık tanımlayabilirsiniz:
```javascript /** @type {import('next').NextConfig} / const nextConfig = { async headers() { return [ { source: '/(.)', headers: [ { key: 'X-Frame-Options', value: 'DENY', }, { key: 'X-Content-Type-Options', value: 'nosniff', }, { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin', }, ], }, ] }, }
module.exports = nextConfig ```
Güvenlik Başlıklarının Test Edilmesi
Online Araçlar
- SecurityHeaders.com: En kapsamlı güvenlik başlığı analiz aracı
- Mozilla Observatory: Mozilla'nın güvenlik tarama aracı
- CSP Evaluator: Google'ın CSP test aracı
Browser DevTools ile Test
Chrome DevTools > Network sekmesinde, yanıt başlıklarını kontrol edin:
```bash
curl ile test
curl -I https://www.example.com
Yanıt başlıklarını görüntüle
HTTP/2 200 content-security-policy: default-src 'self' strict-transport-security: max-age=31536000 x-content-type-options: nosniff x-frame-options: DENY ```
Yaygın Hatalar ve Çözümleri
Hata 1: Aşırı Katı CSP
```
Sorun: Tüm kaynakları engelleyen CSP
Content-Security-Policy: default-src 'none' ```
Çözüm: Önce raporlama modunu kullanın:
``` Content-Security-Policy: default-src 'self'; report-uri /csp-report ```
Hata 2: HSTS'i Hemen Aktif Etme
```
Sorun: Yüksek max-age ile başlama
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload ```
Çözüm: Önce düşük değerlerle test edin:
```
Aşama 1: Kısa süre
Strict-Transport-Security: max-age=300
Aşama 2: Uzun süre
Strict-Transport-Security: max-age=31536000; includeSubDomains ```
Hata 3: X-Frame-Options ile CSP Çatışması
```
Her ikisini birden kullanın
X-Frame-Options: SAMEORIGIN Content-Security-Policy: frame-ancestors 'self' ```
Sonuç
HTTP güvenlik başlıkları, web uygulamanızı korumanın en etkili ve düşük maliyetli yollarından biridir. Doğru yapılandırılmış bir CSP, HSTS ve diğer başlıklar, XSS, clickjacking ve MITM saldırılarını önemli ölçüde azaltır. Her başlığın amacını anlayın, test edin ve üretim ortamına dikkatli bir şekilde uygulayın.
İlgili Sektörler
Bu konuyla ilgili hangi sektörler için web sitesi yapıyoruz?
Avukat & Hukuk Bürosu
Hukuk büroları ve avukatlar için güven veren, profesyonel web sitesi çözümleri. Müşteri adayları için etkili bir ilk izlenim bırakın.
Detayları Gör →Doktor & Klinik
Sağlık sektörü için hasta güveni ve randevu kolaylığı sağlayan profesyonel web sitesi çözümleri.
Detayları Gör →Restoran & Kafe
Yeme-içme sektörü için online sipariş, rezervasyon ve menü yönetimi kolaylaştıran web sitesi çözümleri.
Detayları Gör →Emlak & Gayrimenkul
Emlak sektörü için ilan yönetimi, harita bazlı arama ve müşteri yönetimi kolaylaştıran web sitesi çözümleri.
Detayları Gör →Okuyucu Yorumlari
Mevcut Yorumlar
Henuz yorum yapilmamis. Ilk siz olun.