Web güvenliği: HTTP başlıkları (Headers) ile application güvenliği

Hangi HTTP başlıkları uygulamanızı korur? Content-Security-Policy, HSTS ve diğer güvenlik başlıklarıyla saldırıları önleyin.

2026-01-1515 dk okuma
Web güvenliği: HTTP başlıkları (Headers) ile application güvenliği

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 kaynak
  • script-src: Hangi kaynaklardan JavaScript yüklenebilir
  • style-src: Hangi kaynaklardan CSS yüklenebilir
  • img-src: Hangi kaynaklardan görüntü yüklenebilir
  • connect-src: AJAX, WebSocket gibi bağlantılara izin verilen kaynaklar
  • frame-ancestors: Sayfanın hangi sitelerde çerçeve olarak gösterilebileceği
  • form-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 kapsar
  • preload: 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österilemez
  • SAMEORIGIN: Yalnızca aynı kök alan adı çerçevede gösterebilir
  • ALLOW-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önderilmez
  • same-origin: Yalnızca aynı origin'e bilgi gönderilir
  • strict-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.

Okuyucu Yorumlari

5.0 (0 yorum)

Mevcut Yorumlar

Henuz yorum yapilmamis. Ilk siz olun.

Yorum Birakin