สวัสดีครับ มาศึกษาการเข้ารหัสผ่านให้มีความปลอดภัยมากยิ่งขึ้นโดยใช้อัลกอรึทึมที่ชื่อ bcrypt กันครับ Workshop นี้สามารถใช้ได้ตั้ง PHP5.5 เป็นต้นไป ตัวอัลกอรึทึมจะมีการเก็บสตริงขนาด 60 ตัวอักษร มีความปลอดภัยสูง และเป็นการเข้ารหัสแบบทางเดียว (one-way hashing algorithm.) ก็คือไม่สามารถถอดรหัสได้นั้นเอง ซึ่งแน่นอนว่ามันปลอดภัยกว่าการเข้ารหัสแบบ md5 , sha1 ตัว bcrypt จะใช้ security parameter ค่าสุ่มที่ใส่เพิ่มเข้าไปให้รหัสที่มีการสุ่มแต่ละครั้งจะต่างกัน (salt) แม้จะเป็นรหัสผ่านตัวเดียวกันก็ได้ตาม และ ค่าความยากของการคำนวณ (cost) จะเริ่มต้นที่ 10 และมีการใช้คำสั่ง password_verify เพื่อเปรียบเทียบรหัสผ่านว่าตรงกันหรือไม่ และที่สำคัญใน Workshop นี้จะมีตัวอย่างระบบ Login Logout ตรวจสอบสิทธิ์การใช้งานด้วยครับ เผื่อไว้ครับ เผื่อได้ใช้
คลิปแสดงการทำงาน
0. ตารางข้อมูลตัวอย่าง tb_member *อย่าลืมสร้างฐานข้อมูลก่อนนะครับ ฐานข้อมูลชื่อ workshop_hashpwd
*รวมคลิปสอนสร้าง Database & SQL คลิก
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
CREATE TABLE `tb_member` ( `id` int(11) NOT NULL, `username` varchar(50) NOT NULL, `password` varchar(100) NOT NULL, `name` varchar(100) NOT NULL, `m_level` varchar(1) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `tb_member` (`id`, `username`, `password`, `name`, `m_level`) VALUES (1, 'aaa', '$2y$10$hWHZnVCIXRtUAgDf8L73GOQtfE0GSN1KequdAjJmVojS8XNAqFIb6', 'Mr.A', 'A'), (2, 'mmm', '$2y$10$pFHhkaswTsbm3l7AdtqguOSnXMol1rSu9ouuOHt845lC9gyRPL4hO', 'Mr.B', 'M'); ALTER TABLE `tb_member` ADD PRIMARY KEY (`id`); ALTER TABLE `tb_member` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; |
จากตารางข้างบนจะมีข้อมูลให้ 2 records ครับ username & password จะใส่เหมือนกัน คือ username : aaa , password : aaa และ mmm ครับ จะมีไฟล์สร้างรหัสให้ด้วย ต่อด้านล่างครับ
ความหมายของแต่ละคอลัมภ์(ฟิลด์)
id = ไอดี ลำดับ คีย์หลัก
username = บัญชีผู้ใช้
password = รหัสผ่าน
name = ชื่อสมาชิก
m_level = ระดับของสมาชิก ใน workshop นี้ใส่ A และ M เท่านั้น (A = admin , M = member)
1. สร้างโฟลเดอร์สำหรับทดสอบ Workshop ด้วยนะครับ (Workshop นี้ รองรับ PHP7 นะครับ เพราะเป็น PHP MySQLi Procedural) ชื่อโฟลเดอร์ที่แนะนำ เช่น projectLogin, passwordHash และ loginhashpassword เป็นต้น
*สำหรับคนที่ยังไม่ทราบว่าจะต้องไปสร้างไว้ที่ไหน และนำดูคลิปปรับพื้นฐานชุดนี้ครับ คลิก
2. ไฟล์เชื่อมต่อฐานข้อมูล (สร้างไว้ในโฟลเดอร์ข้างต้นในข้อ 1) connectDB.php
1 2 3 4 |
<?php $condb= mysqli_connect("localhost","root","yourPassword","workshop_hashpwd") or die("Error: " . mysqli_error($condb)); mysqli_query($condb, "SET NAMES 'utf8' "); ?> |
*อย่าลืมแก้ชื่อฐานข้อมูล Username & Password สำหรับเข้าใช้ phpMyAmin หรือ ฐานข้อมูลให้ถูกต้องนะครับ
3. ฟอร์มล็อคอิน (Login Form) หรือหน้าแรกของ Workshop index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php session_start();?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title> </title> <link rel="stylesheet" href=""> </head> <body> <h4>form Login </h4> <form action="checkLogin.php" method="post"> username <input type="text" name="username" placeholder="username" required> <br> password <input type="password" name="password" placeholder="password" required> <br> <button type="submit">Login</button> </form> <br> ไปหน้าสร้างรหัสผ่าน <a href="createPwd.php" target="_blank"> คลิก </a> </body> </html> |
*ในไฟล์นี้จะมีลิ้งค์คลิกไปยังหน้าฟอร์มสำหรับสร้างรหัสผ่านด้วยครับ ต่อด้านล่างครับ
4. ฟอร์มสร้างรหัสผ่านใหม่ createPwd.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<h4>สร้างรหัสผ่านแบบ HASH </h4> <form method="post"> password ที่ต้องการ HASH <input type="text" name="password" placeholder="password" required> <br> <button type="submit">สร้างรหัสผ่าน</button> </form> <?php if (isset($_POST['password'])) { $password = $_POST['password']; //ใส่ข้อความหรือตัวเลขตามที่ต้องการ //กำหนด cost 10 เพื่อให้การเข้ารหัสรวดเร็วยิ่งขึ้น *ตัวเลขยิ่งเยอะ ยิ่งทำงานช้า ซึ่งขึ้นอยู่กับความเร็วของคอมที่เราใช้ครับ เพราะฉะนั้น 10 ก็พอครับ หรือจะลองเพิ่มตัวเลขแล้วรันดูครับ ว่าจะดีเลเยอะไหม!! $options = [ 'cost' => 10, ]; //รหัสผ่านมาจากตาราง $store_password = $password; //นำเข้ากระบวนการเข้ารหัสด้วย PASSWORD_BCRYPT $passwordHash = password_hash($store_password, PASSWORD_BCRYPT, $options); echo ' ข้อความที่นำมาสร้างรหัสผ่าน = '.$store_password; //ลองแสดงออกมาดู ทุกครั้งที่รีเฟรซหน้าเว็บ รหัสจะสุ่มไปเรื่อยๆ echo '<hr> password hash using PASSWORD_BCRYPT <br> ' .'<h4> <font color="red">' .$passwordHash .'</font> </h4>'; echo 'คัดลอกไปใส่ในคอลัมภ์ที่เก็บ password ด้วยนะครับ'; echo '<br> <a href="index.php"> กลับหน้า Login </a>'; } ?> |
*มีคอมเม้นเพิ่มเติมในโค้ดนะครับ ในฟอร์มนี้ พอเราใส่รหัสผ่านตามที่ต้องการแล้วให้คลิกปุ่ม สร้างรหัสผ่าน แล้วคัดลอกไปใส่ในคอลัมภ์ password ที่ตาราง tb_member และให้กรอก Username, name สมมุติขึ้นมาด้วยครับ ส่วนคอลัมภ์ m_level ให้ใส่ A หรือ M เท่านั้น (A = admin , M = member)
5. ไฟล์เช็คการล็อคอิน checkLogin.php *คอมเม้นเพิ่มเติมในโค้ด
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
<?php session_start(); //ถ้ามีการส่ง input method post มาหน้านี้ if(isset($_POST['username']) && isset($_POST['password'])){ //ไฟล์เชื่อมต่อฐานข้อมูล require_once 'connectDB.php'; //รับค่าจาก input ที่ส่งมาจากฟอร์ม $username = $_POST['username']; $password = $_POST['password']; //กำหนด cost 10 เพื่อให้การเข้ารหัสรวดเร็วยิ่งขึ้น *ตัวเลขยิ่งเยอะ ยิ่งทำงานช้า ซึ่งขึ้นอยู่กับความเร็วของคอมที่เราใช้ครับ เพราะฉะนั้น 10 ก็พอครับ หรือจะลองเพิ่มตัวเลขแล้วรันดูครับ ว่าจะดีเลเยอะไหม!! $options = [ 'cost' => 10, ]; //query เช็คว่า username ตรงไหม $sql="SELECT username, password FROM tb_member WHERE username='$username'"; $result = mysqli_query($condb, $sql); //ถ้า username ถูกต้อง จะเอามาเช็ค password ต่อว่า verify แล้วถ๔กต้องไหม if(mysqli_num_rows($result)==1){ $row = mysqli_fetch_array($result); //รหัสผ่านมาจากตาราง $store_password = $row['password']; //Verify Password ตรวจสอบ password ระหว่าง $password และ $store_password $validPassword = password_verify($password, $store_password); if($validPassword){ //verify password ผ่าน เข้าเงื่อนไขนี้ //สร้าง query เพื่อเอาไปใช้งานต่อ $queryMember="SELECT id, name, m_level FROM tb_member WHERE username='$username'"; $rsMember = mysqli_query($condb, $queryMember); $rowM = mysqli_fetch_array($rsMember); //สร้างตัวแปร session $_SESSION["UserID"] = $rowM["id"]; $_SESSION["memberName"] = $rowM["name"]; $_SESSION["m_level"] = $rowM["m_level"]; //print_r ตัวแปร session ออกมาดูหน่อย echo 'แสดงข้อมูล Session ที่ได้จากด้านบน'; echo '<pre>'; print_r($_SESSION); echo '</pre>'; echo '<hr>'; echo 'Verify Users Password <br>'; //password ถูกต้อง echo '<br> <font color="blue"> password match!! </font> <br> '; //สร้างเงื่อนไขตรวจสอบระดับหรือสิทธิการใช้งาน if($_SESSION["m_level"]=='A'){ //กระโดดไปหน้าแอดมิน //Header("Location: admin.php"); //ทำต่อเองนะครับ echo 'Hi k. '.$_SESSION["memberName"]. ' level = '. $_SESSION["m_level"]; echo '<br> <a href="logout.php"> Logout </a>'; }else if($_SESSION["m_level"]=='M'){ //กระโดดไปหน้าสมาชิก //Header("Location: member.php"); //ทำต่อเองนะครับ echo 'Hi k. '.$_SESSION["memberName"]. ' level = '. $_SESSION["m_level"]; echo '<br> <a href="logout.php"> Logout </a>'; }else{ exit(); } }else{ //password ผิด //เคลียร์ session session_destroy(); echo '<font color="red"> wrong password !! </font>'; echo '<a href="index.php"> Back </a>'; } } //if(mysqli_num_rows($result)==1){ else{ //username & password ไม่ถูกต้อง session_destroy(); echo '<font color="red"> wrong Username & Password !! </font>'; echo '<a href="index.php"> Back </a>'; } } //isset //devbanban.com //คอร์สออนไลน์ https://devbanban.com/?p=2867 //ระบบพร้อมใช้ https://devbanban.com/?p=4425 ?> |
*คอมเม้นเพิ่มเติมในโค้ดครับ อ่านให้ละเอียดทุกบรรทัดเลย
6.ไฟล์ออกจากระบบ logout.php สำหรับล้างค่า เคลียร์ค่า Session ที่ถูกสร้างตอนล็อคอินสำเร็จครับ
1 2 3 4 5 |
<?php session_start(); session_destroy(); header("Location: index.php "); ?> |
ลองเอาไปประยุกต์ใช้ดูนะครับ
รายการระบบพร้อมใช้ : https://devbanban.com/?p=4425
รายการคอร์สออนไลน์ : https://devbanban.com/?cat=250
ขอแนะนำระบบพร้อมใช้งาน *รายละเอียดและราคาอยู่ใต้คลิป
ระบบพร้อมใช้ทั้งหมด คลิก
ร่วมสนับสนุน ค่ากาแฟ ค่าโฮส devbanban.com ได้ที่
ธนาคารกรุงไทย สาขาเดอะมอลล์ท่าพระ
ชื่อบัญชี นายพิศิษฐ์ บวรเลิศสุธี เลขที่ 878-0-17747-6
————————————————————————————
ธนาคารไทยพาณิชย์ สาขามหาวิทยาลัยราชภัฏธนบุรี
ชื่อบัญชี นายพิศิษฐ์ บวรเลิศสุธี เลขที่ 406-359094-1
fanpage : https://www.facebook.com/sornwebsites/