Web uygulamalarında kullanıcıların güvenli bir şekilde giriş yapmasını sağlamak için oturum yönetimi ve kimlik doğrulama sistemleri kullanılır. PHP ile güvenli bir kimlik doğrulama mekanizması nasıl yapılır anlatıyorum.
1. Veritabanı Yapılandırması
İlk olarak, kullanıcı bilgilerini saklamak için MySQL veritabanında bir users tablosu oluşturalım:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. Veritabanı Bağlantısı (database.php)
class Database {
private $host = "localhost";
private $db_name = "user_auth";
private $username = "root";
private $password = "";
public $conn;
public function getConnection() {
$this->conn = null;
try {
$this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $exception) {
echo "Connection error: " . $exception->getMessage();
}
return $this->conn;
}
}
3. Kullanıcı Kaydı (register.php)
Aşağıdaki kod, kullanıcıların güvenli bir şekilde kayıt olmasını sağlar.
include_once 'database.php';
$database = new Database();
$db = $database->getConnection();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$email = $_POST['email'];
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$query = "INSERT INTO users (username, email, password) VALUES (:username, :email, :password)";
$stmt = $db->prepare($query);
$stmt->bindParam(':username', $username);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':password', $password);
if ($stmt->execute()) {
echo "Kayıt başarılı!";
} else {
echo "Kayıt başarısız.";
}
}
4. Kullanıcı Girişi (login.php)
Kullanıcı girişini doğrulamak için aşağıdaki kodu kullanabilirsiniz:
session_start();
include_once 'database.php';
$database = new Database();
$db = $database->getConnection();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'];
$password = $_POST['password'];
$query = "SELECT id, username, password FROM users WHERE email = :email";
$stmt = $db->prepare($query);
$stmt->bindParam(':email', $email);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
echo "Giriş başarılı!";
} else {
echo "Geçersiz e-posta veya şifre.";
}
}
5. Oturum Kontrolü (session_check.php)
Kullanıcının oturumunun aktif olup olmadığını kontrol eden bir dosya:
session_start();
if (!isset($_SESSION['user_id'])) {
echo "Oturum aktif değil";
exit;
} else {
echo "Hoşgeldiniz, " . $_SESSION['username'];
}
6. Kullanıcı Çıkışı (logout.php)
Kullanıcının güvenli bir şekilde oturumu kapatmasını sağlamak için:
session_start();
session_unset();
session_destroy();
header("Location: login.php");
exit;
7. Güvenlik Önlemleri
Kimlik doğrulama sistemlerinde güvenlik kritik bir konudur. Aşağıdaki önlemleri almak gereklidir:
- Şifreleri hashleyin:
password_hash()
vepassword_verify()
kullanarak şifreleri güvenli bir şekilde saklayın. - Oturum süresini sınırlandırın: Kullanıcının belirli bir süre inaktif kalması durumunda oturumu otomatik olarak sonlandırın.
- CSRF koruması ekleyin: Formlara CSRF token ekleyerek saldırıları önleyin.
- SQL Injection önleyin: Kullanıcı girişlerini bindParam() ile koruyarak veritabanı saldırılarını engelleyin.
- HTTPS kullanın: Kullanıcı giriş bilgilerini şifrelemek için HTTPS zorunlu olmalıdır.
Kullanıcı kayıt, giriş, çıkış ve oturum doğrulama gibi temel işlevleri ekledik. Daha ileri seviyede JWT (JSON Web Token) ile kimlik doğrulama, OAuth entegrasyonu ve iki aşamalı kimlik doğrulama (2FA) ekleyerek güvenliği artırabilirsiniz.
Yorum gönder