🟣 PHP

สร้างระบบ Authentication ด้วย PHP 8: สอนทำระบบ Login และ Hash รหัสผ่านให้ปลอดภัย

7 นาที 21 views บันทึกเป็น PDF
สร้างระบบ Authentication ด้วย PHP 8: สอนทำระบบ Login และ Hash รหัสผ่านให้ปลอดภัย

เรียนรู้วิธีสร้างระบบ Authentication ด้วย PHP 8 ตั้งแต่การสมัครสมาชิก การ Hash รหัสผ่านด้วย password_hash ไปจนถึงการทำระบบ Login และ Protected Dashboard

Authentication System คืออะไร และทำไมโปรแกรมเมอร์มือใหม่ต้องทำเป็น?

ในโลกของการพัฒนาเว็บไซต์ Authentication System (ระบบยืนยันตัวตน) คือด่านหน้าสำคัญที่ทำหน้าที่ตรวจสอบว่า "ใครคือผู้ใช้งาน" เปรียบได้กับการที่เราต้องใช้บัตรพนักงานเพื่อสแกนเข้าออฟฟิศนั่นเอง หากไม่มีระบบนี้ ทุกคนจะสามารถเข้าถึงข้อมูลส่วนตัวหรือหน้าจัดการข้อมูลของคุณได้โดยไม่มีข้อจำกัด ซึ่งเป็นความเสี่ยงด้านความปลอดภัยที่ร้ายแรงที่สุดสำหรับนักพัฒนา

การฝึกสร้างระบบนี้ด้วย PHP 8 จะช่วยให้คุณเข้าใจพื้นฐานสำคัญ เช่น การจัดการ Session (การเก็บข้อมูลผู้ใช้ไว้ชั่วคราวขณะเปิดเว็บ) และความปลอดภัยของข้อมูล การที่คุณรู้วิธีสร้างระบบ Login ตั้งแต่ต้น จะทำให้คุณเข้าใจเบื้องหลังการทำงานของ Framework ดังๆ อย่าง Laravel หรือ Symfony ได้ง่ายขึ้นมาก เพราะทุกเครื่องมือเหล่านั้นก็สร้างขึ้นบนพื้นฐานแนวคิดเดียวกันนี้

มือใหม่หลายคนมักจะข้ามขั้นตอนการศึกษาเรื่องความปลอดภัยไปเพราะคิดว่า "ค่อยทำตอนโปรเจกต์ใหญ่ก็ได้" แต่นั่นคือจุดที่ผิดพลาดมาก เพราะนิสัยการเขียนโค้ดที่ปลอดภัยต้องถูกปลูกฝังตั้งแต่วันแรกที่เริ่มหัดเขียน password_hash() จึงเป็นฟังก์ชันพื้นฐานที่คุณต้องใช้ให้เป็น เพื่อไม่ให้รหัสผ่านของผู้ใช้งานหลุดรอดไปในรูปแบบข้อความธรรมดาหากฐานข้อมูลถูกแฮก

หัวใจสำคัญ: การเก็บรหัสผ่านด้วย password_hash()

หลายคนมักเข้าใจผิดว่าการเก็บรหัสผ่านในฐานข้อมูลสามารถเก็บเป็นข้อความตรงๆ ได้เลย เช่น 123456 แต่ในความเป็นจริง หากระบบของคุณถูกเจาะ ข้อมูลเหล่านี้จะถูกอ่านได้ทันที เราจึงต้องใช้กระบวนการที่เรียกว่า Hashing (การเปลี่ยนข้อมูลต้นฉบับให้เป็นรหัสชุดยาวที่ไม่สามารถย้อนกลับได้) เพื่อความปลอดภัยสูงสุด

ใน PHP 8 เรามีฟังก์ชัน password_hash() ที่ใช้งานง่ายและปลอดภัยสูงมาก เมื่อผู้ใช้สมัครสมาชิก เราจะทำการ Hash รหัสผ่านก่อนบันทึกลงฐานข้อมูลเสมอ และเมื่อผู้ใช้ Login เราจะใช้ฟังก์ชัน password_verify() เพื่อตรวจสอบว่ารหัสที่กรอกมานั้น ตรงกับรหัสที่ถูก Hash ไว้หรือไม่ นี่คือมาตรฐานสากลที่โปรแกรมเมอร์มืออาชีพทั่วโลกใช้งานกัน

// ตัวอย่างการ Hash รหัสผ่านก่อนเก็บลงฐานข้อมูล
$password = "mypassword123";
// สร้าง Hash ด้วยอัลกอริทึมมาตรฐาน
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);

