วันพฤหัสบดีที่ 3 เมษายน พ.ศ. 2568

สร้างระบบล็อกอินด้วย PHP และ MySQL อย่างปลอดภัย (อัปเดต 2025!)

ถ้าพูดถึงการพัฒนาเว็บแอปฯ ด้วย PHP สิ่งที่ขาดไม่ได้เลยคือ ระบบล็อกอิน 🏆 แต่ถ้าทำแบบไม่ปลอดภัยก็อาจโดนแฮกง่ายๆ 🤯 วันนี้เราจะมาทำระบบล็อกอินที่ปลอดภัยสุดๆ ด้วย PHP + MySQL กัน!


💡 สิ่งที่ต้องรู้ก่อนเริ่ม

ก่อนที่เราจะลงมือทำ ต้องเข้าใจหลักการพื้นฐานกันก่อน
✅ SQL Injection – การโจมตีที่ใช้ช่องโหว่ของ SQL Query เพื่อดึงข้อมูลออกมา หรือแม้แต่ลบข้อมูลทั้งหมดในฐานข้อมูล! 😱
✅ Password Hashing – ห้ามเก็บรหัสผ่านเป็น plain text เด็ดขาด! ต้องเข้ารหัสก่อนเสมอ
✅ Session & Cookie Security – ป้องกันการถูกขโมย session ด้วย HTTP-only cookies และการเข้ารหัส


🛠️ เตรียมเครื่องมือ

  • PHP 8.x – ใช้เวอร์ชันใหม่สุดเพื่อความปลอดภัยและความเร็ว
  • MySQL / MariaDB – ฐานข้อมูลเก็บผู้ใช้
  • phpMyAdmin – ช่วยจัดการฐานข้อมูล
  • Composer – ใช้ดึงไลบรารีเสริม
  • VS Code / PhpStorm – เลือกใช้เครื่องมือที่ถนัด


🚀 1. สร้างฐานข้อมูล MySQL

เริ่มจากสร้างฐานข้อมูลและตารางสำหรับเก็บผู้ใช้

CREATE DATABASE secure_login;
USE secure_login;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);


🔒 2. เชื่อมต่อ PHP กับฐานข้อมูล

สร้างไฟล์ db.php

<?php
$host = "localhost";
$dbname = "secure_login";
$username = "root";
$password = "";

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]);
} catch (PDOException $e) {
    die("Database connection failed: " . $e->getMessage());
}
?>


📝 3. สร้างฟอร์มสมัครสมาชิก

สร้าง register.php

<form action="register.php" method="post">
    <input type="text" name="username" placeholder="Username" required>
    <input type="email" name="email" placeholder="Email" required>
    <input type="password" name="password" placeholder="Password" required>
    <button type="submit">Register</button>
</form>


🔑 4. เขียนโค้ดสมัครสมาชิกแบบปลอดภัย

เพิ่มโค้ด PHP ใน register.php

<?php
require 'db.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = trim($_POST["username"]);
    $email = trim($_POST["email"]);
    $password = password_hash($_POST["password"], PASSWORD_DEFAULT); // เข้ารหัสรหัสผ่าน

    $stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
    try {
        $stmt->execute([$username, $email, $password]);
        echo "สมัครสมาชิกสำเร็จ!";
    } catch (PDOException $e) {
        echo "Error: " . $e->getMessage();
    }
}
?>


🔓 5. สร้างฟอร์มล็อกอิน

สร้าง login.php

<form action="login.php" method="post">
    <input type="text" name="username" placeholder="Username" required>
    <input type="password" name="password" placeholder="Password" required>
    <button type="submit">Login</button>
</form>


🔐 6. เขียนโค้ดล็อกอินแบบปลอดภัย

ใน login.php

<?php
require 'db.php';
session_start();

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = trim($_POST["username"]);
    $password = $_POST["password"];

    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
    $stmt->execute([$username]);
    $user = $stmt->fetch();

    if ($user && password_verify($password, $user['password'])) {
        $_SESSION["user_id"] = $user["id"];
        $_SESSION["username"] = $user["username"];
        header("Location: dashboard.php");
        exit;
    } else {
        echo "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง!";
    }
}
?>


🚪 7. ป้องกัน Session Hijacking และ CSRF

🔹 ใช้ session_regenerate_id(true); หลังล็อกอิน
🔹 ใช้ HTTP-only Cookies
🔹 เพิ่ม CSRF Token ในฟอร์ม

เพิ่ม CSRF Token ในฟอร์ม

<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

และตรวจสอบก่อนประมวลผล

if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die("CSRF validation failed!");
}


🏆 8. Logout และทำให้ระบบปลอดภัยขึ้น

สร้าง logout.php

<?php
session_start();
session_destroy();
header("Location: login.php");
exit;
?>


✅ สรุป

✔️ ใช้ password_hash() และ password_verify() แทนการเก็บรหัสผ่านแบบ plain text
✔️ ใช้ PDO + Prepared Statements ป้องกัน SQL Injection
✔️ ใช้ CSRF Token + Session Regeneration ป้องกันการโจมตีรูปแบบต่างๆ
✔️ ปิด Error Reporting ใน Production เพื่อไม่ให้เผยข้อมูลระบบ

ถ้าทำตามนี้ ระบบล็อกอินของคุณก็จะ ปลอดภัยขึ้นอีกระดับ! 🔥

ไม่มีความคิดเห็น:

แสดงความคิดเห็น