[PHP] Kullanıcı Kayıt, Giriş ve Güvenli Auth Sistemi - 2026 Güncel (Token + Email Doğrulama)
Merhaba,
2026 itibarıyla güncel güvenlik pratiklerini uygulayan, sade ama sağlam bir kayıt/giriş sistemi.
━━━━━━━━━━ SİSTEM NE İÇERİYOR? ━━━━━━━━━━
Auth.php — Merkezi Sınıf
Tüm kimlik doğrulama mantığı tek bir sınıfta toplandı. Dışarıdan sadece şu metodları çağırırsınız:
Kod:
$auth = new Auth($db);
$auth->register($username, $email, $password); // Kayıt
$auth->login($identifier, $password, $remember); // Giriş
$auth->logout(); // Çıkış
$auth->verifyEmail($token); // E-posta doğrulama
$auth->requestPasswordReset($email); // Şifre sıfırlama isteği
$auth->resetPassword($token, $new_password); // Yeni şifre belirle
$auth->check(); // Oturum var mı?
$auth->user(); // Mevcut kullanıcı
$auth->isAdmin(); // Admin mi?
$auth->isMod(); // Moderatör mü?
━━━━━━━━━━ GÜVENLİK ÖZELLİKLERİ ━━━━━━━━━━
1. Argon2ID Şifre Hashleme
PHP 7.2+ ile gelen
PASSWORD_ARGON2ID algoritması kullanılıyor. bcrypt'ten daha güçlü, GPU saldırılarına karşı dirençli. Eski hash'ler giriş sırasında otomatik yeniden hashleniyor.
2. Brute-force Koruması
Aynı IP'den belirli sayıda başarısız denemeden sonra hesap geçici olarak kilitleniyor. Varsayılan: 5 deneme → 15 dakika kilit.
config.php'den ayarlanabilir.
Kod:
define('MAX_LOGIN_ATTEMPTS', 5); // Maksimum başarısız deneme
define('LOCKOUT_TIME', 900); // 15 dakika (saniye cinsinden)
3. Beni Hatırla — Selector+Validator İkili Sistem
Tek token yerine
selector:validator çifti kullanılıyor. Selector veritabanında açık tutulurken validator SHA-256 ile hashleniyor. Token çalınsa bile saldırgan oturumu ele geçiremiyor. Her giriş sonrası token yenileniyor (token rotation).
4. CSRF Koruması
Tüm formlarda
hash_equals() ile timing-safe CSRF token doğrulaması yapılıyor.
5. Session Hijacking Koruması
Oturum başlangıcında User-Agent + Accept-Language + Accept-Encoding'den
fingerprint üretiliyor. Farklı bir tarayıcıdan token kullanılmaya çalışılırsa oturum anında sonlandırılıyor.
6. E-posta Doğrulama
Kayıt sonrası 64 karakterlik güvenli rastgele token e-postayla gönderiliyor. Token 24 saat geçerli. Doğrulanmamış hesaplarla giriş yapılamıyor.
7. Şifre Sıfırlama
Sıfırlama linki 1 saat geçerli, tek kullanımlık. Kullanıldıktan sonra token veritabanından siliniyor. Şifre değişince tüm
remember_tokens da siliniyor (tüm cihazlardan çıkış).
8. Güvenli E-posta Yanıtı
"Bu e-posta kayıtlı değil" gibi bilgi sızdıran mesajlar yok. Şifre sıfırlamada her zaman aynı mesaj gösteriliyor.
━━━━━━━━━━ DOSYA YAPISI ━━━━━━━━━━
Kod:
sitem.com/
├── config/
│ ├── db.php ← PDO bağlantısı
│ └── config.php ← Site ayarları, token süreleri, şifre politikası
├── includes/
│ └── Auth.php ← Merkezi auth sınıfı
├── templates/
│ ├── head_styles.php ← Paylaşılan CSS
│ └── foot_scripts.php ← Paylaşılan JS
├── register.php ← Kayıt sayfası
├── login.php ← Giriş sayfası
├── verify.php ← E-posta doğrulama
├── forgot-password.php ← Şifre sıfırlama isteği
├── reset-password.php ← Yeni şifre belirleme
├── logout.php ← Çıkış
└── auth_kurulum.sql ← Veritabanı kurulum scripti
━━━━━━━━━━ VERİTABANI TABLOLARI ━━━━━━━━━━
SQL kurulum dosyası ekte. 3 tablo oluşturuluyor:
Kod:
-- Kullanıcılar (kayıt, doğrulama, sıfırlama alanları dahil)
users (id, username, email, password_hash, is_verified,
verify_token, verify_expires, reset_token, reset_expires,
role, is_banned, points, last_login, last_ip, created_at)
-- Beni hatırla token'ları (selector + hash ikili sistem)
remember_tokens (id, user_id, selector, token_hash, expires)
-- Brute-force login log
login_attempts (id, ip, attempted_at)
━━━━━━━━━━ KURULUM ━━━━━━━━━━
1. SQL'i çalıştır
auth_kurulum.sql dosyasını phpMyAdmin'e import et. 3 tablo otomatik oluşur.
2. db.php'yi doldur
config/db.php içindeki DB_HOST / DB_NAME / DB_USER / DB_PASS değerlerini kendi sunucuna göre düzenle.
3. config.php'yi ayarla
Kod:
define('SITE_NAME', 'SitemAdı');
define('SITE_URL', 'https://sitem.com'); // E-posta linklerinde kullanılır
define('SITE_EMAIL', 'noreply@sitem.com');
4. Dosyaları yükle ve test et
Tüm dosyaları sunucuna yükle.
register.php'ye girerek test kaydı yap, e-posta doğrulama linkine tıkla, ardından
login.php'den giriş yap.
5. Kendi projenle entegrasyon
Herhangi bir sayfada oturumu kontrol etmek için:
Kod:
<?php
session_start();
require_once 'config/db.php';
require_once 'config/config.php';
require_once 'includes/Auth.php';
$auth = new Auth($db);
if (!$auth->isLoggedIn()) {
header('Location: login.php');
exit;
}
$user = $auth->user(); // Mevcut kullanıcı bilgileri
echo 'Merhaba, ' . $user['username'];
?>
━━━━━━━━━━ AYARLANABILIR PARAMETRELER ━━━━━━━━━━
config.php dosyasından değiştirilebilen tüm ayarlar:
- EMAIL_TOKEN_TTL → 86400 (24 saat) — E-posta doğrulama linki geçerlilik süresi
- RESET_TOKEN_TTL → 3600 (1 saat) — Şifre sıfırlama linki geçerlilik süresi
- SESSION_TTL → 604800 (7 gün) — Aktif oturum zaman aşımı
- REMEMBER_COOKIE_TTL → 2592000 (30 gün) — Beni hatırla çerezi süresi
- MAX_LOGIN_ATTEMPTS → 5 — Brute-force kilit eşiği
- LOCKOUT_TIME → 900 (15 dk) — Kilit süresi
- MIN_PASSWORD_LENGTH → 8 — Minimum şifre uzunluğu
- REQUIRE_UPPERCASE → true — Büyük harf zorunluluğu
- REQUIRE_NUMBER → true — Rakam zorunluluğu
━━━━━━━━━━ ÖNEMLİ NOTLAR ━━━━━━━━━━
- SMTP desteği: Varsayılan olarak PHP'nin mail() fonksiyonu kullanılıyor. Gmail veya başka bir SMTP kullanmak için config.php'de MAIL_USE_SMTP = true yapın ve PHPMailer entegre edin.
- Cloudflare uyumu: IP tespitinde HTTP_CF_CONNECTING_IP başlığı öncelikli kontrol ediliyor. Cloudflare arkasındaki sitelerde doğru IP alınır.
- Cron önerisi: auth_kurulum.sql sonundaki yorum satırlarında eski login_attempts ve süresi dolmuş token'ları temizlemek için günlük cron sorguları var.
- Şifre politikası: config.php'den REQUIRE_UPPERCASE ve REQUIRE_NUMBER kapatılabilir. Kayıt formundaki canlı doğrulama göstergesi otomatik olarak uyum sağlar.
━━━━━━━━━━ GEREKSİNİMLER ━━━━━━━━━━
- PHP 7.4 veya üzeri (Argon2ID için PHP 7.2+, arrow function için 7.4+)
- PDO + PDO_MySQL extension
- MySQL 5.7 / MariaDB 10.3 veya üzeri
- E-posta göndermek için: mail() aktif veya SMTP erişimi
━━━━━━━━━━ EKLER ━━━━━━━━━━
- Auth.php — Merkezi auth sınıfı. register, login, logout, verifyEmail, resetPassword, check, user metodları.
- register.php — Kayıt formu. Canlı şifre kuralı göstergesi dahil.
- login.php — Giriş formu. Beni hatırla, e-posta veya kullanıcı adıyla giriş.
- verify.php — E-posta doğrulama sayfası.
- forgot-password.php — Şifre sıfırlama isteği.
- reset-password.php — Yeni şifre belirleme.
- logout.php — Güvenli çıkış (cookie + session temizleme).
- config/db.php — PDO bağlantısı.
- config/config.php — Tüm ayarlar tek yerden.
- auth_kurulum.sql — 3 tablo SQL scripti.
- auth_banner.png — Konu başlık görseli.
Test ortamı: PHP 8.2 / MariaDB 10.6. PHP 7.4 altında named arguments (type: 'video') çalışmaz, o durumda sıraya göre argüman geçin. Argon2ID için sunucunuzda libargon2 kurulu olmalıdır — phpinfo() çıktısında "argon2i" görünüyorsa desteklenmektedir.