// ตัวอย่างการตรวจสอบรหัสผ่านตอน Login
if (password_verify($password, $hashedPassword)) {
    echo "รหัสผ่านถูกต้อง!";
} else {
    echo "รหัสผ่านไม่ถูกต้อง!";
}

จากโค้ดด้านบน ฟังก์ชัน password_hash() จะสร้างสตริงที่แตกต่างกันทุกครั้งที่รัน แม้รหัสผ่านจะเป็นคำเดิมก็ตาม ส่วน password_verify() จะเป็นตัวช่วยจัดการเปรียบเทียบค่าที่ซับซ้อนให้เราโดยอัตโนมัติ ข้อควรระวังคือห้ามใช้การเข้ารหัสแบบ MD5 หรือ SHA1 แบบเดิมเด็ดขาด เพราะปัจจุบันถูกถอดรหัสได้ง่ายมากจนไม่ปลอดภัยอีกต่อไป

ขั้นตอนการประกอบร่างระบบ Authentication แบบครบวงจร

การสร้างระบบนี้มีขั้นตอนหลักที่เชื่อมโยงกัน หากคุณทำตามลำดับนี้จะช่วยให้เห็นภาพรวมได้ชัดเจนขึ้น เริ่มจากการสร้างหน้าสมัครสมาชิกเพื่อเก็บข้อมูลลงฐานข้อมูล, หน้าเข้าสู่ระบบเพื่อเช็คตัวตน, และหน้า Dashboard ที่ต้องมีการตรวจสอบ Session ก่อนแสดงผล

  1. Database Setup: สร้างตารางชื่อ users ที่มีคอลัมน์ username และ password (แนะนำให้กำหนดความยาวคอลัมน์ password ไว้ที่ 255 ตัวอักษรเพื่อรองรับการ Hash)
  2. Registration: รับค่าจากฟอร์ม, ใช้ password_hash() แล้วบันทึกลงฐานข้อมูล
  3. Login System: รับค่า username/password, ค้นหาข้อมูลจากฐานข้อมูล, ใช้ password_verify() ตรวจสอบ, หากผ่านให้สร้าง $_SESSION['user']
  4. Protected Dashboard: ในหน้า Dashboard ให้เขียนโค้ดตรวจสอบว่ามี $_SESSION อยู่หรือไม่ ถ้าไม่มีให้ header('Location: login.php') เพื่อไล่กลับไปหน้าล็อกอิน

มือใหม่มักพลาดเรื่องการลืมเขียน session_start(); ไว้ที่บรรทัดบนสุดของไฟล์ ซึ่งเป็นเรื่องปกติมาก ให้จำไว้ว่าถ้าจะใช้งาน Session ใน PHP ทุกไฟล์ต้องขึ้นต้นด้วยคำสั่งนี้เสมอ หากลืมเขียน โปรแกรมจะไม่สามารถจำสถานะการล็อกอินของผู้ใช้ได้เลย

การออกแบบ Dashboard และการจัดการ Session

เมื่อผู้ใช้ล็อกอินผ่านแล้ว เราต้องสร้างหน้า Protected Dashboard เพื่อแสดงเนื้อหาเฉพาะสมาชิกเท่านั้น หัวใจสำคัญคือการ "ปกป้อง" หน้าเพจนี้ไม่ให้ใครก็ตามที่พิมพ์ URL เข้ามาตรงๆ สามารถเห็นข้อมูลได้ หากไม่มีสิทธิ์การเข้าถึง ระบบต้องดีดผู้ใช้กลับไปหน้าล็อกอินทันที

การจัดการ Session เปรียบเสมือนการแจกบัตรคิวในธนาคาร เมื่อคุณล็อกอินผ่าน คุณจะได้บัตรคิวนี้ติดตัวไปตลอดจนกว่าคุณจะกด Logout หรือปิดเบราว์เซอร์ไป การเขียนโค้ดตรวจสอบสิทธิ์จึงเป็นการเช็คว่า "คุณมีบัตรคิวนี้อยู่ในมือไหม" ก่อนจะให้เข้าถึงส่วนต่างๆ ของระบบ

// ไฟล์ dashboard.php
session_start();

// ตรวจสอบว่าผู้ใช้ล็อกอินหรือยัง
if (!isset($_SESSION['user_id'])) {
    header("Location: login.php"); // ถ้ายังไม่ล็อกอิน ให้ดีดออก
    exit();
}

echo "ยินดีต้อนรับเข้าสู่ระบบจัดการข้อมูล!";
// ใส่ปุ่ม Logout ที่ลิงก์ไปไฟล์ logout.php

