
🔐 PHP PDO Login Sayfası – MD5 Şifreleme ile Güvenli Giriş
PHP PDO Login Sayfası, Web sitelerinde kullanıcı girişi oluşturmak, hem temel hem de kritik bir adımdır.
İlk olarak, giriş sistemleri kullanıcıların kimliğini doğrulamak ve hassas verilere izinsiz erişimi engellemek amacıyla kullanılır.
Bununla birlikte, kullanıcı güvenliğini sağlamak için sadece bir form oluşturmak yeterli değildir.
Veritabanı bağlantısında PDO ve şifrelemede MD5 gibi teknikler kullanmak gerekir.
Bu yazıda, PHP PDO login sayfası oluşturma sürecini ve MD5 ile şifre güvenliğini adım adım ele alacağız.
🔧 Neden PDO ve MD5 Kullanılır?
Öncelikle, PHP’de PDO (PHP Data Objects) kullanmak, modern ve güvenli veritabanı işlemleri için önerilen yöntemdir. PDO, SQL enjeksiyon gibi saldırılara karşı etkili bir savunma sağlar.
Ayrıca, kullanıcı şifrelerini doğrudan veritabanında saklamak yerine MD5 ile hash’lemek, ekstra bir güvenlik katmanı oluşturur. Bu yöntem sayesinde, şifreler düz metin olarak değil, sadece şifrelenmiş haliyle tutulur.
Sonuç olarak, PDO ve MD5 birlikte kullanıldığında, hem güvenli hem de esnek bir giriş sistemi oluşturulabilir.
PHP PDO Login Sayfası 🛠️ Veritabanı ve Bağlantı
İlk adım olarak, kullanıcı bilgilerini saklayacak bir tablo oluşturmanız gerekir:
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` char(50) NOT NULL DEFAULT '0',
`password` varchar(50) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
Ardından, PHP PDO ile veritabanı bağlantısı şu şekilde kurulabilir:
<?php
$host = '127.0.0.1';
$dbname = 'loginpdo';
$username = 'root';
$password = '';
$charset = 'utf8';
$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_PERSISTENT => false,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
$connect = new PDO($dsn, $username, $password, $options);
$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connect error: ' . $e->getMessage();
exit;
}
?>
Bu bağlantı sayesinde veritabanı işlemleri daha güvenli hale gelir.
🧾 Kayıt ve Giriş Formu
İlk olarak, kullanıcı kayıt işlemi sırasında şifreyi MD5 ile şifreleyip veritabanına kaydedebilirsiniz:
Bu kod örneğinde, kullanıcıdan gelen şifre önce md5()
fonksiyonu ile şifrelenir, ardından veritabanındaki şifre ile karşılaştırılır. Eğer eşleşirse giriş başarılı olur.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHP PDO LOGİN</title>
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/all.min.css">
<script src="js/jquery-3.4.1.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/login.js"></script>
<style>
body {background-color:#343a40;}
</style>
</head>
<body>
<?php
session_start(); //Oturumu başlattık
include("fonc.php"); //Veritabanını dahil ettik
//Oturum varsa sayfayı yeniden yönlendiriyoruz.
if (isset($_SESSION["Session"]) && $_SESSION["Session"] == "9876") {
header("location:index.php");
} //"Beni hatırla" önceden işaretlenirse, Oturum oluşturur ve sayfayı yönlendiririz.
else if (isset($_COOKIE["cookie"])) {
//Kullanıcı adları sorgulanır
$query = $connect->prepare("select user from users");
$query->execute();
//Döngü yardımıyla kullanıcı adlarını tek tek alıyoruz
while ($result = $query->fetch()) {
//Belirlediğimiz yapıya uygun bir kullanıcı varsa ona bakarız.
if ($_COOKIE["cookie"] == md5("aa" . $result['user'] . "bb")) {
//Oturum oluşturma, buradaki değerleri güvenlik açısından farklı hale getirebilirsiniz. Kullanıcı adını da burada tuttum
$_SESSION["Session"] = "9876";
$_SESSION["user"] = $result['user'];
//index sayfasına yönlendirme
header("location:index.php");
}
}
}
//Giriş formunun doldurulup doldurulmadığını kontrol ediyoruz
if ($_POST) {
$txtuser = $_POST["txtuser"]; //Kullanıcı adını değişkene atadık
$txtpassword = $_POST["txtpassword"]; //Şifreyi değişkene atadık
}
?>
<div class="container py-5">
<div class="row">
<div class="col-md-12">
<div class="col-md-12 text-center mb-5"><a href="https://github.com/barisiceny">
<img style="height:70%" src="img/logo.png"></a>
</div>
<div class="row">
<div class="col-md-6 mx-auto">
<!-- form card login -->
<div class="card rounded-0" id="login-form">
<div class="card-header">
<h3 class="mb-0">Kullanıcı Girişi</h3>
</div>
<div class="card-body">
<form class="form" action="" method="POST">
<div class="form-group">
<label for="uname1">Kullanıcı adı</label>
<input type="text" value="<?php echo @$txtuser ?>" class="form-control form-control-lg rounded-0" name="txtuser" id="inputuser" required name="txtpassword">
</div>
<div class="form-group">
<label>Parola</label>
<input type="password" class="form-control form-control-lg rounded-0" id="inputPassword" required name="txtpassword">
</div>
<label>
<input type="checkbox" ID="cbkremember" name="cbkremember"/>
Beni Hatırla
</label>
<br>
<button type="submit" class="btn btn-warning btn-lg float-right" ID="btnlogin">Giriş Yap</button>
<script type="text/javascript" src="js/sweetalert.min.js"></script>
<?php
//Bir gönderi varsa, yani gönderilirse, onu veritabanından kontrol ederiz.
if ($_POST) {
//Sorguda kullanıcı adını alıp karşılık gelen bir şifre olup olmadığını görüyoruz.
$query = $connect->prepare("select password from users where user=:user");
$query->execute(array('user' => htmlspecialchars($txtuser)));
$result = $query->fetch();//Sorguyu yürütme ve veri alma
//Şifreleri md5 ile şifreledim ve başına ve sonuna kendi şifremi ekledim.
if (md5("56" . $txtpassword . "23") == $result["password"]) {
$_SESSION["Session"] = "9876"; //Oturum oluşturma
$_SESSION["user"] = $txtuser;
//"Beni hatırla" seçilirse, bir çerez oluştururuz.
// Çerezde şifreleyerek kullanıcı adından oluşturdum
if (isset($_POST["cbkremember"])) {
setcookie("cookie", md5("aa" . $txtuser . "bb"), time() + (60 * 60 * 24 * 7));
}
echo '<script>swal("Başarılı","Başarıyla Oturum Açıldı","success").then((value)=>{ window.location.href = "index.php"}); </script>';
//Veri ekleme başarılı olursa, sweetalert ile başarılı olduğu yazılır.
// Ekleme sorgusu işe yaradıysa index.php sayfasına yönlendirir
} else {
//Kullanıcı adı ve şifre doğru girilmezse bir hata mesajı alırız.
echo '<script>swal("Oops","Hata, Lütfen Bilgilerinizi Kontrol Edin","error");</script>';
// Kimlik bulunamazsa veya sorguda bir hata varsa, bir hata yazdırırız.
}
}
?>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
MD5 ile Şifre Kaydetme

Kayıt sayfası oluştururken şifreleri MD5 ile veritabanına şu şekilde kaydedebilirsiniz:
<?php
include('fonc.php');
if ($_POST) { // Sayfada bir gönderi olup olmadığını kontrol ediyoruz.
$user = $_POST['user'];// Sayfa yenilendikten sonra, yayınlanan değerleri değişkenlere atarız
$password = md5('56' . $_POST['password'] . '23');
// Belirtilen aralıklara göre değişkenleri MD5 Formatı ile şifreliyoruz
$passwordagain = md5('56' . $_POST['passwordagain'] . '23'); // Değişkenleri MD5 Formatı ile şifreliyoruz
$error = ""; // Hatalarımızı yazdırıyoruz
if ($user <> "" && $password <> "" && $error == "") { // // Veri alanlarının boş olup olmadığını kontrol ediyoruz. Bunu diğer kontrollerde yapabilirsiniz.
//Değişecek veriler
$line = [
'user' => $user,
'password' => $password,
];
if ($password == $passwordagain && $password != '' && $user != '') { // Yeni Şifre ve Tekrarlanan Şifrenin aynı olup olmadığını kontrol etmeu
$sql = "INSERT INTO users SET user=:user, password=:password;";
// Tüm koşullar olumluysa, veri ekleme sorgumuzu yazarız.
$status = $connect->prepare($sql)->execute($line);
if ($status) {
echo '<script>swal("Yeni Kullanıcı.","Başarılı Yeni Kullanıcı Eklendi.","success").then((value)=>{ window.location.href = "index.php"}); </script>';
//Veri ekleme başarılı olursa, sweetalert ile başarılı olduğu yazılır.
// Add sorgusu çalışırsa, index.php sayfasına yönlendirir.
}
}
else {
echo '<script>swal("Hata","Hata, Lütfen bilgilerinizi kontrol edin","error");</script>';
// id bulunamazsa veya sorguda bir hata varsa, bir hata yazdırırız
}
}
if ($error != "") {
echo '<script>swal("Error","' . $error . '","Error");</script>'; // Sorgularda ve veritabanında oluşabilecek hatalarımızı yazdırıyoruz
}
}
?>
Bununla birlikte, kullanıcı adı veya şifre hatalıysa uyarı gösterilir.
Bu işlem, hem kullanıcı deneyimi hem de güvenlik açısından oldukça önemlidir.
⚠️ Güvenlik Notu ve Sonuç
Her ne kadar MD5 şifreleme kolay ve öğretici bir yöntem olsa da, günümüzde yeterli güvenlik sağlamamaktadır.
Bu nedenle, gerçek projelerde password_hash()
ve password_verify()
fonksiyonlarının kullanılması şiddetle önerilir.
Öte yandan, PHP PDO login sayfası yapısını anlamak ve öğrenmek için MD5 ideal bir başlangıç sunar. Bu yapı üzerinden daha güvenli sistemler geliştirmeniz oldukça kolay olacaktır.
Son olarak, projelerinizde güvenliği her zaman ön planda tutmalısınız.
Veri bütünlüğü ve kullanıcı gizliliği, başarılı bir sistemin temelini oluşturur.
projeyi indirin —-> Giriş Sayfası Yapımı
Bir önceki makaleme göz atın —-> PHP PDO Satır İçi Düzenleme