Tekil Mesaj gösterimi
Eski 23 Nisan 2026, 23:17   #1
Çevrimdışı
DEKO
DEKO - ait Kullanıcı Resmi (Avatar)
Üyelerin profil bilgilerini yalnızca kayıtlı üyeler görüntüleyebilir. Lütfen kaydol bağlantısından üye olunuz.
yazı [PHP] Kullanıcı Kayıt, Giriş ve Güvenli Auth Sistemi - 2026 Güncel (Token + Email Doğrulama)

[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 ━━━━━━━━━━
  1. Auth.php — Merkezi auth sınıfı. register, login, logout, verifyEmail, resetPassword, check, user metodları.
  2. register.php — Kayıt formu. Canlı şifre kuralı göstergesi dahil.
  3. login.php — Giriş formu. Beni hatırla, e-posta veya kullanıcı adıyla giriş.
  4. verify.php — E-posta doğrulama sayfası.
  5. forgot-password.php — Şifre sıfırlama isteği.
  6. reset-password.php — Yeni şifre belirleme.
  7. logout.php — Güvenli çıkış (cookie + session temizleme).
  8. config/db.php — PDO bağlantısı.
  9. config/config.php — Tüm ayarlar tek yerden.
  10. auth_kurulum.sql — 3 tablo SQL scripti.
  11. 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.

Eklenmiş Dosya
Dosya tipi: zip auth_system_full.zip (58.9 KB, 0x kez indirilmiştir)

Fallen code. Broken systems. No mercy.