Skip to content
Bloga Dönün
Güvenlik

Web Güvenliği Temelleri: Karma, Doğrulama ve Kimlik Doğrulama

Web güvenliği temelleri: bcrypt - Argon2 karşılaştırması, XSS ve SQL Injection önleme, JWT en iyi uygulamaları, CSP başlıkları ve MFA — JS kod örnekleriyle.

12 dakika okuma

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ı BoyutuHızKullanım DurumuGüvenlik Durumu
MD5128-bitÇok hızlıSağlama toplamları, güvenlik dışı karmalarGüvenlik için kırılmış
SHA-256256-bitHızlıVeri bütünlüğü, dijital imzalarGüvenli
bcrypt184-bitYavaş (ayarlanabilir)Parola karmasıGüvenli
Argon2YapılandırılabilirYavaş (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
Parolalarbcrypt, Argon2
BütünlükSHA-256
Sağlama toplamlarıSHA-256, MD5 (güvenlik dışı)
Hızlı karmaBLAKE3

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ıkAmaçÖrnek Değer
Content-Security-PolicyXSS ve veri injection’ı önledefault-src 'self'
Strict-Transport-SecurityHTTPS bağlantılarını zorunlu kılmax-age=31536000; includeSubDomains
X-Content-Type-OptionsMIME türü tahminini önlenosniff
X-Frame-OptionsClickjacking’i önleDENY
Referrer-PolicyReferer bilgisini denetlestrict-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:

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.