Web Geliştiriciler için Güvenlik En İyi Uygulamaları
Web güvenliği isteğe bağlı değildir. Artan siber tehditlerle birlikte, geliştiricilerin güvenliği uygulamalarının her katmanına yerleştirmesi gerekir. Bu rehber, bugün uygulamanız gereken temel uygulamaları ele alır.
Parola Güvenliği
Asla Düz Metin Parola Saklamayın
Parolaları her zaman bcrypt, Argon2 veya scrypt gibi modern algoritmalarla karma değerine dönüştürün. Bu algoritmalar, kasıtlı olarak yavaş tasarlanmıştır; bu da kaba kuvvet saldırılarını uygulanabilir olmaktan çıkarır.
// İyi: bcrypt kullanmak
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);
Karma Algoritmaları Karşılaştırması
Tüm karma algoritmaları eşit değildir. Doğru olanı seçmek tehdit modelinize ve kullanım durumunuza bağlıdır:
| Algoritma | Çıktı Boyutu | Hız | Kullanım Durumu | Güvenlik Durumu |
|---|---|---|---|---|
| MD5 | 128-bit | Çok hızlı | Sağlama toplamları, güvenlik dışı karmalar | Güvenlik için kırılmış |
| SHA-256 | 256-bit | Hızlı | Veri bütünlüğü, dijital imzalar | Güvenli |
| bcrypt | 184-bit | Yavaş (ayarlanabilir) | Parola karması | Güvenli |
| Argon2 | Yapılandırılabilir | Yavaş (ayarlanabilir) | Parola karması (modern) | Yeni projeler için önerilir |
bcrypt ve Argon2 kasıtlı olarak yavaştır — bu bir hata değil, bir özelliktir. Her karma işlemi onlarca ya da yüzlerce milisaniye sürer; bu da büyük ölçekli kaba kuvvet saldırılarını ekonomik açıdan uygulanamaz hale getirir.
Parola Entropisini Anlamak
Parola gücü, entropi kullanılarak matematiksel olarak ölçülebilir: entropi = log2(karakter_kümesi_boyutu^uzunluk). 26 karakterlik küçük harf kullanan 8 karakterlik bir parolanın yaklaşık 37,6 bit entropisi vardır. Büyük harf, küçük harf, rakam ve sembollerden (95 karakter) oluşan 16 karakterlik bir parolanın ise yaklaşık 105 bit entropisi vardır — kırılması üstel olarak çok daha zordur. Bu nedenle çoğu kullanıcı için uzunluk, karmaşıklıktan daha önemlidir. Parola gücünün arkasındaki matematiğe daha derinlemesine bakmak için parola entropisi açıklaması rehberimize göz atın.
Bir Parola Yöneticisi Kullanın
Kullanıcılarınıza bir parola yöneticisi benimsemelerini önerin. İnsanların seçtiği parolalar, saldırganların sözlük saldırılarıyla istismar ettiği öngörülebilir desenleri izleme eğilimindedir. Parola yöneticileri gerçekten rastgele dizeler üretir ve servisler arasında parola yeniden kullanımını ortadan kaldırır — kimlik bilgisi doldurma saldırılarının en yaygın vektörlerinden biri.
Yeterli Salt Turu Kullanın
Salt turları hesaplama maliyetini belirler. Daha yüksek tur sayısı daha güvenlidir ancak daha yavaştır. Çoğu uygulama için 10–12 tur iyi bir dengedir.
Girdi Doğrulama
Hem İstemcide Hem de Sunucuda Doğrulayın
İstemci tarafı doğrulama kullanıcı deneyimini iyileştirir, ancak güvenlik için sunucu tarafı doğrulama şarttır. Asla istemci girdisine güvenmeyin.
Tüm Kullanıcı Girdisini Temizleyin
Girdiyi temizleyerek injection saldırılarını önleyin:
- SQL için parametreli sorgular kullanın
- Cross-Site Scripting (XSS) saldırılarını önlemek için HTML çıktısını kaçış karakteriyle koruyun
- Dosya yüklemelerini katı biçimde doğrulayın
Somut Saldırı Örnekleri
Gerçek saldırıları anlamak, onlara karşı savunma yapmanıza yardımcı olur. Kullanıcı girdisini doğrudan HTML içine işleyen bir yorum formu düşünün. Bir saldırgan şunu gönderir:
<script>alert('xss')</script>
Uygulama bunu kaçış karakteriyle korumadan işlerse, betik her ziyaretçinin tarayıcısında çalışır — çerezleri çalar, kullanıcıları yönlendirir veya tuş kaydedicileri yerleştirir. Çözüm: çıktıyı her zaman bağlama göre kodlayın. HTML temizleme için DOMPurify gibi kütüphaneleri kullanın.
SQL Injection da aynı derecede tehlikelidir. Bir oturum açma formunda, saldırgan kullanıcı adı olarak şunu girer:
' OR 1=1 --
Sorgu string birleştirme ile oluşturulduysa ("SELECT * FROM users WHERE username='" + input + "'") bu, kimlik doğrulamayı tamamen atlatır. -- sorgunun geri kalanını yorum satırına dönüştürür. Çözüm: her zaman parametreli sorguları (prepared statement olarak da bilinir) kullanın. Tüm büyük veritabanı kütüphaneleri bunları destekler:
// YANLIŞ: String birleştirme
db.query(`SELECT * FROM users WHERE username='${input}'`);
// DOĞRU: Parametreli sorgu
db.query('SELECT * FROM users WHERE username = $1', [input]);
İçerik Güvenliği Politikası (CSP)
Derinlemesine savunma olarak Content Security Policy başlıklarını dağıtın. CSP, tarayıcıya hangi içerik kaynaklarına güvenildiğini bildirir; bu da satır içi betikleri ve yetkisiz kaynak yüklemeyi etkili biçimde engeller. Kodunuzda bir XSS güvenlik açığı bulunsa bile, katı bir CSP, yerleştirilen betiğin çalışmasını önleyebilir. Content-Security-Policy: default-src 'self' ile başlayın ve gerektikçe istisnalar ekleyin.
Karma Fonksiyonları
Doğru Karmayı Seçmek
Farklı kullanım durumları farklı karma fonksiyonları gerektirir:
| Kullanım Durumu | Önerilen |
|---|---|
| Parolalar | bcrypt, Argon2 |
| Bütünlük | SHA-256 |
| Sağlama toplamları | SHA-256, MD5 (güvenlik dışı) |
| Hızlı karma | BLAKE3 |
Karma Çıktısını ve Çarpışmaları Anlamak
MD5, 128-bit (32 hex basamağı) bir karma üretirken, SHA-256, 256-bit (64 hex basamağı) bir karma üretir. Bu fark önemlidir: daha geniş bir çıktı uzayı, üstel olarak daha fazla olası karma değeri anlamına gelir; bu da çarpışmaları çok daha az olası kılar. Karma çarpışması, iki farklı girdinin aynı karmayı ürettiği durumda meydana gelir — karma çarpışmaları üretebilen bir saldırgan, dijital imzaları taklit edebilir veya doğrulanmış verileri kasıtlı kurcalama yoluyla bozabilir.
MD5 karma çarpışmaları modern donanımda saniyeler içinde üretilebilir. SHA-256, bilinen pratik bir saldırı bulunmadığından çarpışmaya dayanıklı kalmaya devam eder. Bu nedenle doğru bağlam için doğru algoritmayı seçmek kritiktir:
- Sağlama toplamları ve yinelenenleri ayıklama: Güvenlik bir kaygı olmadığında MD5 kabul edilebilir
- Veri bütünlüğü ve imzalar: SHA-256 güçlü çarpışma direnci sağlar
- Parola depolama: salt ve kasıtlı yavaşlık ekleyen bcrypt veya Argon2
Mesaj Kimlik Doğrulaması için HMAC
Bir mesajın hem bütünlüğünü hem de gerçekliğini doğrulamanız gerektiğinde, HMAC (Hash-based Message Authentication Code) kullanın. HMAC, bir karma fonksiyonunu gizli bir anahtarla birleştirir; böylece yalnızca anahtarı bilen taraflar etiketi üretebilir veya doğrulayabilir. Bu, API kimlik doğrulaması, webhook doğrulaması ve güvenli token üretimi için şarttır.
Güvenlik için Asla MD5 veya SHA-1 Kullanmayın
MD5 ve SHA-1 güvenlik amaçları için kırılmıştır. Kriptografik karma için SHA-256 veya SHA-3 kullanın.
Her Yerde HTTPS
TLS Aslında Ne Yapar?
TLS (Transport Layer Security) üç kritik koruma sağlar: aktarım sırasında şifreleme (gizlice dinlemeyi önler), sunucu kimlik doğrulaması (bir taklitçiyle değil, gerçek sunucuyla konuştuğunuzu kanıtlar) ve veri bütünlüğü (iletim sırasındaki herhangi bir kurcalamayı tespit etmek). TLS olmadan, kullanıcılarınız ile sunucunuz arasındaki her veri parçası — parolalar, tokenler, kişisel bilgiler — düz metin olarak iletilir.
Her Zaman TLS Kullanın
- Sertifikaları güvenilir CA’lardan edinin (Let’s Encrypt ücretsiz ve tamamen otomatiktir)
- HTTP’yi HTTPS’ye yönlendirin
- HSTS başlıkları kullanın
- TLS sürümlerini güncel tutun
HSTS ve Karışık İçerik
HTTP Strict Transport Security (HSTS) başlıkları, kullanıcı http:// yazsa bile tarayıcılara yalnızca HTTPS üzerinden bağlanmasını söyler. Bunu tüm alt alan adlarında bir yıl boyunca zorunlu kılmak için Strict-Transport-Security: max-age=31536000; includeSubDomains ayarlayın. Bu, bir saldırganın bağlantıyı HTTP’ye düşürdüğü SSL stripping saldırılarını önler.
Karışık içerik uyarılarına dikkat edin: HTTPS sayfanız HTTP üzerinden görseller, betikler veya stil sayfaları yüklerse, tarayıcılar bunları engeller veya hakkında uyarır. Sayfalarınızı sabit kodlanmış http:// URL’leri için denetleyin ve protokol-göreceli yollar kullanın ya da tüm kaynaklar için HTTPS’yi zorunlu kılın.
Kimlik Doğrulama
Hız Sınırlaması Uygulayın
Hız sınırlaması ile kaba kuvvet saldırılarını önleyin:
- IP başına oturum açma denemelerini sınırlayın
- Başarısız denemelerden sonra gecikmeler ekleyin
- Şüpheli etkinlik için CAPTCHA kullanın
JWT Kimlik Doğrulama Temelleri
JSON Web Tokens (JWT), header.payload.signature olarak yapılandırılmış durumsuz bir kimlik doğrulama mekanizması sağlar. Sunucu, token’i gizli bir anahtarla imzalar ve istemciler bunu sonraki isteklere dahil eder. Token, kullanıcının claim’lerini içerdiğinden, sunucunun her istekte oturum durumunu aramasına gerek kalmaz — bu da JWT’leri dağıtık sistemler ve mikroservisler için son derece uygun kılar.
Erişim tokenlerine her zaman kısa son kullanma süreleri ayarlayın (örneğin 15 dakika) ve yeni erişim tokenleri edinmek için yenileme tokenleri kullanın. Yenileme tokenlerini güvenli biçimde saklayın (httpOnly çerezler, localStorage değil) ve her yenileme tokeninin yalnızca bir kez kullanılabilmesi için token rotasyonu uygulayın.
Çok Faktörlü Kimlik Doğrulama (MFA)
MFA, ciddi bir uygulama için artık isteğe bağlı değildir. İkinci bir faktör — TOTP kodları (Google Authenticator), donanım anahtarları (YubiKey) veya anlık bildirimler — gerektirmek, ele geçirilmiş parolaların etkisini önemli ölçüde azaltır. Bir saldırgan geçerli kimlik bilgileri elde etse bile, ikinci faktör olmadan kimlik doğrulama yapamaz.
Oturum Sabitleme Önleme
Oturum sabitleme saldırıları, bir saldırganın kullanıcı kimlik doğrulaması yapmadan önce bilinen bir oturum kimliği belirlediğinde ortaya çıkar. Oturum açtıktan sonra saldırgan, kimliği doğrulanmış oturumu ele geçirmek için aynı oturum kimliğini kullanır. Bunu önlemek için başarılı kimlik doğrulamadan sonra oturum kimliğini her zaman yeniden üretin ve eskisini geçersiz kılın.
Güvenli Oturum Yönetimi Kullanın
- Kriptografik olarak rastgele oturum kimlikleri üretin
- Çerezlerde secure ve httpOnly bayraklarını ayarlayın
- Oturum zaman aşımı uygulayın
- Çıkışta oturumları geçersiz kılın
Güvenlik Başlıkları Kontrol Listesi
Doğru HTTP yanıt başlıklarını dağıtmak, uygulamanızı sağlamlaştırmanın en etkili ve düşük maliyetli yollarından biridir. İşte temel güvenlik başlıklarının hızlı bir başvuru tablosu:
| Başlık | Amaç | Örnek Değer |
|---|---|---|
| Content-Security-Policy | XSS ve veri injection’ı önle | default-src 'self' |
| Strict-Transport-Security | HTTPS bağlantılarını zorunlu kıl | max-age=31536000; includeSubDomains |
| X-Content-Type-Options | MIME türü tahminini önle | nosniff |
| X-Frame-Options | Clickjacking’i önle | DENY |
| Referrer-Policy | Referer bilgisini denetle | strict-origin-when-cross-origin |
Bu başlıklar web sunucu seviyesinde (Nginx, Apache), CDN/edge seviyesinde (Cloudflare, Vercel) veya uygulama framework’ünüz içinde ayarlanabilir. Başlıklarınızı securityheaders.com gibi araçlarla test edin. A+ derecesi hedefleyin — bu başlıkların çoğu tek satırlık bir yapılandırmadır ve dağıtmak hiçbir maliyet getirmez.
Güvenlik Araçlarımızı Kullanmak
Geliştirmenize yardımcı olacak güvenlik araçlarımızı keşfedin:
- MD5 Karma Üreticisi — Sağlama toplamları ve eski sistemler için
- UUID Üreticisi — Güvenli rastgele tanımlayıcılar için
- Rastgele Parola Üreticisi — Güçlü parolalar üretmek için
Kodlama, karma ve dönüştürme araçlarının geliştirme iş akışınıza nasıl uyduğuna dair daha geniş bir genel bakış için Temel Geliştirici Araçları Rehberimize bakın.
Sıkça Sorulan Sorular
En yaygın web güvenliği güvenlik açığı nedir?
OWASP’a göre Cross-Site Scripting (XSS) en yaygın web güvenlik açığı olmaya devam ediyor. Uygulamalar, güvenilmeyen verileri uygun doğrulama olmadan web sayfalarına dahil ettiğinde ortaya çıkar. Tüm kullanıcı girdisini temizleyerek, Content Security Policy başlıklarını kullanarak ve çıktıyı bağlama göre (HTML, JavaScript, URL veya CSS) kodlayarak XSS’i önleyin.
MD5 parola karması için hâlâ güvenli mi?
Hayır — MD5 asla parola karması için kullanılmamalıdır. Hesaplama açısından hızlıdır; bu da onu kaba kuvvet ve rainbow table saldırılarına karşı savunmasız kılar. Modern GPU’lar saniyede milyarlarca MD5 karması hesaplayabilir. Bunun yerine kasıtlı olarak yavaş olan ve saldırılara direnmek için yerleşik salt içeren bcrypt, scrypt veya Argon2 kullanın.
2026’da güvenli bir parola ne kadar uzun olmalı?
En az 12 karakter önerilir, ancak 16+ karakter önemli ölçüde daha güçlü koruma sağlar. Uzunluk karmaşıklıktan daha önemlidir — “correct-horse-battery-staple” gibi 20 karakterlik bir geçiş ifadesi, “P@ss1!” gibi kısa karmaşık bir paroladan daha güçlüdür. Kritik hesaplar için parola uzunluğundan bağımsız olarak çok faktörlü kimlik doğrulamayı (MFA) etkinleştirin.
Şifreleme ile karma arasındaki fark nedir?
Şifreleme tersine çevrilebilir — bir anahtar kullanarak verileri orijinal haline geri çözebilirsiniz. Karma tek yönlüdür — bir karmadan orijinal verileri kurtaramazsınız (geri döndürülemez). Geri almanız gereken veriler için (örneğin saklanan kullanıcı verileri) şifreleme kullanın; yalnızca doğrulamanız gereken veriler için (örneğin parolalar ve sağlama toplamları) karma kullanın.
Kendi kimlik doğrulama sistemimi uygulamalı mıyım?
Hayır — kimlik doğrulamayı sıfırdan inşa etmek riskli ve hataya açıktır. Auth0, Firebase Auth veya Supabase Auth gibi savaşta sınanmış framework’leri ve hizmetleri kullanın. Bunlar parola karmasını, oturum yönetimini, token rotasyonunu, MFA’yı ve kaba kuvvet korumasını ele alır. Geliştirme zamanınızı uygulamanızın özgün özelliklerine ayırın.
Sonuç
Güvenlik bir kerelik bir görev değil, sürekli bir süreçtir. En son güvenlik açıklarından haberdar olun, kodunuzu düzenli olarak denetleyin ve en az ayrıcalık ilkesini izleyin. Kullanıcılarınız size verileriyle güveniyor — bu güvene sağlam güvenlik uygulamalarıyla saygı gösterin.