Girdi Doğrulama ve Çıktı Kodlama
Enjeksiyon ve XSS güvenlik açıklarını istismar edilmeden önce etkisizleştirmek için sunucu tarafı girdi doğrulamasını ve bağlama duyarlı çıktı kodlamasını uygulayın.
Girdi Doğrulama ve Çıktı Kodlama, CoddyKit'te ücretsiz bir Security+ Academy dersidir. Bu, 4 dersinin 1. 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, Security+ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Security+ Academy kursu toplamda 4 dersten oluşur.
Girdi Neden Tehlikelidir
Bir application'ın dışarıdan aldığı her veri — kullanıcı formu girdileri, URL parametreleri, HTTP üstbilgileri, API istek gövdeleri ve dosya yüklemeleri — potansiyel olarak saldırgan tarafından kontrol edilir. Doğrulama olmadan saldırganlar application veri akışlarına SQL komutları, HTML betikleri, Shell komutları ve XML/LDAP yönergeleri enjekte eder. Girdi doğrulama ve çıktı kodlama, enjeksiyon güvenlik açıklarını zarar vermeden önce etkisiz hâle getiren iki temel kontroldür.
Girdi Doğrulama Nedir?
Girdi doğrulama, alınan verilerin application tarafından işlenmeden önce beklenen türe, biçime, uzunluğa ve değer aralığına uygun olduğunu doğrular. Doğrulama sunucu tarafında yapılmalıdır — JavaScript'teki istemci tarafı doğrulama, istekleri Burp Suite gibi araçlarla ele geçiren saldırganlar tarafından kolayca atlatılabilir. Kullanıcı adı yalnızca alfasayısal karakterleri kabul etmelidir; tarih alanı yalnızca geçerli tarih biçimlerini kabul etmelidir; e-posta alanı RFC 5322 söz dizimiyle eşleşmelidir.
# Server-side input validation examples:
# Validate username: allow only alphanumeric and underscore
# Pattern: ^[a-zA-Z0-9_]{3,20}$
# Reject: 'admin--', "' OR 1=1--", '<script>alert(1)</script>'
# Validate age: must be integer between 0 and 120
# Reject: -1, 999, 'abc', '18; DROP TABLE users'
# Validate email: match RFC 5322 pattern, max 254 chars
# Reject: 'a@b' (too short), attacker@evil.com<script>...Allowlist ve Denylist Doğrulaması
Allowlist (beyaz liste) doğrulaması, tam olarak neye izin verildiğini belirtir ve diğer her şeyi reddeder. Denylist (kara liste) doğrulaması, neye izin verilmediğini belirtir ve diğer her şeye izin verir. Allowlist doğrulaması her zaman tercih edilir; çünkü saldırganlar denylist'leri aşmak için sürekli yeni yöntemler keşfeder. Örneğin SQL enjeksiyonu denylist'leri SELECT, UNION ve -- karakterlerini engellemeye çalışır, ancak yaratıcı kodlamalar bu filtreleri çoğu zaman aşar. Sayısal bir alan için yalnızca rakamlara izin veren bir allowlist aşılamaz.
# Allowlist (GOOD): only allow expected characters
# username_pattern = '^[a-zA-Z0-9_]{3,20}$'
# If input does not match -> reject with 400 Bad Request
# Denylist (WEAK): try to block known-bad patterns
# reject_patterns = ["'", '--', 'UNION', 'SELECT', 'DROP']
# Problem: attacker uses: SE%00LECT, UNION%0aALL, encoded chars
# Denylist is incomplete by definition -> prefer allowlistParametreli Sorgular SQL Enjeksiyonunu Önler
Veritabanı etkileşimlerinde parametreli sorgular (hazırlanmış ifadeler), SQL enjeksiyonuna karşı kesin savunmadır. Sorgu yapısı, kullanıcı tarafından sağlanan verilerden ayrı olarak tanımlanır; böylece veritabanı motoru girdiyi hiçbir zaman SQL söz dizimi olarak yorumlamaz. Kullanıcı ' OR '1'='1 girse bile bu, çalıştırılabilir SQL olarak değil, değişmez bir dize parametresi olarak ele alınır. Parametreli sorgular, tüm başlıca dillerde ve veritabanı sürücülerinde kullanılabilir.
# VULNERABLE: string concatenation (SQL injection possible)
# query = 'SELECT * FROM users WHERE name = ' + user_input
# Attack: user_input = "' OR '1'='1" -> returns ALL users
# SAFE: parameterized query
# query = 'SELECT * FROM users WHERE name = ?'
# cursor.execute(query, (user_input,))
# The ? is a placeholder; user_input is passed separately
# The DB driver handles escaping automatically
# Attack input: "' OR '1'='1" -> treated as literal stringÇıktı Kodlama Nedir?
Çıktı kodlama, verileri bir çıktı bağlamına (HTML, JavaScript, SQL, URL, Shell komutları) eklemeden önce özel karakterleri dönüştürür. Bu, bir bağlamdaki verilerin başka bir bağlamda çalıştırılabilir kod olarak yorumlanmamasını sağlar. Temel ilke bağlama duyarlı kodlamadır: uygulanan kodlama, çıktı bağlamıyla eşleşmelidir. HTML kodlaması, URL kodlaması, JavaScript kodlaması ve Shell bağımsız değişkenlerini tırnak içine alma işlemi, kendi bağlamlarındaki enjeksiyonları etkisizleştirir.
HTML Çıktı Kodlaması XSS'yi Önler
Kullanıcı tarafından sağlanan veriler HTML'de görüntülendiğinde, Siteler Arası Betik Çalıştırmayı (XSS) önlemek için özel karakterler HTML ile kodlanmalıdır. < karakteri <, > karakteri > ve & karakteri & olur. Saldırgan <script>alert('XSS')</script> girerse HTML kodlaması bunu betiği çalıştırmak yerine görünür metin olarak görüntüler. Her web framework'ü HTML kodlama işlevleri sağlar — bunları tutarlı biçimde kullanın.
# Without encoding (VULNERABLE to XSS):
# html = '<p>Hello, ' + username + '</p>'
# If username = '<script>document.cookie</script>'
# -> script executes in victim browser
# With HTML encoding (SAFE):
# html = '<p>Hello, ' + html_encode(username) + '</p>'
# html_encode('<script>...') -> '<script>...</script>'
# -> Displays as text, not executable scriptBağlama Özgü Kodlama Kuralları
Farklı çıktı bağlamları farklı kodlama stratejileri gerektirir. HTML gövdesi: < > & ' " karakterlerini kodlayın. HTML öznitelikleri: aynı karakterleri kodlayın ve tırnak içine alınmış öznitelikleri zorunlu kılın. JavaScript bağlamı: JSON kodlaması veya JavaScript dize kaçışlaması kullanın. URL parametreleri: özel karakterlere yüzde kodlaması uygulayın. Shell komutları: kullanıcı girdisinden Shell komutları oluşturmaktan tamamen kaçının; Shell yorumlayıcılarıyla dize birleştirmek yerine bağımsız değişken dizilerine sahip dil API'lerini kullanın.
# Context-aware encoding examples:
# HTML body context:
# safe_html = '<script>' (renders as text)
# URL parameter context:
# safe_url = 'search?q=hello%20world%26more'
# JavaScript string context (in JSON):
# safe_js = '{"name": "O\\u0027Reilly"}'
# Shell command (AVOID string concat - use array instead):
# UNSAFE: os.system('ping ' + user_input)
# SAFE: subprocess.run(['ping', '-c', '1', user_input])Birden Çok Katmanda Doğrulama
Girdi doğrulaması yalnızca API uç noktasında değil, birden çok katmanda gerçekleşmelidir. İstemci tarafı doğrulama, kullanıcı deneyimini (anında geri bildirim) iyileştirir, ancak güvenlik açısından buna asla güvenilmemelidir. API/controller doğrulaması, birincil güvenlik katmanıdır. Hizmet/iş mantığı doğrulaması, alan kurallarını uygular. Veritabanı kısıtlamaları (NOT NULL, CHECK, FOREIGN KEY) son savunma katmanını sağlar. Derinlemesine savunma, bir katmanın atlatılmasının hemen kötüye kullanımla sonuçlanmaması anlamına gelir.
Dosya Yükleme Doğrulaması
Dosya yükleme girdileri özellikle tehlikelidir. Saldırganlar web Shell'leri (görsel kılığında), kötü amaçlı belgeler (makrolar) veya aşırı büyük dosyalar (DoS) yükleyebilir. Doğrulama şunları içermelidir: yalnızca uzantıyı değil, içeriğe göre dosya türünü (magic bytes) doğrulamak; en büyük dosya boyutunu zorunlu kılmak; yüklemeleri web kök dizininin dışında depolamak; öngörülebilir yolları önlemek için sunucuda dosyaları yeniden adlandırmak; antivirüs/kum havuzu ile taramak ve yüklenen dosyaları doğrudan hiçbir zaman çalıştırmamak.
# File upload validation steps:
# 1. Check Content-Type header (client-provided, not trusted alone)
# 2. Read first bytes (magic bytes):
# JPEG: FF D8 FF | PNG: 89 50 4E 47 | PDF: 25 50 44 46
# 3. Reject if magic bytes don't match expected type
# 4. Enforce max size: reject > 10MB
# 5. Strip original filename, assign random UUID filename
# 6. Store in /var/uploads/ (NOT /var/www/html/)
# 7. Serve via CDN or application route (not direct URL)API'lerde Girdi Doğrulaması
Modern application'lar REST API'lerini ve GraphQL'i yoğun biçimde kullanır; bu da JSON/XML istek gövdelerinin doğrulanmasını gerektirir. JSON Schema gibi API doğrulama framework'leri zorunlu alanları, veri türlerini, dize örüntülerini ve değer aralıklarını tanımlar. GraphQL derinlik sınırlaması, derin biçimde iç içe sorguların DoS'a neden olmasını önler. İstek hızı sınırlaması, tek tek girdiler geçerli olsa bile otomatik kötüye kullanımı önler. Şema doğrulaması, isteği herhangi bir iş mantığı işlemeden önce gerçekleşmelidir.
# JSON Schema validation example:
# POST /api/register body schema:
# {
# 'type': 'object',
# 'required': ['username', 'email', 'password'],
# 'properties': {
# 'username': {'type': 'string', 'pattern': '^[a-zA-Z0-9_]{3,20}$'},
# 'email': {'type': 'string', 'format': 'email', 'maxLength': 254},
# 'password': {'type': 'string', 'minLength': 12, 'maxLength': 128}
# },
# 'additionalProperties': false
# }Hata Mesajları ve Bilgi İfşası
Kullanıcılara döndürülen hata mesajları, saldırganlara yardımcı olacak hassas bilgileri istemeden açığa çıkarabilir. Veritabanı hata mesajları tablo adlarını, sütun türlerini veya SQL söz dizimini ifşa edebilir. Yığın izleri application framework sürümlerini ve dosya yollarını açığa çıkarır. Ayrıntılı girdi doğrulama hataları, hangi karakterlerin reddedildiğini saldırgana doğrulayarak atlatma girişimleri hazırlamasına yardımcı olabilir. En iyi uygulama: istemcilere genel ve kullanıcı dostu hata mesajları (ör. 'Geçersiz girdi') döndürürken ayrıntılı hata bilgilerini geliştiricilerin hata ayıklaması için sunucu tarafında günlüklemektir. Ham istisna mesajlarını son kullanıcılara asla göstermeyin.
# UNSAFE: returning detailed database error to user
# Error: 'You have an error in your SQL syntax near ... at line 1'
# Reveals: database type (MySQL), partial query structure
# UNSAFE: stack trace in API response
# Error: 'java.sql.SQLException at com.company.UserDAO.findByName:47'
# Reveals: framework (Java), class names, line numbers
# SAFE: generic error response to client
# HTTP 400 Bad Request: { 'error': 'Invalid request parameters' }
# Server log (internal only): full exception with stack trace
# Monitoring: alert on high error rates -> investigate internallyHızlı Kontrol
Bu dersteki CompTIA Security+ (SY0-701) kavramlarını anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: allowlist'leri kullanan sunucu tarafı girdi doğrulaması, yalnızca beklenen verilerin işlenmesini sağlar; parametreli sorgular, verileri sorgu yapısından ayırarak SQL enjeksiyonunu önler; bağlama duyarlı çıktı kodlaması, özel karakterleri HTML, JavaScript, URL veya Shell bağlamlarına girmeden önce etkisizleştirerek XSS'yi ve diğer enjeksiyon saldırılarını önler. Sırada güvenli gizli bilgi yönetimini ve ortam değişkeni enjeksiyonunu inceleyeceğiz.
Sıkça Sorulan Sorular
“Girdi Doğrulama ve Çıktı Kodlama” dersi ücretsiz mi?
Evet — “Girdi Doğrulama ve Çıktı Kodlama” 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 Security+ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Security+ Academy kursu toplamda 4 dersten oluşur.
“Girdi Doğrulama ve Çıktı Kodlama” dersinde ne öğreneceğim?
Enjeksiyon ve XSS güvenlik açıklarını istismar edilmeden önce etkisizleştirmek için sunucu tarafı girdi doğrulamasını ve bağlama duyarlı çıktı kodlamasını uygulayın. Security+ 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.
Security+ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Security+ 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 1. dersidir.
“Girdi Doğrulama ve Çıktı Kodlama” 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 Security+ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Security+ 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
- Girdi Doğrulama ve Çıktı Kodlama
- Güvenli Gizli Bilgi Yönetimi ve Ortam Değişkenleri
- Bağımlılık Güvenliği ve Yazılım Bileşimi Analizi
- DevSecOps: Güvenliği İşlem Hatlarına Sola Kaydırma