Türkçe

Siteler Arası Komut Dosyası Çalıştırma (XSS) saldırılarını önlemeye ve sağlam bir ön uç güvenliği için İçerik Güvenliği Politikası (CSP) uygulamaya yönelik kapsamlı bir rehber.

Ön Uç Güvenliği: XSS Önleme ve İçerik Güvenliği Politikası (CSP)

Günümüzün web geliştirme dünyasında, ön uç güvenliği büyük önem taşımaktadır. Web uygulamaları giderek daha karmaşık ve etkileşimli hale geldikçe, çeşitli saldırılara, özellikle de Siteler Arası Komut Dosyası Çalıştırma (XSS) saldırılarına karşı daha savunmasız hale gelirler. Bu makale, XSS zafiyetlerini anlamak ve azaltmak için kapsamlı bir rehber sunmakta ve sağlam bir savunma mekanizması olarak İçerik Güvenliği Politikası'nı (CSP) uygulamayı anlatmaktadır.

Siteler Arası Komut Dosyası Çalıştırma (XSS) Saldırısını Anlamak

XSS Nedir?

Siteler Arası Komut Dosyası Çalıştırma (XSS), kötü amaçlı komut dosyalarının normalde zararsız ve güvenilir web sitelerine enjekte edildiği bir tür enjeksiyon saldırısıdır. XSS saldırıları, bir saldırganın farklı bir son kullanıcıya genellikle tarayıcı tarafı komut dosyası şeklinde kötü amaçlı kod göndermek için bir web uygulaması kullandığında meydana gelir. Bu saldırıların başarılı olmasına izin veren kusurlar oldukça yaygındır ve bir web uygulamasının bir kullanıcıdan aldığı girdiyi doğrulamadan veya kodlamadan ürettiği çıktıda kullandığı her yerde ortaya çıkar.

Kullanıcıların yorum gönderebildiği popüler bir çevrimiçi forum düşünün. Forum, kullanıcı girdisini düzgün bir şekilde temizlemezse, bir saldırgan bir yoruma kötü amaçlı bir JavaScript parçacığı enjekte edebilir. Diğer kullanıcılar bu yorumu görüntülediğinde, kötü amaçlı komut dosyası tarayıcılarında çalışır ve potansiyel olarak çerezlerini çalar, onları kimlik avı sitelerine yönlendirir veya web sitesinin görünümünü bozar.

XSS Saldırı Türleri

XSS'in Etkisi

Başarılı bir XSS saldırısının sonuçları ciddi olabilir:

XSS Önleme Teknikleri

XSS saldırılarını önlemek, hem girdi doğrulamasına hem de çıktı kodlamasına odaklanan çok katmanlı bir yaklaşım gerektirir.

Girdi Doğrulama

Girdi doğrulama, kullanıcı girdisinin beklenen biçime ve veri türüne uygun olduğunu doğrulama işlemidir. XSS'e karşı kusursuz bir savunma olmasa da, saldırı yüzeyini azaltmaya yardımcı olur.

Örnek (PHP):

<?php $username = $_POST['username']; // Beyaz liste doğrulaması: Sadece alfanümerik karakterlere ve alt çizgilere izin ver if (preg_match('/^[a-zA-Z0-9_]+$/', $username)) { // Geçerli kullanıcı adı echo "Geçerli kullanıcı adı: " . htmlspecialchars($username, ENT_QUOTES, 'UTF-8'); } else { // Geçersiz kullanıcı adı echo "Geçersiz kullanıcı adı. Sadece alfanümerik karakterler ve alt çizgiler kullanılabilir."; } ?>

Çıktı Kodlama (Escaping)

Kaçış (escaping) olarak da bilinen çıktı kodlama, özel karakterleri HTML karşılıklarına veya URL kodlanmış eşdeğerlerine dönüştürme işlemidir. Bu, tarayıcının karakterleri kod olarak yorumlamasını engeller.

Örnek (JavaScript - HTML Kodlama):

function escapeHTML(str) { let div = document.createElement('div'); div.appendChild(document.createTextNode(str)); return div.innerHTML; } let userInput = '<script>alert("XSS");</script>'; let encodedInput = escapeHTML(userInput); // Kodlanmış girdiyi DOM'a yazdırın document.getElementById('output').innerHTML = encodedInput; // Çıktı: &lt;script&gt;alert("XSS");&lt;/script&gt;