สำหรับฟังก์ชัน Logout นั้นง่ายมาก เพียงแค่คุณทำลาย Session ทิ้งด้วยคำสั่ง session_destroy(); ก็ถือเป็นการคืนบัตรคิวและจบการทำงานของระบบอย่างสมบูรณ์ อย่าลืมใช้คำสั่ง exit() หลังจากการสั่ง header() ทุกครั้ง เพื่อป้องกันไม่ให้โค้ดส่วนที่เหลือในไฟล์ทำงานต่อโดยไม่ตั้งใจ

สรุป: ก้าวแรกสู่การเป็นโปรแกรมเมอร์มืออาชีพ

การสร้างระบบ Authentication ด้วย PHP 8 ไม่ใช่แค่การทำโปรเจกต์ให้เสร็จตามสั่ง แต่คือการฝึกฝนทักษะการคิดเชิงตรรกะและการให้ความสำคัญกับความปลอดภัย ซึ่งเป็นหัวใจหลักของอาชีพโปรแกรมเมอร์ เมื่อคุณเข้าใจระบบนี้แล้ว คุณสามารถนำไปต่อยอดกับการทำระบบ Role-based Access Control (การกำหนดสิทธิ์ผู้ใช้ เช่น แอดมิน หรือ ผู้ใช้งานทั่วไป) ได้ในอนาคต

หากคุณสามารถสร้างระบบนี้ได้ด้วยตัวเองโดยไม่ดูเฉลยตลอดเวลา คุณจะมีความมั่นใจมากขึ้นอย่างแน่นอน สำหรับก้าวถัดไป ผมแนะนำให้ลองศึกษาเรื่อง Prepared Statements (การป้องกันการฉีดโค้ด SQL) เพื่ออุดช่องโหว่ที่เรียกว่า SQL Injection ซึ่งเป็นอีกหนึ่งความปลอดภัยระดับสูงที่โปรแกรมเมอร์ต้องรู้

จำไว้ว่าไม่มีใครเก่งได้ในวันเดียว การทำโปรเจกต์เล็กๆ แบบนี้ซ้ำๆ จนคล่อง จะช่วยให้คุณพร้อมสำหรับงานในบริษัทจริง การเขียนโค้ดคือทักษะที่เกิดจากการลงมือทำ หากติดบั๊ก ให้มองว่านั่นคือโอกาสในการเรียนรู้ ไม่ใช่ความล้มเหลว ขอให้สนุกกับการเขียนโค้ดครับ!

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

สอน PHP 8 จัดการฐานข้อมูล CRUD: วิธี UPDATE และ DELETE ข้อมูลอย่างปลอดภัยด้วย Bind Parameters
PHP

สอน PHP 8 จัดการฐานข้อมูล CRUD: วิธี UPDATE และ DELETE ข้อมูลอย่างปลอดภัยด้วย Bind Parameters

เรียนรู้วิธีแก้ไขและลบข้อมูลในฐานข้อมูลด้วย PHP 8 และ PDO พร้อมเทคนิคการใช้ Bind Parameters เพื่อป้องกัน SQL Injection สำหรับมือใหม่หัดเขียนเว็บ

1 month ago 6 นาที
20 views
สอนเขียน PHP 8 เชื่อมต่อฐานข้อมูลด้วย PDO ทำ CRUD อย่างปลอดภัย ป้องกัน SQL Injection
PHP

สอนเขียน PHP 8 เชื่อมต่อฐานข้อมูลด้วย PDO ทำ CRUD อย่างปลอดภัย ป้องกัน SQL Injection

เรียนรู้วิธีจัดการฐานข้อมูลด้วย PHP 8 ผ่าน PDO อย่างมืออาชีพ พร้อมเทคนิคการใช้ Prepared Statements เพื่อป้องกัน SQL Injection สำหรับมือใหม่หัดเขียนเว็บ

1 month ago 7 นาที
20 views
สอนเชื่อมต่อฐานข้อมูล MySQL ด้วย PHP 8 และ PDO ให้ปลอดภัยและมืออาชีพ
PHP

สอนเชื่อมต่อฐานข้อมูล MySQL ด้วย PHP 8 และ PDO ให้ปลอดภัยและมืออาชีพ

เรียนรู้วิธีเชื่อมต่อฐานข้อมูล MySQL ด้วย PHP PDO อย่างถูกต้อง ป้องกัน SQL Injection พร้อมตั้งค่า Error Mode เพื่อให้การแก้บั๊กทำได้ง่ายขึ้นสำหรับมือใหม่

1 month ago 8 นาที
15 views