>  기사  >  백엔드 개발  >  PHP에서 잊어버린 비밀번호 검색 기능을 구현하는 방법

PHP에서 잊어버린 비밀번호 검색 기능을 구현하는 방법

藏色散人
藏色散人원래의
2020-11-16 09:21:404673검색

PHP에서 잊어버린 비밀번호 검색 기능을 구현하는 방법: 1. 사용자는 등록 시 이메일을 제공해야 합니다. 2. 양식을 열고 등록에 사용된 이메일을 입력합니다. 3. 데이터베이스에서 사용자 정보를 찾습니다. , 그리고 사용자의 비밀번호를 임시 비밀번호로 업데이트합니다. 4. Jmail 기능을 사용하여 비밀번호를 변경합니다.

PHP에서 잊어버린 비밀번호 검색 기능을 구현하는 방법

이 튜토리얼의 운영 환경: Windows 10 시스템, php5.6 이 문서는 모든 브랜드의 컴퓨터에 적용됩니다.

추천: "PHP 비디오 튜토리얼"

PHP 회원 비밀번호 검색 기능의 간단한 구현

아이디어 설정

1. 사용자는 등록 시 이메일을 제공해야 합니다. 목적은 이 이메일을 사용하는 것입니다. 비밀번호 비밀번호를 검색하세요.

2. 사용자가 비밀번호나 사용자 이름을 잊어버린 경우 로그인 페이지에서 "비밀번호 검색" 하이퍼링크를 클릭하고 양식을 열고 등록에 사용한 이메일 주소를 입력한 후 제출하세요.

3. 시스템은 사서함을 통해 데이터베이스에서 사용자 정보를 찾아 사용자의 비밀번호를 임시 비밀번호(예: 12345678)로 업데이트합니다.

4. 시스템은 Jmail 기능을 사용하여 사용자의 정보를 사용자의 사서함으로 보냅니다(콘텐츠에는 사용자 이름, 임시 비밀번호 및 적시에 임시 비밀번호를 변경하라는 메시지가 포함됩니다).

5. 사용자는 임시 비밀번호로 로그인할 수 있습니다.

HTML

사용자가 등록에 사용된 이메일 주소를 입력해야 하는 페이지를 비밀번호 검색 페이지에 배치한 다음 상호 작용을 처리하기 위해 프런트 엔드 JS를 제출합니다.

코드는 다음과 같습니다

<p><strong>輸入您註冊的電子郵箱,找回密碼:</strong></p> 
<p><input type="text" class="input" name="email" id="email"><span id="chkmsg"></span></p> 
<p><input type="button" class="btn" id="sub_btn" value="http://www.bitscn.com/pdb/php/201609/提 交"></p>

jQuery

사용자가 이메일 주소를 입력하고 제출을 클릭한 후 jQuery는 먼저 이메일 형식이 올바른지 확인하고, 올바른 경우 백그라운드 sendmail.php에 Ajax 요청을 보냅니다. sendmail.php는 이메일 주소가 존재하는지 확인하고 이메일을 보내고 해당 처리 결과를 프론트 페이지에 반환하는 역할을 담당합니다. jQuery 코드를 참조하세요.

코드는 다음과 같습니다

$(function(){ 
$("#sub_btn").click(function(){ 
var email = $("#email").val(); 
var preg = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*/; //匹配Email 
if(email==&#39;&#39; || !preg.test(email)){ 
$("#chkmsg").html("請填寫正確的郵箱!"); 
}else{ 
$("#sub_btn").attr("disabled","disabled").val(&#39;提交中..&#39;).css("cursor","default"); 
$.post("sendmail.php",{mail:email},function(msg){ 
if(msg=="noreg"){ 
$("#chkmsg").html("該郵箱尚未註冊!"); 
$("#sub_btn").removeAttr("disabled").val(&#39;提 交&#39;).css("cursor","pointer"); 
}else{ 
$(".demo").html("<h3>"+msg+"</h3>"); 
} 
}); 
} 
}); 
})

위에 사용된 jQuery 코드는 다음과 같습니다. 프런트 엔드 대화형 작업을 완료하는 데 매우 편리하고 간결합니다. 특정 jQuery 기반이 있는 경우 위 코드는 설명이 필요하지 않으며 설명이 필요하지 않습니다.

물론, 페이지에서 jQuery 라이브러리 파일을 로드하는 것을 잊지 마세요. 어떤 학생들은 왜 인터넷에서 다운로드한 데모를 사용할 수 없는지 묻는 경우가 80%는 jquery의 로딩 경로 때문입니다. 또는 다른 파일이 잘못되어 필요한 파일이 로드되지 않습니다.

PHP

sendmail.php는 이메일이 시스템 사용자 테이블에 있는지 확인해야 합니다. 그렇다면 사용자 정보를 읽고 md5를 사용하여 사용자 ID, 사용자 이름 및 비밀번호를 암호화하여 확인 코드로 특수 문자열을 생성합니다. 비밀번호를 검색한 다음 URL을 구성하세요. 동시에 URL 링크의 적시성을 제어하기 위해 사용자가 비밀번호 검색 작업을 제출할 때 작업 시간을 기록하고 마지막으로 이메일 전송 클래스를 호출하여 이메일을 사용자의 사서함으로 보냅니다. class smtp.class.php가 패키징되었으니 다운로드해 주세요.

코드는 다음과 같습니다

include_once("connect.php");//連接數據庫 

$email = stripslashes(trim($_POST[&#39;mail&#39;])); 

$sql = "select id,username,password from `t_user` where `email`=&#39;$email&#39;"; 
$query = mysql_query($sql); 
$num = mysql_num_rows($query); 
if($num==0){//該郵箱尚未註冊! 
echo &#39;noreg&#39;; 
exit; 
}else{ 
$row = mysql_fetch_array($query); 
$getpasstime = time(); 
$uid = $row[&#39;id&#39;]; 
$token = md5($uid.$row[&#39;username&#39;].$row[&#39;password&#39;]);//組合驗證碼 
$url = "/demo/resetpass/reset.php?email=".$email." 
&token=".$token;//構造URL 
$time = date(&#39;Y-m-d H:i&#39;); 
$result = sendmail($time,$email,$url); 
if($result==1){//郵件發送成功 
$msg = &#39;系統已向您的郵箱發送了一封郵件<br/>請登錄到您的郵箱及時重置您的密碼!&#39;; 
//更新數據發送時間 
mysql_query("update `t_user` set `getpasstime`=&#39;$getpasstime&#39; where id=&#39;$uid &#39;"); 
}else{ 
$msg = $result; 
} 
echo $msg; 
} 

//發送郵件 
function sendmail($time,$email,$url){ 
include_once("smtp.class.php"); 
$smtpserver = ""; //SMTP服務器,如smtp.163.com 
$smtpserverport = 25; //SMTP服務器端口 
$smtpusermail = ""; //SMTP服務器的用戶郵箱 
$smtpuser = ""; //SMTP服務器的用戶帳號 
$smtppass = ""; //SMTP服務器的用戶密碼 
$smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); 
//這裏面的一個true是表示使用身份驗證,否則不使用身份驗證. 
$emailtype = "HTML"; //信件類型,文本:text;網頁:HTML 
$smtpemailto = $email; 
$smtpemailfrom = $smtpusermail; 
$emailsubject = "www.bitsCN.com - 找回密碼"; 
$emailbody = "親愛的".$email.":<br/>您在".$time."提交了找回密碼請求。請點擊下面的鏈接重置密碼 
(按鈕24小時內有效)。<br/><a href=&#39;".$url."&#39;target=&#39;_blank&#39;>".$url."</a>"; 
$rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); 

return $rs; 
}

알겠습니다. 이때 귀하의 이메일은 helloweba로부터 비밀번호 검색 이메일을 받게 됩니다. 이메일 내용에 URL 링크를 클릭하면 이메일을 확인할 수 있습니다.

코드는 다음과 같습니다

include_once("connect.php");//連接數據庫 

$token = stripslashes(trim($_GET[&#39;token&#39;])); 
$email = stripslashes(trim($_GET[&#39;email&#39;])); 
$sql = "select * from `t_user` where email=&#39;$email&#39;"; 

$query = mysql_query($sql); 
$row = mysql_fetch_array($query); 
if($row){ 
$mt = md5($row[&#39;id&#39;].$row[&#39;username&#39;].$row[&#39;password&#39;]); 
if($mt==$token){ 
if(time()-$row[&#39;getpasstime&#39;]>24*60*60){ 
$msg = &#39;該鏈接已過期!&#39;; 
}else{ 
//重置密碼... 
$msg = &#39;請重新設置密碼,顯示重置密碼表單,<br/>這裏只是演示,略過。&#39;; 
} 
}else{ 
$msg = &#39;無效的鏈接&#39;; 
} 
}else{ 
$msg = &#39;錯誤的鏈接!&#39;; 
} 
echo $msg;

Reset.php는 먼저 email과 token 매개변수를 받아들인 후, 이메일을 기반으로 데이터 테이블 t_user에 이메일이 존재하는지 확인하고, 존재한다면 사용자의 정보를 획득합니다. 토큰 조합 방법은 sendmail.php 와 동일합니다. 토큰 값을 구성한 후, URL로 전달된 토큰과 비교합니다. 현재 시간과 이메일이 전송된 시간의 차이가 24시간 이상인 경우. "링크가 만료되었습니다!"라는 메시지가 표시됩니다. 그렇지 않으면 링크가 유효하고 비밀번호 설정 페이지로 리디렉션되며, 마지막으로 사용자가 직접 새 비밀번호를 설정하게 됩니다.

요약: 등록된 이메일 확인과 이 기사의 이메일을 통한 비밀번호 검색, 우리는 웹사이트 개발에서 이메일 전송의 응용과 그 중요성을 알고 있습니다. 물론 현재 SMS 확인 응용 프로그램도 인기가 있으며 이를 위해서는 관련 SMS 인터페이스 도킹이 필요합니다.

마지막으로 데이터 테이블 t_user 구조를 첨부합니다.

코드는 다음과 같습니다

CREATE TABLE `t_user` ( 
`id` int(11) NOT NULL auto_increment, 
`username` varchar(30) NOT NULL, 
`password` varchar(32) NOT NULL, 
`email` varchar(50) NOT NULL, 
`getpasstime` int(10) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

smtp.class.php 클래스 파일

코드는 다음과 같습니다

<?php

class Smtp{

/* Public Variables */

var $smtp_port;

var $time_out;

var $host_name;

var $log_file;

var $relay_host;

var $debug;

var $auth;

var $user;

var $pass;

/* Private Variables */
var $sock;

/* Constractor */

function smtp($relay_host = "", $smtp_port = 25, $auth = false, $user, $pass) {
$this->debug = false;

$this->smtp_port = $smtp_port;

$this->relay_host = $relay_host;

$this->time_out = 30; //is used in fsockopen()

$this->auth = $auth; //auth

$this->user = $user;

$this->pass = $pass;

$this->host_name = "localhost"; //is used in HELO command
$this->log_file = "";

$this->sock = false;
}

/* Main Function */

function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "") {
$mail_from = $this->get_address($this->strip_comment($from));

$body = ereg_replace("(^|(rn))(.)", "1.3", $body);

$header .= "MIME-version:1.0rn";

if ($mailtype == "HTML") {
$header .= "Content-Type:text/htmlrn";
}

$header .= "To: " . $to . "rn";

if ($cc != "") {
$header .= "Cc: " . $cc . "rn";
}

$header .= "From(www.bitsCN.com): $from<" . $from . ">rn";

$header .= "Subject: " . $subject . "rn";

$header .= $additional_headers;

$header .= "Date: " . date("r") . "rn";

$header .= "X-Mailer:By Redhat (PHP/" . phpversion() . ")rn";

list ($msec, $sec) = explode(" ", microtime());

$header .= "message-ID: <" . date("YmdHis", $sec) . "." . ($msec * 1000000) . "." . $mail_from . ">rn";

$TO = explode(",", $this->strip_comment($to));

if ($cc != "") {
$TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
}

if ($bcc != "") {
$TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
}

$sent = true;

foreach ($TO as $rcpt_to) {
$rcpt_to = $this->get_address($rcpt_to);

if (!$this->smtp_sockopen($rcpt_to)) {
$this->log_write("Error: Cannot send email to " . $rcpt_to . "n");

$sent = false;

continue;
}

if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
$this->log_write("E-mail has been sent to <" . $rcpt_to . ">n");
} else {
$this->log_write("Error: Cannot send email to <" . $rcpt_to . ">n");

$sent = false;
}

fclose($this->sock);

$this->log_write("Disconnected from remote hostn");
}

return $sent;
}

/* Private Functions */

function smtp_send($helo, $from, $to, $header, $body = "") {
if (!$this->smtp_putcmd("HELO", $helo)) {
return $this->smtp_error("sending HELO command");
}
// auth
if ($this->auth) {
if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
return $this->smtp_error("sending HELO command");
}

if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
return $this->smtp_error("sending HELO command");
}
}

if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">")) {
return $this->smtp_error("sending MAIL FROM command");
}

if (!$this->smtp_putcmd("RCPT", "TO:<" . $to . ">")) {
return $this->smtp_error("sending RCPT TO command");
}

if (!$this->smtp_putcmd("DATA")) {
return $this->smtp_error("sending DATA command");
}

if (!$this->smtp_message($header, $body)) {
return $this->smtp_error("sending message");
}

if (!$this->smtp_eom()) {
return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
}

if (!$this->smtp_putcmd("QUIT")) {
return $this->smtp_error("sending QUIT command");
}

return true;
}

function smtp_sockopen($address) {
if ($this->relay_host == "") {
return $this->smtp_sockopen_mx($address);
} else {
return $this->smtp_sockopen_relay();
}
}

function smtp_sockopen_relay() {
$this->log_write("Trying to " . $this->relay_host . ":" . $this->smtp_port . "n");

$this->sock = @ fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok())) {
$this->log_write("Error: Cannot connenct to relay host " . $this->relay_host . "n");

$this->log_write("Error: " . $errstr . " (" . $errno . ")n");

return false;
}

$this->log_write("Connected to relay host " . $this->relay_host . "n");

return true;
;
}

function smtp_sockopen_mx($address) {
$domain = ereg_replace("^.+@([^@]+)$", "1", $address);

if (!@ getmxrr($domain, $MXHOSTS)) {
$this->log_write("Error: Cannot resolve MX "" . $domain . ""n");

return false;
}

foreach ($MXHOSTS as $host) {
$this->log_write("Trying to " . $host . ":" . $this->smtp_port . "n");

$this->sock = @ fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok())) {
$this->log_write("Warning: Cannot connect to mx host " . $host . "n");

$this->log_write("Error: " . $errstr . " (" . $errno . ")n");

continue;
}

$this->log_write("Connected to mx host " . $host . "n");

return true;
}

$this->log_write("Error: Cannot connect to any mx hosts (" . implode(", ", $MXHOSTS) . ")n");

return false;
}

function smtp_message($header, $body) {
fputs($this->sock, $header . "rn" . $body);

$this->smtp_debug("> " . str_replace("rn", "n" . "> ", $header . "n> " . $body . "n> "));

return true;
}

function smtp_eom() {
fputs($this->sock, "rn.rn");

$this->smtp_debug(". [EOM]n");

return $this->smtp_ok();
}

function smtp_ok() {
$response = str_replace("rn", "", fgets($this->sock, 512));

$this->smtp_debug($response . "n");

if (!ereg("^[23]", $response)) {
fputs($this->sock, "QUITrn");

fgets($this->sock, 512);

$this->log_write("Error: Remote host returned "" . $response . ""n");

return false;
}

return true;
}

function smtp_putcmd($cmd, $arg = "") {
if ($arg != "") {
if ($cmd == "")
$cmd = $arg;

else
$cmd = $cmd . " " . $arg;
}

fputs($this->sock, $cmd . "rn");

$this->smtp_debug("> " . $cmd . "n");

return $this->smtp_ok();
}

function smtp_error($string) {
$this->log_write("Error: Error occurred while " . $string . ".n");

return false;
}

function log_write($message) {
$this->smtp_debug($message);

if ($this->log_file == "") {
return true;
}

$message = date("M d H:i:s ") . get_current_user() . "[" . getmypid() . "]: " . $message;

if (!@ file_exists($this->log_file) || !($fp = @ fopen($this->log_file, "a"))) {
$this->smtp_debug("Warning: Cannot open log file "" . $this->log_file . ""n");

return false;
;
}

flock($fp, LOCK_EX);

fputs($fp, $message);

fclose($fp);

return true;
}

function strip_comment($address) {
$comment = "([^()]*)";

while (ereg($comment, $address)) {
$address = ereg_replace($comment, "", $address);
}

return $address;
}

function get_address($address) {
$address = ereg_replace("([ trn])+", "", $address);

$address = ereg_replace("^.*<(.+)>.*$", "1", $address);

return $address;
}

function smtp_debug($message) {
if ($this->debug) {
echo $message . "
;";
}
}
}
?>

마지막에 데이터베이스 연결 클래스가 있습니다. 여기서는 소개하지 않으셔도 됩니다. 관련 데이터베이스 연결 mysql 클래스를 찾아보세요

위 내용은 PHP에서 잊어버린 비밀번호 검색 기능을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.