İçeriğe geç

PHP Kimlik Doğrulama

Php kimlik doğrulama makalemizin içeriğinde öncelikle kullanıcı adı ve şifrelerin veritabanına nasıl kaydedilmesi gerektiğini görecek daha sonra 2 aşamalı (2FA) doğrulama için Google Authenticator kullanımı ile ilgili basit bir örnek yapacağız.

1. Kullanıcı Girişi ve Şifre Doğrulama

Bu örnekte, kullanıcı adı ve şifre doğrulaması yapılıyor. Şifreler güvenli bir şekilde hash’lenmiş olarak saklanıyor. Günümüzde inceleme ya da bakım amacıyla iletilen çoğu projede görüyoruz ki hala şifreleri olduğu gibi veri tabanına kaydediyorlar. Olabilecek en büyük hatalardan birisi şifrleri ham haliyle kaydetmektir.

<?php
session_start();

// Veritabanı bağlantısı (örnek olarak)
$host = "localhost";
$dbname = "test_db";
$username = "root";
$password = "";

try {
    $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Veritabanı bağlantısı başarısız: " . $e->getMessage());
}

// Kullanıcı girişi işlemi
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // Kullanıcıyı veritabanında ara
    $stmt = $conn->prepare("SELECT id, password FROM users WHERE username = :username");
    $stmt->execute(['username' => $username]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($user && password_verify($password, $user['password'])) {
        // Şifre doğruysa oturum başlat
        $_SESSION['user_id'] = $user['id'];
        echo "Giriş başarılı!";
    } else {
        echo "Kullanıcı adı veya şifre hatalı.";
    }
}
?>

<!-- Giriş Formu -->
<form method="POST" action="">
    <label for="username">Kullanıcı Adı:</label>
    <input type="text" name="username" required>
    <br>
    <label for="password">Şifre:</label>
    <input type="password" name="password" required>
    <br>
    <button type="submit">Giriş Yap</button>
</form>

2. Şifre Hash’leme ve Kayıt İşlemi

Kullanıcı kaydı sırasında şifreler güvenli bir şekilde hash’lenmeli. PHP’de password_hash() ve password_verify() fonksiyonları bu iş için idealdir. İsterseniz olayı daha da karmaşıklaştırmak için sık kullanılan yöntemlerden biriside bir SALT değeri ile gelen şifre verisini harmanlayıp hash olarak kaydetmektir.

<?php
session_start();

// Veritabanı bağlantısı (örnek olarak)
$host = "localhost";
$dbname = "test_db";
$username = "root";
$password = "";

try {
    $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Veritabanı bağlantısı başarısız: " . $e->getMessage());
}

// Kullanıcı kaydı işlemi
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'];
    $password = password_hash($_POST['password'], PASSWORD_DEFAULT); // Şifreyi hash'le

    // Kullanıcıyı veritabanına ekle
    $stmt = $conn->prepare("INSERT INTO users (username, password) VALUES (:username, :password)");
    $stmt->execute(['username' => $username, 'password' => $password]);

    echo "Kullanıcı başarıyla kaydedildi!";
}
?>

<!-- Kayıt Formu -->
<form method="POST" action="">
    <label for="username">Kullanıcı Adı:</label>
    <input type="text" name="username" required>
    <br>
    <label for="password">Şifre:</label>
    <input type="password" name="password" required>
    <br>
    <button type="submit">Kayıt Ol</button>
</form>

3. Oturum Yönetimi

Kullanıcı giriş yaptıktan sonra oturum başlatılır ve oturum bilgileri kontrol edilir.

<?php
session_start();

// Kullanıcı giriş yapmış mı kontrol et
if (isset($_SESSION['user_id'])) {
    echo "Hoş geldiniz, kullanıcı ID: " . $_SESSION['user_id'];
} else {
    echo "Lütfen giriş yapın.";
}

// Çıkış yapma işlemi
if (isset($_GET['logout'])) {
    session_destroy();
    header("Location: login.php"); // Giriş sayfasına yönlendir
    exit;
}
?>

<!-- Çıkış Bağlantısı -->
<a href="?logout=1">Çıkış Yap</a>

4. İki Faktörlü Kimlik Doğrulama (2FA)

İki faktörlü kimlik doğrulama için Google Authenticator gibi bir uygulama kullanılabilir. Aşağıda, TOTP (Time-Based One-Time Password) tabanlı bir örnek bulunmaktadır.

Google Authenticator ile 2FA Örneği:

<?php
require_once 'vendor/autoload.php'; // Composer ile "sonata-project/google-authenticator" kütüphanesi kurulmalı

use Sonata\GoogleAuthenticator\GoogleAuthenticator;

$ga = new GoogleAuthenticator();

// Yeni bir secret key oluştur
$secret = $ga->generateSecret();
echo "Secret Key: " . $secret . "<br>";

// QR Code URL oluştur (Google Authenticator'a eklemek için)
$qrCodeUrl = $ga->getUrl('MyWebsite', '[email protected]', $secret);
echo "QR Code URL: <a href='$qrCodeUrl'>$qrCodeUrl</a><br>";

// Kullanıcıdan gelen kodu doğrula
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $userCode = $_POST['code'];
    if ($ga->checkCode($secret, $userCode)) {
        echo "Doğrulama başarılı!";
    } else {
        echo "Geçersiz kod.";
    }
}
?>

<!-- 2FA Doğrulama Formu -->
<form method="POST" action="">
    <label for="code">Google Authenticator Kodunuz:</label>
    <input type="text" name="code" required>
    <br>
    <button type="submit">Doğrula</button>
</form>

5. Güvenlik Önerileri

  • Şifre Hash’leme: Her zaman password_hash() ve password_verify() fonksiyonlarını kullanın.
  • SQL Injection: Veritabanı sorgularında parametreli sorgular veya hazırlanmış ifadeler (prepared statements) kullanın.
  • CSRF Koruması: Formlarda CSRF token’ları kullanın.
  • HTTPS: Tüm iletişimi HTTPS üzerinden yapın.
  • Oturum Yönetimi: Oturum bilgilerini güvenli bir şekilde saklayın ve oturum sürelerini kısıtlayın.

Bu örnekler, PHP’de temel kimlik doğrulama işlemlerini gerçekleştirmenize yardımcı olacaktır. Daha karmaşık sistemler için framework’ler (Laravel, Symfony gibi) veya hazır kütüphaneler kullanabilirsiniz.

Paylaşın: