Password Verification: การใช้งาน password_verify()
ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการใช้ฟังก์ชัน password_hash() เพื่อสร้าง hash ของรหัสผ่านและเก็บไว้ในฐานข้อมูลอย่างปลอดภัย ในบทนี้ เราจะมาเรียนรู้วิธีการตรวจสอบว่ารหัสผ่านที่ผู้ใช้ป้อนเข้ามานั้นถูกต้องหรือไม่ โดยการเปรียบเทียบกับ hash ที่เราเก็บไว้ในฐานข้อมูล ซึ่งเราจะใช้ฟังก์ชัน password_verify() ในการดำเนินการนี้
การเปรียบเทียบ Hash ด้วย password_verify()
ฟังก์ชัน password_verify() เป็นฟังก์ชันที่ใช้ในการเปรียบเทียบรหัสผ่านที่ผู้ใช้ป้อนเข้ามากับ hash ที่ถูกสร้างขึ้นโดย password_hash() ฟังก์ชันนี้จะคืนค่า true หากรหัสผ่านตรงกัน และ false หากไม่ตรงกัน
รูปแบบการใช้งานของ password_verify() คือ:
bool password_verify ( string $password , string $hash )
$password: รหัสผ่านที่ผู้ใช้ป้อนเข้ามา (plaintext password)$hash: hash ของรหัสผ่านที่เก็บไว้ในฐานข้อมูล
ตัวอย่าง: สมมติว่าเรามี hash ของรหัสผ่านเก็บไว้ในตัวแปร $hashedPassword และผู้ใช้ป้อนรหัสผ่านเข้ามาในตัวแปร $userInputPassword เราสามารถตรวจสอบว่ารหัสผ่านถูกต้องหรือไม่ได้ดังนี้:
<?php
$hashedPassword = '$2y$10$somesaltyandrandomstring.UQDmGjU.aFv4kH9jX0f4.8/w4k3.t7'; // Hash ที่เก็บไว้ในฐานข้อมูล
$userInputPassword = 'password123'; // รหัสผ่านที่ผู้ใช้ป้อนเข้ามา
if (password_verify($userInputPassword, $hashedPassword)) {
echo 'รหัสผ่านถูกต้อง!';
} else {
echo 'รหัสผ่านไม่ถูกต้อง!';
}
?>
คำอธิบาย:
- เรากำหนดตัวแปร
$hashedPasswordให้เก็บ hash ของรหัสผ่านที่ได้จากการใช้password_hash()ในบทที่แล้ว - เรากำหนดตัวแปร
$userInputPasswordให้เก็บรหัสผ่านที่ผู้ใช้ป้อนเข้ามา - เราใช้ฟังก์ชัน
password_verify()เพื่อเปรียบเทียบรหัสผ่านที่ผู้ใช้ป้อนเข้ามากับ hash ที่เราเก็บไว้ - หาก
password_verify()คืนค่าtrueแสดงว่ารหัสผ่านถูกต้อง เราจะแสดงข้อความ "รหัสผ่านถูกต้อง!" - หาก
password_verify()คืนค่าfalseแสดงว่ารหัสผ่านไม่ถูกต้อง เราจะแสดงข้อความ "รหัสผ่านไม่ถูกต้อง!"
การจัดการเมื่อรหัสผ่านถูกต้อง
เมื่อรหัสผ่านที่ผู้ใช้ป้อนเข้ามาถูกต้อง เราจะต้องดำเนินการบางอย่าง เช่น:
- สร้าง session ให้กับผู้ใช้ เพื่อให้ผู้ใช้สามารถเข้าถึงส่วนต่างๆ ของเว็บไซต์ที่ต้องมีการยืนยันตัวตนได้
- บันทึกข้อมูลการเข้าสู่ระบบ (log in) ของผู้ใช้
- redirect ผู้ใช้ไปยังหน้า dashboard หรือหน้าอื่นๆ ที่เกี่ยวข้อง
ตัวอย่าง:
<?php
session_start(); // เริ่มต้น session
$hashedPassword = '$2y$10$somesaltyandrandomstring.UQDmGjU.aFv4kH9jX0f4.8/w4k3.t7';
$userInputPassword = 'password123';
if (password_verify($userInputPassword, $hashedPassword)) {
// รหัสผ่านถูกต้อง
$_SESSION['loggedin'] = true; // กำหนด session variable เพื่อระบุว่าผู้ใช้ได้เข้าสู่ระบบแล้ว
$_SESSION['username'] = 'john.doe'; // กำหนด session variable เพื่อเก็บ username ของผู้ใช้ (ตัวอย่าง)
// Redirect ไปยังหน้า dashboard
header('Location: dashboard.php');
exit; // อย่าลืม exit เพื่อหยุดการทำงานของ script
} else {
// รหัสผ่านไม่ถูกต้อง
echo 'รหัสผ่านไม่ถูกต้อง!';
}
?>
คำอธิบาย:
- เราเริ่มต้น session ด้วยฟังก์ชัน
session_start() - เมื่อ
password_verify()คืนค่าtrueเราจะกำหนด session variable ชื่อloggedinให้มีค่าเป็นtrueเพื่อระบุว่าผู้ใช้ได้เข้าสู่ระบบแล้ว - เราอาจจะกำหนด session variable อื่นๆ เพื่อเก็บข้อมูลของผู้ใช้ เช่น username
- เราใช้ฟังก์ชัน
header()เพื่อ redirect ผู้ใช้ไปยังหน้า dashboard - เราใช้ฟังก์ชัน
exit()เพื่อหยุดการทำงานของ script ป้องกันการ execute โค้ดที่ไม่ต้องการ
การจัดการเมื่อรหัสผ่านไม่ถูกต้อง
เมื่อรหัสผ่านที่ผู้ใช้ป้อนเข้ามาไม่ถูกต้อง เราจะต้องดำเนินการบางอย่าง เช่น:
- แสดงข้อความแจ้งเตือนให้ผู้ใช้ทราบว่ารหัสผ่านไม่ถูกต้อง
- ให้ผู้ใช้ลองป้อนรหัสผ่านใหม่อีกครั้ง
- อาจจะจำกัดจำนวนครั้งที่ผู้ใช้สามารถป้อนรหัสผ่านผิดได้ เพื่อป้องกัน brute-force attack
ตัวอย่าง:
<?php
$hashedPassword = '$2y$10$somesaltyandrandomstring.UQDmGjU.aFv4kH9jX0f4.8/w4k3.t7';
$userInputPassword = 'wrongpassword';
if (password_verify($userInputPassword, $hashedPassword)) {
// รหัสผ่านถูกต้อง (ไม่ควรเกิดขึ้นในกรณีนี้)
header('Location: dashboard.php');
exit;
} else {
// รหัสผ่านไม่ถูกต้อง
echo '<p style="color: red;">รหัสผ่านไม่ถูกต้อง กรุณาลองใหม่อีกครั้ง</p>';
// อาจจะเพิ่ม logic ในการจำกัดจำนวนครั้งที่ผู้ใช้สามารถป้อนรหัสผ่านผิดได้
}
?>
คำอธิบาย:
- เมื่อ
password_verify()คืนค่าfalseเราจะแสดงข้อความแจ้งเตือนให้ผู้ใช้ทราบว่ารหัสผ่านไม่ถูกต้อง โดยใช้ HTML และ CSS เล็กน้อยเพื่อทำให้ข้อความเด่นชัดขึ้น - ในกรณีใช้งานจริง เราอาจจะเพิ่ม logic ในการจำกัดจำนวนครั้งที่ผู้ใช้สามารถป้อนรหัสผ่านผิดได้ เพื่อป้องกัน brute-force attack (จะกล่าวถึงในบทต่อๆ ไป)
ข้อควรระวังและข้อผิดพลาดที่พบบ่อย
- อย่าลืมใช้
session_start()ก่อนที่จะใช้ session variables: หากคุณลืมsession_start()โค้ดของคุณจะไม่สามารถใช้งาน session ได้ - ตรวจสอบให้แน่ใจว่าคุณใช้ hash ที่ถูกต้อง: ตรวจสอบให้แน่ใจว่าคุณกำลังเปรียบเทียบรหัสผ่านกับ hash ที่ถูกต้องจากฐานข้อมูล
- ระวังเรื่อง case-sensitivity: รหัสผ่านมักจะเป็น case-sensitive ดังนั้นตรวจสอบให้แน่ใจว่าคุณกำลังเปรียบเทียบรหัสผ่านด้วย case ที่ถูกต้อง
- จัดการ Error อย่างเหมาะสม: หากมีข้อผิดพลาดเกิดขึ้นในระหว่างการตรวจสอบรหัสผ่าน ให้จัดการ error อย่างเหมาะสม เพื่อป้องกันไม่ให้ข้อมูลรั่วไหล
- อย่าแสดงข้อความ error ที่ละเอียดเกินไป: หลีกเลี่ยงการแสดงข้อความ error ที่บอกว่า "username นี้ไม่มีอยู่ในระบบ" หรือ "รหัสผ่านไม่ถูกต้อง" เพราะอาจจะช่วยให้ผู้ไม่หวังดีสามารถเจาะระบบได้ง่ายขึ้น
สรุป
ในบทนี้ เราได้เรียนรู้วิธีการใช้ฟังก์ชัน password_verify() เพื่อตรวจสอบรหัสผ่านที่ผู้ใช้ป้อนเข้ามากับ hash ที่เราเก็บไว้ในฐานข้อมูลอย่างปลอดภัย การใช้ฟังก์ชันนี้เป็นส่วนสำคัญในการรักษาความปลอดภัยของระบบของคุณ และป้องกันไม่ให้ผู้ไม่หวังดีสามารถเข้าถึงบัญชีของผู้ใช้ได้ ในบทถัดไป เราจะมาเรียนรู้เกี่ยวกับการจัดการ session เพื่อให้ผู้ใช้ที่ผ่านการยืนยันตัวตนแล้วสามารถเข้าถึงส่วนต่างๆ ของเว็บไซต์ที่ต้องมีการยืนยันตัวตนได้