Giriş
Web sitelerinizde kullanıcı girişi yapmak istiyorsunuz ama karmaşık framework'lerle uğraşmak istemiyorsunuz? Bu yazıda sıfırdan, frameworksüz bir şekilde PHP ile basit ama güvenli bir login sistemi yapacağız.
Neye İhtiyacımız Var?
- PHP 7.4+
- Temel HTML/CSS bilgisi
- Bir web sunucusu (XAMPP, WAMP vb.)
- Veritabanı kurulum gerektirmez!
Adım 1: Kullanıcı Veri Dosyası (users.json)
{
"users": [
{
"id": 1,
"username": "admin",
"email": "admin@example.com",
"password": "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
"created_at": "2025-01-15"
}
]
}
Adım 2: Dosya İşlemleri (functions.php)
<?php
function loadUsers() {
$file = 'users.json';
if(!file_exists($file)) {
$data = ['users' => []];
file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT));
return $data;
}
$json = file_get_contents($file);
return json_decode($json, true);
}
function saveUsers($data) {
file_put_contents('users.json', json_encode($data, JSON_PRETTY_PRINT));
}
function findUser($username) {
$data = loadUsers();
foreach($data['users'] as $user) {
if($user['username'] === $username || $user['email'] === $username) {
return $user;
}
}
return null;
}
function addUser($username, $email, $password) {
$data = loadUsers();
// Kullanıcı zaten var mı kontrol et
if(findUser($username) || findUser($email)) {
return false;
}
$newUser = [
'id' => count($data['users']) + 1,
'username' => $username,
'email' => $email,
'password' => password_hash($password, PASSWORD_DEFAULT),
'created_at' => date('Y-m-d H:i:s')
];
$data['users'][] = $newUser;
saveUsers($data);
return true;
}
?>
Adım 3: Login Formu (login.php)
<!DOCTYPE html>
<html>
<head>
<title>Giriş Yap</title>
<style>
/* Basit CSS stilleri */
.login-form {
max-width: 400px;
margin: 50px auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}
input[type="text"], input[type="password"] {
width: 100%;
padding: 10px;
margin: 10px 0;
border: 1px solid #ccc;
border-radius: 3px;
}
button {
width: 100%;
padding: 10px;
background-color: #007bff;
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
}
</style>
</head>
<body>
<div class="login-form">
<h2>Giriş Yap</h2>
<?php if(isset($_SESSION['error'])): ?>
<div style="color: red; margin-bottom: 10px;">
<?php echo $_SESSION['error']; unset($_SESSION['error']); ?>
</div>
<?php endif; ?>
<form method="POST" action="authenticate.php">
<input type="text" name="username" placeholder="Kullanıcı Adı" required>
<input type="password" name="password" placeholder="Şifre" required>
<button type="submit">Giriş Yap</button>
</form>
<p><a href="register.php">Hesabınız yok mu? Kayıt olun</a></p>
</div>
</body>
</html>
Adım 4: Kimlik Doğrulama (authenticate.php)
<?php
session_start();
require_once 'functions.php';
if($_POST) {
$username = trim($_POST['username']);
$password = $_POST['password'];
// Kullanıcıyı dosyadan bul
$user = findUser($username);
if($user && password_verify($password, $user['password'])) {
// Giriş başarılı
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
header('Location: dashboard.php');
exit;
} else {
// Giriş başarısız
$_SESSION['error'] = 'Kullanıcı adı veya şifre hatalı!';
header('Location: login.php');
exit;
}
}
?>
Adım 5: Kayıt Formu (register.php)
<?php
session_start();
require_once 'functions.php';
if($_POST) {
$username = trim($_POST['username']);
$email = trim($_POST['email']);
$password = $_POST['password'];
$confirm_password = $_POST['confirm_password'];
// Basit validasyon
if($password !== $confirm_password) {
$_SESSION['error'] = 'Şifreler eşleşmiyor!';
header('Location: register.php');
exit;
}
// Kullanıcıyı dosyaya kaydet
if(addUser($username, $email, $password)) {
$_SESSION['success'] = 'Kayıt başarılı! Giriş yapabilirsiniz.';
header('Location: login.php');
exit;
} else {
$_SESSION['error'] = 'Bu kullanıcı adı veya email zaten kullanılıyor!';
header('Location: register.php');
exit;
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Kayıt Ol</title>
<style>
/* Aynı CSS stilleri */
.login-form {
max-width: 400px;
margin: 50px auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}
input[type="text"], input[type="email"], input[type="password"] {
width: 100%;
padding: 10px;
margin: 10px 0;
border: 1px solid #ccc;
border-radius: 3px;
}
button {
width: 100%;
padding: 10px;
background-color: #28a745;
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
}
</style>
</head>
<body>
<div class="login-form">
<h2>Kayıt Ol</h2>
<?php if(isset($_SESSION['error'])): ?>
<div style="color: red; margin-bottom: 10px;">
<?php echo $_SESSION['error']; unset($_SESSION['error']); ?>
</div>
<?php endif; ?>
<form method="POST">
<input type="text" name="username" placeholder="Kullanıcı Adı" required>
<input type="email" name="email" placeholder="Email" required>
<input type="password" name="password" placeholder="Şifre" required>
<input type="password" name="confirm_password" placeholder="Şifre Tekrar" required>
<button type="submit">Kayıt Ol</button>
</form>
<p><a href="login.php">Zaten hesabınız var mı? Giriş yapın</a></p>
</div>
</body>
</html>
## Adım 6: Korumalı Sayfa (dashboard.php)
```php
<?php
session_start();
// Giriş kontrolü
if(!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Dashboard</title>
</head>
<body>
<h1>Hoşgeldin, <?php echo htmlspecialchars($_SESSION['username']); ?>!</h1>
<p>Bu korumalı bir sayfadır.</p>
<a href="logout.php">Çıkış Yap</a>
</body>
</html>
Adım 7: Çıkış İşlemi (logout.php)
<?php
session_start();
session_destroy();
header('Location: login.php');
exit;
?>
Güvenlik Önerileri
- Şifreleri mutlaka hash'leyin (password_hash() fonksiyonu)
- JSON dosyası için yazma izinleri kontrol edin
- Session güvenliği için session_regenerate_id() kullanın
- HTTPS kullanın
- Input validasyonu yapmayı unutmayın
- users.json dosyasını web dizininizin dışında tutun (mümkünse)
Dosya Tabanlı Sistemin Avantajları
- Veritabanı kurulum gerektirmez
- Hızlı prototip geliştirme
- Hosting sınırlaması olmaz
- Backup almak kolay
- Küçük projeler için ideal
Dezavantajları
- Çok kullanıcılı sistemler için uygun değil
- Concurrent access (eş zamanlı erişim) sorunları
- Büyük veri setleri için yavaş
- Veritabanı kadar güvenli değil
Sonuç
Bu basit login sistemi ile web sitelerinizde güvenli kullanıcı girişi yapabilirsiniz. Frameworksüz çalıştığı için hafif ve hızlıdır. Üzerinde geliştirmeler yaparak daha gelişmiş özellikler ekleyebilirsiniz.
Yorumlar
Henüz yorum yapılmamış. İlk yorumu siz yapın!