innerHTML ile XSS ve Bunu Önleme
Siteler arası betik çalıştırmayı ve innerHTML yerine güvenli seçenekleri anlayın
innerHTML ile XSS ve Bunu Önleme, CoddyKit'te ücretsiz bir HTML Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, HTML Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. HTML Academy kursu toplamda 4 dersten oluşur.
Temel Güvenlik Açığı
el.innerHTML = userInput kullanmak, dizeyi HTML olarak ayrıştırır. userInput içinde <script> etiketleri veya olay işleyici öznitelikleri (onclick, onerror) varsa tarayıcı bunları yorumlar ve saldırganın denetimindeki kodu sayfada çalıştırır.
Neden Yaygındır?
Kullanıcı verilerini HTML'e yerleştiren her kod — sunucu şablonları ve istemci tarafı oluşturma dâhil — veriler kaçırılmamışsa XSS riski taşır. API yanıtlarından innerHTML oluşturan tek sayfalı uygulamalar, bu yanıtlar kullanıcı içeriği içerdiğinde özellikle savunmasızdır.
Somut Bir Örnek
"Bob<img src=x onerror=alert(1)>" kullanıcı adı div.innerHTML = `Welcome, ${user}` aracılığıyla ayarlandığında, img yüklenemezse alert(1) çalışır. Aynı yük, textContent aracılığıyla düz metin olarak kullanıldığında zararsızdır; tarayıcı etiketleri değil, yalnızca karakterleri görür.
// VULNERABLE
div.innerHTML = `Hi, ${user.name}`;
// SAFE
div.textContent = `Hi, ${user.name}`;Düz Metin İçin textContent Kullanın
textContent yalnızca metin ayarlar; HTML özel karakterleri etiket olarak değil, gerçek karakterler olarak görünür. Bu, zamanın %90'ında kullanmanız gereken araçtır. innerHTML'ye yalnızca gerçekten biçimlendirme oluşturmanız gerektiğinde, metin için değil, geçin.
Yapı İçin DOM Yöntemlerini Kullanın
Kullanıcı verileriyle öğeler oluşturmak için bunları createElement ve textContent ile oluşturun: const li = document.createElement("li"); li.textContent = name; ul.appendChild(li);. Sonuç, yapısal olarak innerHTML ile aynıdır; ancak tasarımı gereği XSS'e karşı güvenlidir.
innerHTML Kullanmanız Gerektiğinde
Sunucu tarafından üretilen güvenilir HTML (kendi şablonunuzun çıktısı veya güvenilir bir düzenleyiciden gelen temizlenmiş zengin metin) için innerHTML uygundur. Güvenilmeyen kaynaklardan gelen verilere, temizleme uygulamadan asla doğrudan uygulamayın.
Zengin Metni DOMPurify ile Temizleyin
Kullanıcılar zengin metin gönderiyorsa (yorum düzenleyicisi veya Markdown oluşturma gibi), innerHTML'yi ayarlamadan önce temizleyin: el.innerHTML = DOMPurify.sanitize(richHtml). DOMPurify, <b>, <em> ve <a> gibi güvenli biçimlendirmeyi korurken tehlikeli etiketleri ve öznitelikleri kaldırır.
insertAdjacentHTML Aynı Riski Taşır
el.insertAdjacentHTML("beforeend", html), HTML dizelerini ayrıştırır; innerHTML ile aynı XSS saldırı yüzeyine sahiptir. Aynı kurallar geçerlidir: kullanıcı verilerini doğrudan vermeyin; temizleyin veya DOM yöntemlerini kullanın. Aynı durum document.write için de geçerlidir; ancak bunu artık kimse kullanmamalıdır.
Çerçevelerin Varsayılanları
React, Vue, Svelte ve Angular, yerleştirilen metni varsayılan olarak kaçırır; {name} güvenlidir. Bu çerçeveler, aynı XSS riskini taşıyan kaçış yolları sunar (dangerouslySetInnerHTML React'te, v-html Vue'da); bunları temizleme işlemiyle birlikte ve ölçülü kullanın.
Öznitelik Enjeksiyonu
Öznitelik değerleri bile saldırı vektörü olabilir: <a href={url}> içinde url="javascript:alert(1)" bulunması, bağlantıya tıklandığında kodu çalıştırır. Kullanıcı girdisini href, src veya URL taşıyan diğer özniteliklere yerleştirmeden önce URL'leri şema bazında doğrulayın (yalnızca http:, https:, mailto: ve tel: şemalarına izin verin).
Güvenilir Türler Politikası
Güncel tarayıcılar Trusted Types desteği sunar: CSP'yi require-trusted-types-for 'script' ile yapılandırdığınızda innerHTML ham dizeleri reddeder ve yalnızca politika tarafından sarılmış değerleri kabul eder. Böylece XSS, disipline değil API'ye dayalı olarak olanaksız hâle gelir.
Katmanlı Savunma
Tek bir katman yeterli değildir. Şunları birleştirin: sunucuda girdi doğrulama, oluşturma sırasında çıktının kaçışlanması, enjekte edilen betikleri engellemek için CSP, ham dizeleri reddetmek için Güvenilir Türler ve herhangi bir innerHTML kullanımı için güvenlik incelemesi. Katmanlı savunma, herhangi bir katmandaki hatadan sağ çıkar.
Bilginizi Sınayın
el.textContent = userInput XSS'ye karşı güvenliyken el.innerHTML = userInput neden tehlikelidir?
Özet
Kullanıcı girdisinde innerHTML, klasik XSS vektörüdür. Metin için textContent, yapı için createElement+textContent, zengin HTML gerektiğinde bir HTML arındırıcısı kullanın. Öznitelik değerleri için URL şemalarını doğrulayın. Kod incelemesinden kaçan hataları etkisizleştirmek için CSP ve Güvenilir Türler'i katmanlayın. Modern çerçeveler varsayılan olarak kaçışlama yapar; güvenli olmayan kaçış yollarını seyrek kullanın ve inceleyin.
Sıkça Sorulan Sorular
“innerHTML ile XSS ve Bunu Önleme” dersi ücretsiz mi?
Evet — “innerHTML ile XSS ve Bunu Önleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve HTML Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. HTML Academy kursu toplamda 4 dersten oluşur.
“innerHTML ile XSS ve Bunu Önleme” dersinde ne öğreneceğim?
Siteler arası betik çalıştırmayı ve innerHTML yerine güvenli seçenekleri anlayın HTML Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
HTML Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te HTML Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“innerHTML ile XSS ve Bunu Önleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu HTML Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her HTML Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İçerik Güvenliği İlkesi: meta http-equiv
- innerHTML ile XSS ve Bunu Önleme
- iframe Korumalı Alanı ve İzinler İlkesi
- HTTPS ve Alt Kaynak Bütünlüğü