検索
ホームページバックエンド開発PHPチュートリアルPHPメンバーパスワード取得機能実装例紹介_PHPチュートリアル

PHPメンバーパスワード取得機能実装例紹介_PHPチュートリアル

Jul 13, 2016 am 10:44 AM
php導入メンバー関数成し遂げるパスワード取得する持っているシステムWebサイト自動

あなたのウェブサイトに会員制システムがある場合、ユーザーがパスワードを忘れた場合に、メールまたは携帯電話番号から直接パスワードを取得できる自動パスワード取得機能が必要です。電子メールでパスワードを取得する方法を紹介します。

設定のアイデア

1. ユーザーは登録時に電子メールを提供する必要があります。その目的は、この電子メールを使用してパスワードを取得することです。

2. ユーザーがパスワードまたはユーザー名を忘れた場合は、ログイン ページの [パスワードを取得] ハイパーリンクをクリックしてフォームを開き、登録に使用したメール アドレスを入力して送信します。

3. システムはメールボックスを通じてデータベースからユーザー情報を検索し、ユーザーのパスワードを一時パスワード (例: 12345678) に更新します。

4. システムは、Jmail 機能を使用して、ユーザーの情報をユーザーのメールボックスに送信します (内容には、ユーザー名、一時パスワード、およびユーザーに一時パスワードの変更を促すメッセージが含まれます)。

5. ユーザーは一時パスワードを使用してログインできます。


HTML

パスワード取得ページに、登録に使用した電子メール アドレスを入力することをユーザーに要求するページを配置し、インタラクションを処理するフロントエンド JS を送信します。

jQuery
コードは次のとおりです コードをコピー

登録したメール アドレスを入力してパスワードを取得してください:



ユーザーがメール アドレスを入力して送信をクリックすると、jQuery はまずメールの形式が正しいかどうかを確認し、正しい場合は、sendmail.php に Ajax リクエストを送信します。が存在し、メールを送信すると、対応する処理が返されます。結果はフロントページに表示されます。jQuery コードを参照してください:

コードは次のとおりです$(関数(){
コードをコピー
$("#sub_btn").click(function(){

var email = $("#email").val(); var preg = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*// メールアドレスに一致
; If(email=='' || !preg.test(email)){
$("#chkmsg").html("正しいメールアドレスを入力してください!"); }その他{
$("#sub_btn").attr("無効","無効").val('送信中..').css("カーソル","デフォルト"); $.post("sendmail.php",{mail:email},function(msg){
If(msg=="noreg"){
$( "#chkmsg")。html( "このメールアドレスはまだ登録されていません!"); $("#sub_btn").removeAttr("無効").val('submit').css("カーソル","ポインター"); }その他{
$(".demo").html("

"+msg+"

");                                                                                       }); }
}); })



上記で使用されている jQuery コードは、フロントエンドの対話型操作を完了するのに非常に便利で簡潔です。ある程度の jQuery の基礎がある場合、上記のコードは一目瞭然であり、多くの説明は必要ありません。

もちろん、ページに jQuery ライブラリ ファイルをロードすることを忘れないでください。www.bKjia.c0m からダウンロードしたデモが 80% の確率で使用できないのは、jQuery のロード パスが原因であるとよく質問される学生がいます。または他のファイルが間違っているため、必要なファイルが読み込まれていません。
PHP

sendmail.php は、電子メールがシステムのユーザー テーブルに存在するかどうかを確認する必要があります。存在する場合は、ユーザー情報を読み取り、md5 を使用してユーザー ID、ユーザー名、パスワードを暗号化し、パスワードを取得するための検証コードとして特別な文字列を生成します。次に URL を構築します。同時に、URL リンクの適時性を制御するために、ユーザーがパスワード取得アクションを送信したときに操作時間を記録し、最後に電子メール送信クラスを呼び出してユーザーのメールボックスに電子メールを送信します。 class smtp.class.php がパッケージ化されていますのでダウンロードしてください。

コードは次のとおりです コードをコピー

include_once("connect.php");//データベースに接続します

$email = ストリップスラッシュ(trim($_POST['mail']));
$sql = "`t_user` から ID、ユーザー名、パスワードを選択します (`email`='$email')"; $query = mysql_query($sql); $num = mysql_num_rows($query); if($num==0){//このメール アドレスはまだ登録されていません。
「ノレグ」をエコーし​​ます。 出る
}その他{
$row = mysql_fetch_array($query); $getpasstime = 時間(); $uid = $row['id']
$token = md5($uid.$row['username'].$row['password']);//結合された検証コード
$url = "/demo/resetpass/reset.php?email=".$email."
&token=".$token;//URL を構築する
$time = date('Y-m-d H:i'); $result = sendmail($time,$email,$url); If($result==1){//メールは正常に送信されました
$msg = 'システムはメールボックスにメールを送信しました
メールボックスにログインして、パスワードを間に合うようにリセットしてください。 ';
//更新データ送信時間
mysql_query("update `t_user` set `getpasstime`='$getpasstime' where id='$uid '"); }その他{
$msg = $result; }
$msg をエコーし​​ます。 }

//メールを送信
関数 sendmail($time,$email,$url){
include_once("smtp.class.php")
$smtpserver = "" //SMTP サーバー (smtp.163.com など)
; $smtpserverport = 25 //SMTP サーバー ポート
; $smtpusermail = "" //SMTP サーバーのユーザーのメール アドレス
; $smtpuser = "" //SMTP サーバーのユーザー アカウント
; $smtppass = "" //SMTPサーバーのユーザーパスワード
; $smtp = 新しい Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); //ここで true は認証が使用されることを意味し、それ以外の場合は認証が使用されません
$emailtype = "HTML" //メールの種類、テキスト: ウェブページ: HTML
; $smtpemailto = $メール
$smtpemailfrom = $smtpusermail
$emailsubject = "www.bKjia.c0m - パスワードを取得"; $emailbody = "".$email." 様:
".$time." にパスワード取得リクエストを送信しました。パスワードをリセットするには、下のリンクをクリックしてください
(ボタンは24時間有効です)。
".$url."";
$rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype
);
$rs を返します。 }



この時点で、helloweba からパスワード取得メールが届きます。メール内容に URL リンクがあるので、www.bKjia.c0m のreset.php へのリンクをクリックしてください。

最後に、データテーブル t_user 構造体をアタッチします。
コードは次のとおりです コードをコピー

include_once("connect.php");//データベースに接続します

$token = ストリップスラッシュ(トリム($_GET['トークン'])); $email = ストリップスラッシュ(trim($_GET['email'])); $sql = "select * from `t_user` where email='$email'";
$query = mysql_query($sql); $row = mysql_fetch_array($query); if($row){
$mt = md5($row['id'].$row['ユーザー名'].$row['パスワード']); If($mt==$token){
If(time()-$row['getpasstime']>24*60*60){
$msg = 'このリンクは期限切れです。 ';
}その他{
//パスワードをリセット...
$ Msg = 'パスワードをリセットして、パスワードのリセット フォームを表示してください。 & lt; これは単なるデモンストレーションです。 ';
}
}その他{
$msg = '無効なリンク'; }
}その他{
$msg = 'リンクが間違っています! ';
}
エコー $msg;




reset.php は、まずパラメータ email と token を受け取り、次に email に基づいてデータテーブル t_user に電子メールが存在するかどうかをクエリし、存在する場合はユーザーの情報を取得し、トークンと同じ方法でトークン値を構築します。 sendmail.php の組み合わせを使用して、URL によって渡されたトークンを比較します。現在の時刻と電子メールの送信時刻の差が 24 時間以上ある場合は、「リンクの有効期限が切れています!」というメッセージが表示されます。 、これはリンクが有効であり、パスワードのリセットページにリダイレクトされることを意味します。最後に、ユーザーが自分で新しいパスワードを設定しました。

概要: この記事の登録メール認証とメール経由のパスワード取得を通じて、Web サイト開発におけるメール送信の用途とその重要性がわかりました。もちろん、現在では SMS 認証アプリケーションも人気があり、これには関連する SMS インターフェイスのドッキングが必要です。

コードは次のとおりです

コードをコピー

`id` int(11) NOT NULL auto_increment、 `パスワード` varchar(32) NOT NULL、 `email` varchar(50) NOT NULL、 `getpasstime` int(10) NOT NULL、
テーブル `t_user` を作成します ( `ユーザー名` varchar(30) NOT NULL、
主キー (`id`)

) ENGINE=MyISAM デフォルト CHARSET=utf8;



smtp.class.php类文件

代码如下 复制幣

クラスSMTP{

/* パブリック変数 */

var $smtp_port;

var $time_out;

var $host_name;

var $log_file;

var $relay_host;

var $debug;

var $auth;

var $user;

var $pass;

/* プライベート変数 */
 var $sock;

/* 建設業者 */

関数 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; // fsockopen() で使用されます

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

$this->user = $user;

$this->pass = $pass;

$this->host_name = "localhost"; //HELOコマンドで使用されます
  $this->log_file = "";

$this->靴下 = false;
 }

/* メイン関数 */

関数 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 バージョン:1.0rn";

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

$header .= "宛先: " . $to 。 「ん」;

if ($cc != "") {
   $header .= "Cc: " . $cc 。 「ん」;
  }

$header .= "差出人: $fromrn";

$header .= "件名: " . $subject 。 「ん」;

$header .= $Additional_headers;

$header .= "日付: " . date("r") 。 「ん」;

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

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

$header .= "メッセージ ID: 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 として $rcpt_to) {
   $rcpt_to = $this->get_address($rcpt_to);

if (!$this->smtp_sockopen($rcpt_to)) {
    $this->log_write("エラー: " . $rcpt_to . "n" にメールを送信できません");

$sent = false;

続き;
   }

if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
    $this->log_write("メールは n" に送信されました);
   } その他 {
    $this->log_write("エラー: n" にメールを送信できません");

$sent = false;
   }

fclose($this->靴下);

$this->log_write("リモートホストnから切断されました");
  }

$sent を返す;
 }

/* プライベート関数 */

関数 smtp_send($helo, $from, $to, $header, $body = "") {
  if (!$this->smtp_putcmd("HELO", $helo)) {
   return $this->smtp_error("HELO コマンドを送信中");
  }
  // 認証
  if ($this->auth) {
   if (!$this->smtp_putcmd("認証ログイン",base64_encode($this->user))) {
    return $this->smtp_error("HELO コマンドを送信中");
   }

if (!$this->smtp_putcmd("", Base64_encode($this->pass))) {
    return $this->smtp_error("HELO コマンドを送信中");
   }
  }

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

if (!$this->smtp_putcmd("RCPT", "TO:")) {
   return $this->smtp_error("RCPT TO コマンドを送信中");
  }

if (!$this->smtp_putcmd("DATA")) {
   return $this->smtp_error("DATA コマンドを送信中");
  }

if (!$this->smtp_message($header, $body)) {
   return $this->smtp_error("メッセージ送信中");
  }

if (!$this->smtp_eom()) {
   return $this->smtp_error("を送信中。 [EOM]");
  }

if (!$this->smtp_putcmd("QUIT")) {
   return $this->smtp_error("QUIT コマンドを送信中");
  }

true を返す;
 }

関数 smtp_sockopen($address) {
  if ($this->relay_host == "") {
   return $this->smtp_sockopen_mx($address);
  } その他 {
   return $this->smtp_sockopen_relay();
  }
 }

関数 smtp_sockopen_relay() {
  $this->log_write(" . $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("エラー: リレー ホストに接続できません " . $this->relay_host . "n");

$this->log_write("エラー: " . $errstr . " (" . $errno . ")n");

false を返す;
  }

$this->log_write("リレー ホストに接続しました " . $this->relay_host . "n");

true を返す;
  ;
 }

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

if (!@ getmxrr($domain, $MXHOSTS)) {
   $this->log_write("エラー: MX を解決できません "" . $domain . ""n");

false を返す;
  }

foreach ($MXHOSTS として $host) {
   $this->log_write(" . $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("警告: mx ホストに接続できません " . $host . "n");

$this->log_write("エラー: " . $errstr . " (" . $errno . ")n");

続き;
   }

$this->log_write("mx ホストに接続しました " . $host . "n");

true を返す;
  }

$this->log_write("エラー: どの mx ホストにも接続できません (" . implode(", ", $MXHOSTS) . ")n");

false を返す;
 }

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

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

true を返す;
 }

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

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

return $this->smtp_ok​​();
 }

関数 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("エラー: リモート ホストが "" . $response . ""n");

false を返す;
  }

true を返す;
 }

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

その他
    $cmd = $cmd 。 「」。 $arg;
  }

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

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

return $this->smtp_ok​​();
 }

関数 smtp_error($string) {
  $this->log_write("エラー: " . $string . ".n" 中にエラーが発生しました");

false を返す;
 }

関数 log_write($message) {
  $this->smtp_debug($message);

if ($this->log_file == "") {
   true を返します;
  }

$message = date("M d H:i:s ") 。 get_current_user() 。 「[」。 getmypid() 。 "]: " 。 $メッセージ;

if (!@ file_exists($this->log_file) || !($fp = @ fopen($this->log_file, "a")) {
   $this->smtp_debug("警告: ログ ファイルを開けません "" . $this->log_file . ""n");

false を返す;
   ;
  }

群れ($fp, LOCK_EX);

fputs($fp, $message);

fclose($fp);

true を返す;
 }

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

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

$address を返す;
 }

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

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

$address を返す;
 }

関数 smtp_debug($message) {
  if ($this->debug) {
   $message をエコーし​​ます。 「
   ;";
  }
 }
}
?>

最後にはデータベース接続タイプがあり、ここでは大規模なサイトに関連するデータベース接続タイプの mysql が介在しません。

http://www.bkjia.com/PHPjc/633135.html

本当http://www.bkjia.com/PHPjc/633135.html技術記事もし行われたウェブサイトが会员システムであれば、必ず自動的に秘密コードを返す機能が必要です。つまり、秘密コードを忘れている場合、秘密コードを忘れてしまった場合は、邮箱または携帯電話の番号を介して直接秘密コードを返すことができます...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPの抽象クラスまたはインターフェイスに対して、いつ特性を使用しますか?PHPの抽象クラスまたはインターフェイスに対して、いつ特性を使用しますか?Apr 10, 2025 am 09:39 AM

