Application Security

Kodunuzu Güçlendirin: Çapraz Site Betikleme (XSS) Önleme Rehberi

Çapraz Site Betikleme (XSS), web uygulaması güvenliğindeki en yaygın ve tehlikeli açıklardan biri olmaya devam ediyor. Yıllardır biliniyor olmasına rağmen, OWASP Top 10'de sürekli olarak üst sıralarda yer alıyor. Orta ve ileri düzey geliştiriciler için XSS'in nasıl çalıştığını anlamak, sistematik olarak nasıl önlenacağını bilmek artık bir tercih değil; güvenilir yazılım geliştirmek için temel bir gerekliliktir.

XSS saldırıları, bir uygulama güvenilir olmayan verileri uygun doğrulama veya kaçış (escaping) olmadan bir web sayfasına eklediğinde gerçekleşir. Bu, saldırganların kurbanın tarayıcısında yürütülmek üzere kötü amaçlı betikler enjekte etmesine olanak tanır; oturum çerezlerini çalabilir, web sitelerini bozabilir veya kullanıcıları kötü amaçlı sitelere yönlendirebilir. Bu yazıda, XSS'in mekaniklerini keşfedecek ve önleme için sağlam, pratik stratejiler sunacağız.

Vektörleri Anlamak: Saklı, Yansıtılan ve DOM Tabanlı

Savunma mekanizmalarını uygulamadan önce, her biri için biraz farklı bir önleme stratejisi gerektiren üç temel XSS türünü tanımanız gerekir.

  • Yansıtılan XSS: Kötü amaçlı betik, mevcut HTTP isteğinden gelir (örneğin, kurgulanmış bir URL bağlantısı). Sunucuda saklanmaz.
  • Saklı XSS: Kötü amaçlı betik, hedef sunucuda kalıcı olarak saklanır (örneğin, bir veritabanında, yorum alanında veya forum gönderisinde). Bu genellikle en zararlı türdür.
  • DOM Tabanlı XSS: Açık, sunucu tarafı işlemeden ziyade istemci tarafı kodda bulunur. Saldırgan, kurbanın tarayıcısındaki DOM ortamını değiştirerek istemci tarafı betiğinin beklenmedik şekilde yürütülmesine neden olur.

Temel Prensip: Bağlam Bilinli Çıktı Kodlama

XSS önlemenin altın kuralı kullanıcı girdisine asla güvenmemekdir. Ancak daha ince bir yaklaşım gerekir: Verinin işlendiği bağlama göre çıktı kodlaması yapmanız gerekir. HTML kodlaması, farklı bağlamları farklı şekilde işler çünkü ayrıştırıcı, karakterlerin nerede göründüğüne bağlı olarak onları farklı şekilde yorumlar.

1. HTML Gövde Bağlamı

Kullanıcı verisini HTML gövdesine eklerken, <, >, &, " ve ' gibi özel karakterleri kodlamanız gerekir. Bunu Node.js ortamında helmet gibi bir kitaplık veya özel bir kodlayıcı kullanarak nasıl ele alacağınız aşağıdadır.

// Kötü: Kullanıcı girdisini doğrudan ekleme
res.send(``);

// İyi: HTML varlıklarını kodlamak için bir kitaplık kullanma
const encoder = require('html-entities');
const safeUserName = encoder.encode(userName);
res.send(``);

2. Öznitelik Bağlamı

Kullanıcı verisinin bir HTML özniteliğinin içine yerleştirilmesi gerekiyorsa, bu bağlam için özel olarak kodlamanız gerekir. Örneğin, çift tırnaklar " olarak kodlanmalıdır.

// Kötü: Girdi >"> ise potansiyel enjeksiyon
res.send(``);

// İyi: Bağlam bilinli kodlama
const safeInput = encodeForAttribute(userInput);
res.send(``);

3. JavaScript Bağlamı

Bu, en karmaşık ve tehlikeli bağlamdır. Veriyi bir JavaScript bloğuna gömmeniz gerekiyorsa, uygun şekilde kaçış (escaped) yapıldığından emin olun veya daha iyisi, satır içi betiklerden tamamen kaçının.

// Kötü: Kullanıcı girdisinin doğrudan JS dizisi içinde olması
res.send(``);

// İyi: JSON.stringify veya onluk kaçış kullanma
res.send(``);

Derinlemesine Savunma: İçerik Güvenlik Politikası (CSP)

Giriş doğrulama ve kodlama savunmanın ilk hattı olsa da, bir geliştirici hata yaparsa bunların atlanabilmesi mümkündür. İşte İçerik Güvenlik Politikası'nın (CSP) devreye girdiği yer burasıdır. CSP, XSS ve veri enjeksiyon saldırıları da dahil olmak üzere belirli saldırı türlerini tespit etmeye ve hafifletmeye yardımcı olan ek bir güvenlik katmanıdır.

Yüklenmesine izin verilen içerik kaynaklarını tanımlayarak, bir XSS açığının etkisini nötralize edebilirsiniz. Bir saldırgan bir betik enjekte etmeyi başarsa bile, tarayıcı bunu güvenilir bir kaynaktan gelmediği için engelleyecektir.

Content-Security-Policy: default-src 'self'; 
script-src 'self' https://trusted-scripts.example.com; 
style-src 'self' 'unsafe-inline';

script-src 'self' yönergesi, JavaScript'in yalnızca kendi alan adınızdan yüklenmesini sağlar. 'unsafe-inline' kullanmaktan mümkün olduğunca kaçınmanız gerektiğini unutmayın, çünkü bu, politikayı önemli ölçüde zayıflatır. Modern çerçeveler genellikle CSP başlıklarını otomatik olarak yönetmeye yardımcı olur.

Modern Çerçevelerden Yararlanma

XSS'i önlemenin en etkili yollarından biri, kaçış işlemlerini varsayılan olarak yapan modern web çerçevelerini kullanmaktır. React, Angular ve Vue.js, DOM'da render ederken değerleri otomatik olarak kaçış yapar. Bu, çerçeveye açıkça yapmamasını söylemediğiniz sürece (örneğin React'te dangerouslySetInnerHTML kullanımı), yansıtılan ve saklı XSS'e karşı büyük ölçüde korunduğunuz anlamına gelir.

Bununla birlikte, DOM tabanlı XSS konusunda dikkatli olun. Sunucu tarafı işleme güvenli olsa bile, URL parametrelerine veya document.location temelinde DOM'u manipüle eden istemci tarafı JavaScript'i açıklıklar yaratabilir. Veriyi istemci tarafında da doğrulayın ve temizleyin.

Sonuç

XSS'i önlemek tek seferlik bir görev değil; güvenli kodlama uygulamaları, titiz testler ve katmanlı savunmalar içeren sürekli bir süreçtir. Bağlam bilinli çıktı kodlamasını, sıkı İçerik Güvenlik Politikalarını ve modern çerçevelerin otomatik kaçış özelliklerini birleştirerek geliştiriciler XSS saldırısı riskini önemli ölçüde azaltabilir. Unutmayın, güvenlik ortak bir sorumluluktur. Tetikte kalın, bağımlılıklarınızı güncel tutun ve her zaman kullanıcılarınızın verilerinin güvenliğini önceliklendirin.

Share: