PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

การรีเซ็ตรหัสผ่านใหม่ กรณีเข้ารหัสข้อมูล ตอนที่ 2

09 March 2015 By


เนื้อหาตอนนี้ จะเป็นภาคต่อจากตอนที่แล้ว เรื่อง
 
แนวทาง การเข้ารหัส รหัสผ่านในฐานข้อมูล อย่างง่าย ตอนที่ 1 
http://www.ninenik.com/content.php?arti_id=604 via @ninenik
 
จะเห็นว่า กรณีที่เรามีการเก็บรหัสผ่านในฐานข้อมูลแบบเข้ารหัสนั้น คนที่จะทราบ
ว่ารหัสผ่านที่ผู้ใช้กำหนด จะเป็นเพียงตัวผู้ใช้งานเอง แต่ถ้ากรณีลืมรหัสผ่าน เราจะใช้วิธี
ส่งรหัสผ่านที่เข้ารหัส แจ้งไปทางอีเมลไม่ได้ ดังนั้น จึงเปลี่ยนเป็นการ รีเซ็ตรหัสผ่านใหม่
รูปแบบคือ 
- ผู้ใช้แจ้งลืมรหัสผ่าน โดยระบุอีเมลที่ใช้สมัตรสมาชิก ส่งคำขอมายังเว็บไซต์
- จากนั้นทางเว็บไซต์ ส่งอีเมลแนบลิ้งค์ มายังหน้า รีเซ็ตรหัสผ่านใหม่ โดยมี ข้อมูลอ้างอิง
- ผู้ใช้กดลิ้งค์จากอีเมล แล้วมาหน้า รีเซ็ตรหัสผ่านใหม่ 
- เว็บไซต์เข้ารหัส รหัสผ่านใหม่ แล้วบันทึกลงฐานข้อมูล อาจจะส่งอีเมล แจ้งรหัสผ่านใหม่ที่ผู้ใช้
กำหนดส่งไปยังอีเมลไว้ด้วยก็ได้  เพื่อสะดวกกรณีลืมอีกรหัสผ่าน และไม่ต้องการรีเซ็ตใหม่อีก
 
แนวทางเริ่มต้น
1. สร้างฟิลด์ เพื่อเก็บค่าข้อมูลเพิ่มเติม สำหรับการ รีเซ็ตรหัสผ่านใหม่ ดูโครงสร้างจากตารางฐานข้อมูล
ตัวอย่างด้านล่าง จะมีการเพิ่มฟิลด์ชื่อ reset_check กำหนดเป็น varchar ขนาด 80 ตัวอักษร เข้าไปในตาราง
ฐานข้อมูลสมาชิก
 
member_id member_name member_password member_fullname member_type reset_check
1 demo f122db007ed655921f98184e4302bba84990ff68 demo 1  
2 user1 c375f5ca90143176681418485aff1f157d64aa1c user1 2  
3 user2 1a3bad4b6e9e11d830558d84f5a6ecf658982349 user2 1  
 


2. สร้างฟอร์ม สำหรับรับค่า อีเมลของสมาชิก เพื่อใช้สำหรับส่งอีเมลแนบลิ้งค์ มายังหน้า รีเซ็ตรหัสผ่านใหม่ 
 
<form id="form1" name="form1"  method="post" action="forgotpassword.php" >
    <label for="email" >Email</label>
    <input type="email" name="email" autocomplete="off"  id="email" placeholder="Enter email" value=""><br />
    <button type="submit" id="submit_forgotpassword" value="ขอรับรหัสผ่าน" name="submit_forgotpassword" >ขอรับรหัสผ่าน</button>
</form>
 



3. ไฟล์ forgotpassword.php รับค่าอีเมล มาตรวจสอบ หากมีข้อมูลอยู่จริง ให้ทำการสร้างรหัสอ้างอิง แบบเข้ารหัส
แล้วส่งเป็นลิ้งค์ไปยังอีเมล ของสมาชิกนั้นๆ ตัวอย่างโค้ดไฟล์ forgotpassword.php
 
<?php
require_once('class.phpmailer.php');
if(isset($_POST['submit_forgotpassword']) && $_POST['email']!=""){
			$q="SELECT * FROM tbl_member WHERE  email='".addslashes(trim($_POST['email']))."' ";
			$qr=@mysql_query($q);
			if(@mysql_num_rows($qr)>0){
					$rs=@mysql_fetch_array($qr);
					$reset_refer=md5(time());
					@mysql_query("
					UPDATE  tbl_member SET 
					reset_check='".$reset_refer."' 
					WHERE member_id='".$rs['member_id']."'
					");
					
					$htmlContact='<p>อีเมลล์แจ้งขอรับรหัสผ่านใหม่ กรณีลืมรหัสผ่าน และชื่อผู้ใช้ </p>
					<p>คุณได้ทำการแจ้งลืมรหัสผ่าน และขอรับรห้สผ่านใหม่ ดังนี้</p>
					<br />
					ชื่อผู้ใช้ของคุณคือ :'.$rs['member_name'].'<br />
					รีเซ็ตรหัสผ่านใหม่ <a href="http://www.example.com/new_password.php?refer='.$reset_refer.'"> http://www.example.com/new_password.php?refer='.$reset_refer.'</a><br />
					<br />';			
				
					$mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch
				//	$mail->IsSMTP(); // telling the class to use SMTP
					$mail->IsMail(); // telling the class to use Mail() function				
					
					
					try{
						$mail->CharSet = "utf-8";			
						$mail->AddAddress($rs['email'], 'ชื่อผู้รับ'); // ส่งถึง
						$mail->SetFrom('yorwebsitemail@gmail.com', 'Example.com'); // ส่งจาก
						$mail->AddReplyTo('yorwebsitemail@gmail.com', 'Example.com'); // ตอบกลับมาที่อีเมลล์
					//	$mail->AddBCC('yorwebsitemail@gmail.com', 'Example.com');
						$mail->Subject ="หัวเรื่องอีเมลล์";  //หัวเรื่องอีเมลล์
						$mail->MsgHTML($htmlContact);  
						$mail->Send();
					}catch (phpmailerException $e){
						$msg_text="เกิดข้อผิดพลาดในการส่งอีเมลล์ กรุณาลองใหม่อีกครั้ง";
					}catch (Exception $e) {
						$msg_text="เกิดข้อผิดพลาดในการส่งอีเมลล์ กรุณาลองใหม่อีกครั้ง";
					}				
				
			}else{
				$msg_text="ไม่มีอีเมล ในระบบ กรุณาลองใหม่อีกครั้ง";
			}
}

?>
 
จากโค้ดตัวอย่างในข้อที่ 3 เป็นแนวทาง มีการใช้ phpmailer หากต้องการใช้งานสามารถใช้คำว่า phpmailer 
ค้นหาและดาวน์โหลดไฟล์ class.phpmailer.php มาใช้งานได้ ส่วนรูปแบบอีเมล หรือการกำหนดเงื่อนไขอื่นๆ 
เพิ่มเติม สามารถประยุกต์ได้ตามต้องการ
 



4. เมื่อผู้ใช้งานได้รับอีเมล รีเซ็ตรหัสผ่านใหม่ ที่แนบลิ้งค์ ค่าอ้างอิงไปด้วย (ควรแนะนำสมาชิก ให้เพิ่มอีเมล ของเรา
ไว้ใน contact หรือผู้ติดต่อ ไว้ในอีเมล เพื่อไม่ให้ข้อความอีเมล ไปอยู่ใน junk mail หรือ spam) เมื่อผู้ใช้คลิกที่ลิ้งค์
มายัง ก็จะส่ง ค่าตัวแปร GET ชื่อว่า refer มาใน url ด้วย เราจะเอาค่านี้เป็นค่าอ้างอิงสำหรับกำหนดรหัสผ่านใหม่
โดยในขึ้นตอนที่ 4 นี้เราจะสร้างไฟล์เพื่อรับค่า ชื่อ new_password.php โค้ดตัวอย่างเป็นดังโค้ดด้านล่าง
 
<form id="form2" name="form2" method="post" action="reset_password.php" >
    <label for="email" >กรอกรหัสผ่านใหม่</label>
      <input type="password" name="new_password" autocomplete="off" id="new_password" placeholder="กรอกรหัสผ่านใหม่ ที่ต้องการ" value="">
      <button type="submit" id="submit_resetpassword" value="รีเซ็ตรหัสผ่าน" name="submit_resetpassword" >รีเซ็ตรหัสผ่าน</button>
      <input name="h_refer" type="hidden" id="h_refer" value="<?=trim($_GET['refer'])?>">

</form>
 
สังเกตโค้ด new_password.php จะมีการรับค่าตัวแปร GET และเก็บไว้ใน hidden ฟิลด์ของฟอร์ม ชื่อ h_refer
ค่าอ้างอิงนี้ เราจะใช้สำหรับส่งค่าไปอัพเดท รหัสผ่านใหม่ โดยอ้างอิงฟิลด์ reset_check ในตาราง tbl_member 
ที่ตรงกัน
 



5. ไฟล์ reset_password.php ไฟล์สุดท้ายสำหรับขึ้นตอนการ รีเซ็ตรหัสผ่านใหม่ รูปแบบการทำงานจะตล้ายไฟล์
forgotpassword.php จะมีการส่งอีเมล เป็นข้อมูลให้ผู้ใช้ รวมทั้งเข้ารหัส รหัสผ่านใหม่ และบันทึกลงฐานข้อมูล
 
<?php
require_once('class.phpmailer.php');
if(isset($_POST['submit_resetpassword']) && $_POST['h_refer']!="" && $_POST['new_password']!="" ){
			$q="SELECT * FROM tbl_member WHERE  reset_check='".addslashes(trim($_POST['h_refer']))."' ";
			$qr=@mysql_query($q);
			if(@mysql_num_rows($qr)>0){
					$rs=@mysql_fetch_array($qr);
					$gen_password=sha1(md5(md5(stripslashes($_POST['password']))));  
					$reset_refer=""; // ล่างค่าเป็นว่าง
					@mysql_query("
					UPDATE  tbl_member SET 
					reset_check='".$reset_refer."' ,
					password='".$gen_password."'
					WHERE member_id='".$rs['member_id']."'
					");					
					
					$htmlContact='<p>อีเมลล์แจ้งเปลี่ยนรหัสใหม่  </p>
					<p>คุณสามารถใช้ข้อมูลต่อไปนี้ในการล็อกอินใช้งานได้  ดังนี้</p>
					<br />
					ชื่อผู้ใช้ของคุณคือ ::'.$rs['member_name'].'<br />
					รหัสผ่านของคุณคือ ::'.$_POST['new_password'].'<br />
					<br />';								
				
					$mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch
				//	$mail->IsSMTP(); // telling the class to use SMTP
					$mail->IsMail(); // telling the class to use Mail() function				
					
					
					try{
						$mail->CharSet = "utf-8";			
						$mail->AddAddress($rs['email'], 'ชื่อผู้รับ'); // ส่งถึง
						$mail->SetFrom('yorwebsitemail@gmail.com', 'Example.com'); // ส่งจาก
						$mail->AddReplyTo('yorwebsitemail@gmail.com', 'Example.com'); // ตอบกลับมาที่อีเมลล์
					//	$mail->AddBCC('yorwebsitemail@gmail.com', 'Example.com');
						$mail->Subject ="หัวเรื่องอีเมลล์";  //หัวเรื่องอีเมลล์
						$mail->MsgHTML($htmlContact);  
						$mail->Send();
					}catch (phpmailerException $e){
						$msg_text="เกิดข้อผิดพลาดในการส่งอีเมลล์ กรุณาลองใหม่อีกครั้ง";
					}catch (Exception $e) {
						$msg_text="เกิดข้อผิดพลาดในการส่งอีเมลล์ กรุณาลองใหม่อีกครั้ง";
					}				
				
			}else{
				$msg_text="ไม่มีข้อมูล ในระบบ กรุณาลองใหม่อีกครั้ง";
			}
}

?>
 
 
เป็นอันเสร็จขึ้นตอนการรีเซ็ตรหัสผ่านใหม่ กรณีรหัสผ่านมีการเข้ารหัสไว้ สามารถเป็นแนวทางนำไปประยุกต์ 
หรือดัดแปลงได้ตามต้องการ

Tags:: เข้ารหัส md5

เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน และลงชื่อติดตาม


สมัครสมาชิกได้ที่        ล็อกอินได้ที่   





URL สำหรับอ้างอิง