PHPでは、特性は方法が必要な状況に適していますが、継承には適していません。 1)特性により、クラスの多重化方法が複数の継承の複雑さを回避できます。 2)特性を使用する場合、メソッドの競合に注意を払う必要があります。メソッドの競合は、代替およびキーワードとして解決できます。 3)パフォーマンスを最適化し、コードメンテナビリティを改善するために、特性の過剰使用を避け、その単一の責任を維持する必要があります。

依存関係噴射コンテナ(DIC)とは何ですか?また、なぜPHPで使用するのですか?依存関係噴射コンテナ(DIC)とは何ですか?また、なぜPHPで使用するのですか?Apr 10, 2025 am 09:38 AM

依存関係噴射コンテナ(DIC)は、PHPプロジェクトで使用するオブジェクト依存関係を管理および提供するツールです。 DICの主な利点には、次のものが含まれます。1。デカップリング、コンポーネントの独立したもの、およびコードの保守とテストが簡単です。 2。柔軟性、依存関係を交換または変更しやすい。 3.テスト可能性、単体テストのために模擬オブジェクトを注入するのに便利です。

通常のPHPアレイと比較して、SPL SPLFIXEDARRAYとそのパフォーマンス特性を説明してください。通常のPHPアレイと比較して、SPL SPLFIXEDARRAYとそのパフォーマンス特性を説明してください。Apr 10, 2025 am 09:37 AM

SplfixedArrayは、PHPの固定サイズの配列であり、高性能と低いメモリの使用が必要なシナリオに適しています。 1)動的調整によって引き起こされるオーバーヘッドを回避するために、作成時にサイズを指定する必要があります。 2)C言語アレイに基づいて、メモリと高速アクセス速度を直接動作させます。 3)大規模なデータ処理とメモリに敏感な環境に適していますが、サイズが固定されているため、注意して使用する必要があります。

PHPは、ファイルを安全に処理する方法をどのように処理しますか?PHPは、ファイルを安全に処理する方法をどのように処理しますか?Apr 10, 2025 am 09:37 AM

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

Null Coulescingオペレーター(??)およびNull Coulescing Assignment Operator(?? =)とは何ですか?Null Coulescingオペレーター(??)およびNull Coulescing Assignment Operator(?? =)とは何ですか?Apr 10, 2025 am 09:33 AM

JavaScriptでは、nullcoalescingoperator(??)およびnullcoalescingsignmentoperator(?? =)を使用できます。 1.??最初の非潜水金または非未定されたオペランドを返します。 2.??これらの演算子は、コードロジックを簡素化し、読みやすさとパフォーマンスを向上させます。

コンテンツセキュリティポリシー(CSP)ヘッダーとは何ですか?なぜ重要なのですか?コンテンツセキュリティポリシー(CSP)ヘッダーとは何ですか?なぜ重要なのですか?Apr 09, 2025 am 12:10 AM

XSS攻撃を防ぎ、リソースのロードを制限し、ウェブサイトのセキュリティを改善できるため、CSPは重要です。 1.CSPはHTTP応答ヘッダーの一部であり、厳格なポリシーを通じて悪意のある行動を制限します。 2。基本的な使用法は、同じ起源からのロードリソースのみを許可することです。 3.高度な使用法は、特定のドメイン名がスクリプトやスタイルをロードできるようにするなど、より微調整された戦略を設定できます。 4。CSPポリシーをデバッグおよび最適化するには、コンテンツセキュリティポリシーレポートのみのヘッダーを使用します。

HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか?HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか?Apr 09, 2025 am 12:09 AM

HTTPリクエストメソッドには、それぞれリソースを取得、送信、更新、削除するために使用されるGET、POST、PUT、および削除が含まれます。 1. GETメソッドは、リソースを取得するために使用され、読み取り操作に適しています。 2. POSTメソッドはデータの送信に使用され、新しいリソースを作成するためによく使用されます。 3. PUTメソッドは、リソースの更新に使用され、完全な更新に適しています。 4.削除メソッドは、リソースの削除に使用され、削除操作に適しています。

HTTPSとは何ですか、なぜWebアプリケーションにとって重要なのですか?HTTPSとは何ですか、なぜWebアプリケーションにとって重要なのですか?Apr 09, 2025 am 12:08 AM

HTTPSは、HTTPに基づいてセキュリティレイヤーを追加するプロトコルであり、主に暗号化されたデータを介してユーザーのプライバシーとデータセキュリティを保護します。その作業原則には、TLSの握手、証明書の確認、暗号化された通信が含まれます。 HTTPSを実装する場合、証明書管理、パフォーマンスへの影響、および混合コンテンツの問題に注意を払う必要があります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、