Örnek (Python - HTML Kodlama):

import html user_input = '<script>alert("XSS");</script>' encoded_input = html.escape(user_input) print(encoded_input) # Çıktı: &lt;script&gt;alert("XSS");&lt;/script&gt;

Bağlama Duyarlı Kodlama

Kullandığınız kodlama türü, verinin görüntülendiği bağlama bağlıdır. Örneğin, veriyi bir HTML özniteliği içinde görüntülüyorsanız, HTML öznitelik kodlaması kullanmanız gerekir. Veriyi bir JavaScript dizesi içinde görüntülüyorsanız, JavaScript dize kodlaması kullanmanız gerekir.

Örnek:

<input type="text" value="<?php echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8'); ?>">

Bu örnekte, URL'den alınan name parametresinin değeri bir girdi alanının value özniteliği içinde görüntülenmektedir. htmlspecialchars() fonksiyonu, name parametresindeki herhangi bir özel karakterin düzgün bir şekilde kodlanmasını sağlayarak XSS saldırılarını önler.

Şablon Motoru Kullanımı

Birçok modern web çerçevesi ve şablon motoru (ör. React, Angular, Vue.js, Twig, Jinja2) otomatik çıktı kodlama mekanizmaları sağlar. Bu motorlar, değişkenler şablonlarda işlendiğinde otomatik olarak kaçış işlemi yaparak XSS zafiyetleri riskini azaltır. Her zaman şablon motorunuzun yerleşik kaçış özelliklerini kullanın.

İçerik Güvenliği Politikası (CSP)

CSP Nedir?

İçerik Güvenliği Politikası (CSP), Siteler Arası Komut Dosyası Çalıştırma (XSS) ve veri enjeksiyonu saldırıları da dahil olmak üzere belirli saldırı türlerini tespit etmeye ve azaltmaya yardımcı olan ek bir güvenlik katmanıdır. CSP, tarayıcının kaynakları yüklemesine izin verilen kaynakların bir beyaz listesini tanımlamanıza olanak tanıyarak çalışır. Bu beyaz liste alan adlarını, protokolleri ve hatta belirli URL'leri içerebilir.

Varsayılan olarak, tarayıcılar web sayfalarının herhangi bir kaynaktan kaynak yüklemesine izin verir. CSP, kaynakların yüklenebileceği kaynakları kısıtlayarak bu varsayılan davranışı değiştirir. Bir web sitesi beyaz listede olmayan bir kaynaktan kaynak yüklemeye çalışırsa, tarayıcı isteği engeller.

CSP Nasıl Çalışır?

CSP, sunucudan tarayıcıya bir HTTP yanıt başlığı gönderilerek uygulanır. Başlık, her biri belirli bir kaynak türü için bir politika belirten bir yönerge listesi içerir.

Örnek CSP Başlığı:

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

Bu başlık aşağıdaki politikaları tanımlar:

CSP Yönergeleri

İşte en sık kullanılan CSP yönergelerinden bazıları:

CSP Kaynak Listesi Değerleri

Her CSP yönergesi, izin verilen kaynakları veya anahtar kelimeleri belirten bir kaynak değerleri listesi kabul eder.

CSP Uygulama

CSP'yi uygulamanın birkaç yolu vardır:

Örnek (CSP'yi HTTP Başlığı ile Ayarlama - Apache):

Apache yapılandırma dosyanıza (ör. .htaccess veya httpd.conf), aşağıdaki satırı ekleyin:

Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://cdn.example.com; img-src 'self' data:; font-src 'self';"

Örnek (CSP'yi HTTP Başlığı ile Ayarlama - Nginx):

Nginx yapılandırma dosyanıza (ör. nginx.conf), server bloğuna aşağıdaki satırı ekleyin:

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

Örnek (CSP'yi Meta Etiketi ile Ayarlama):

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://cdn.example.com; img-src 'self' data:; font-src 'self';">

CSP Test Etme

CSP uygulamanızın beklendiği gibi çalıştığından emin olmak için test etmeniz çok önemlidir. Content-Security-Policy başlığını incelemek ve herhangi bir ihlal olup olmadığını kontrol etmek için tarayıcı geliştirici araçlarını kullanabilirsiniz.

CSP Raporlama

CSP raporlamasını yapılandırmak için `report-uri` veya `report-to` yönergelerini kullanın. Bu, CSP politikası ihlal edildiğinde sunucunuzun raporlar almasını sağlar. Bu bilgiler, güvenlik zafiyetlerini belirlemek ve düzeltmek için paha biçilmez olabilir.

Örnek (report-uri ile CSP):

Content-Security-Policy: default-src 'self'; report-uri /csp-report-endpoint;

Örnek (report-to ile CSP - daha modern):

Report-To: {"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"https://alan-adiniz.com/csp-report-endpoint"}]} Content-Security-Policy: default-src 'self'; report-to csp-endpoint;

Sunucu tarafı uç noktası (bu örneklerde `/csp-report-endpoint`), bu JSON raporlarını alacak ve işleyecek şekilde yapılandırılmalı ve daha sonra analiz edilmek üzere günlüğe kaydedilmelidir.

CSP En İyi Uygulamaları

Örnek (Nonce Uygulaması):

Sunucu Tarafı (Nonce Oluşturma):

<?php $nonce = base64_encode(random_bytes(16)); ?>

HTML:

<script nonce="<?php echo $nonce; ?>"> // Satır içi komut dosyanız burada console.log('Nonce ile satır içi komut dosyası'); </script>

CSP Başlığı:

Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-<?php echo $nonce; ?>';

CSP ve Üçüncü Taraf Kütüphaneler

Üçüncü taraf kütüphaneleri veya CDN'leri kullanırken, alan adlarını CSP politikanıza dahil ettiğinizden emin olun. Örneğin, bir CDN'den jQuery kullanıyorsanız, CDN'nin alan adını script-src yönergesine eklemeniz gerekir.

Ancak, tüm CDN'leri körü körüne beyaz listeye eklemek güvenlik riskleri oluşturabilir. CDN'lerden yüklenen dosyaların bütünlüğünü doğrulamak için Alt Kaynak Bütünlüğü'nü (SRI) kullanmayı düşünün.

Alt Kaynak Bütünlüğü (SRI)

SRI, tarayıcıların CDN'lerden veya diğer üçüncü taraf kaynaklardan alınan dosyaların tahrif edilmediğini doğrulamasına olanak tanıyan bir güvenlik özelliğidir. SRI, alınan dosyanın kriptografik karmasını bilinen bir karmayla karşılaştırarak çalışır. Karmalar eşleşmezse, tarayıcı dosyanın yüklenmesini engeller.

Örnek:

<script src="https://example.com/jquery.min.js" integrity="sha384-ornek-karma" crossorigin="anonymous"></script>

integrity özniteliği, jquery.min.js dosyasının kriptografik karmasını içerir. crossorigin özniteliği, SRI'nin farklı kaynaklardan sunulan dosyalarla çalışması için gereklidir.

Sonuç

Ön uç güvenliği, web geliştirmenin kritik bir yönüdür. XSS önleme tekniklerini ve İçerik Güvenliği Politikası'nı (CSP) anlayıp uygulayarak, saldırı riskini önemli ölçüde azaltabilir ve kullanıcılarınızın verilerini koruyabilirsiniz. Girdi doğrulama, çıktı kodlama, CSP ve diğer en iyi güvenlik uygulamalarını birleştiren çok katmanlı bir yaklaşım benimsemeyi unutmayın. Güvenli ve sağlam web uygulamaları oluşturmak için öğrenmeye devam edin ve en son güvenlik tehditleri ve azaltma teknikleri hakkında güncel kalın.

Bu kılavuz, XSS önleme ve CSP hakkında temel bir anlayış sağlar. Güvenliğin sürekli bir süreç olduğunu ve potansiyel tehditlerin önünde kalmak için sürekli öğrenmenin gerekli olduğunu unutmayın. Bu en iyi uygulamaları uygulayarak, kullanıcılarınız için daha güvenli ve güvenilir bir web deneyimi oluşturabilirsiniz.