ถ้าพูดถึงการพัฒนาเว็บแอปฯ ด้วย 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 เพื่อไม่ให้เผยข้อมูลระบบ
ถ้าทำตามนี้ ระบบล็อกอินของคุณก็จะ ปลอดภัยขึ้นอีกระดับ! 🔥
ไม่มีความคิดเห็น:
แสดงความคิดเห็น