このPHPのパスワードを忘れたスクリプトを修正するにはどうすればよいですか?

Fizzix

つまり、基本的には、シンプルでありながら安全な、忘れられたパスワードスクリプトを作成しようとしています。

2つのスクリプトがあります。1つはユーザーが自分の電子メールアドレスを入力できるようにするものです。これにより、新しいパスワードを保存するためにアクセスする必要のあるリンクが記載されたメールが送信されます。

2番目のスクリプトは、リンクがつながる場所です。このスクリプトは、新しいパスワードを保存します。

セキュリティ上の理由から、データベース内に「トークン」という新しいテーブルを作成しました。3つのフィールドがあります。トークン、メール、使用済み。トークンはランダムに生成された10文字と数字の文字列であり、電子メールはそのユーザーの電子メールアドレスであり、使用されるのはトークンが使用されたかどうかを示す1または0の整数です。

2つのスクリプトを読むと、私の構造をはるかに理解できるようになります。それらは長くはなく、まったく複雑ではありません。

何が問題になっていますか

さて、問題が発生しているのは1つだけです。これは、reset-password.phpスクリプト内にあります。これは、ユーザーが電子メールを受信した後にアクセスする場所です。基本的に、新しいパスワードを入力して[パスワードのリセット]をクリックしますが、何も起こりません。エラーや確認は表示されず、データベース内で何も変更されていません。私はこれをデバッグできないようで、今何時間も検索して試しています。すべてのヘルプと提案をいただければ幸いです。

私はまだPHPとMySQLの初心者であることを覚えておいてください。PHPを使用して約8週間、MySQLを使用しているのはわずか2週間です。

forgot-password.php

<?php
//Forgotten password script

    //Variable to save errors
    $errors = array();

    $email = $_POST['email'];

    include 'config.php';
    mysql_connect("$db_host", "$db_username", "$db_password")or die("cannot connect"); 
    mysql_select_db("$db_name")or die("cannot select DB");

    $query = "SELECT email FROM users WHERE email='" . $email . "'";
    $result = mysql_query($query);
    $num = mysql_num_rows($result);
    if($num==0)
    {
        echo ("<div style='color:red;'>Email address is not registered</div>");
        die();
    }

    $token = getRandomString(10);
    $query = "INSERT INTO tokens (token,email) VALUES ('".$token."','".$email."')";
    mysql_query($query);

    //function to renerate the token
    function getRandomString($length) 
    {
        $validCharacters = "ABCDEFGHIJKLMNPQRSTUXYVWZ123456789";
        $validCharNumber = strlen($validCharacters);
        $result = "";

        for ($i = 0; $i < $length; $i++) 
        {
            $index = mt_rand(0, $validCharNumber - 1);
            $result .= $validCharacters[$index];
        }
        return $result;
    }

    //Send the reset link to the user
    function mailresetlink($to,$token)
    {
        $subject = "Password Reset";
        $message = '
        <html>
        <head>
        <title>Password Reset</title>
        </head>
        <body>
        <p>Click on the given link to reset your password <a href="http://domain.com/reset-password.php?token='.$token.'">Reset Password</a></p>

        </body>
        </html>
        ';
        $headers = "MIME-Version: 1.0" . "\r\n";
        $headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
        $headers .= 'From: Password Reset <[email protected]>' . "\r\n";

        if(mail($to,$subject,$message,$headers))
        {
            echo "We have sent the password reset link to your email at <strong>".$to."</strong>"; 
        }
    }

    //If email is posted, send the email
    if(isset($_POST['email']))
    {
        mailresetlink($email,$token);
    }


?>




<table align="center" style="padding-bottom:40px;">
    <form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
    <tr>
    <td>Email Address: </td>
    <td><input type="text" name="email" /></td>
    </tr>
    <tr>
    <td colspan="2" align="center"><input type="submit" value="Reset My Password" /></td></tr>
    <input type="hidden" name="register" value="TRUE" />
</form>
</table>

reset-password.php

<?php
//Reset password script

    $token = $_GET['token'];
    $email;

    include 'config.php';
    mysql_connect("$db_host", "$db_username", "$db_password") or die("cannot connect"); 
    mysql_select_db("$db_name")or die("cannot select DB");

    if(!isset($_POST['newpassword']))
    {
        $query = "SELECT email FROM tokens WHERE token='" . $token . "' AND used = 0";
        $result = mysql_query($query);
        while($row = mysql_fetch_array($result))
        {
            $email = $row['email'];
        }


        if ($email != '')
        {
            $_SESSION['email'] = $email;
        }
        else 
        {
            echo "Invalid link or Password already changed";
        }
    }


    $pass = $_POST['newpassword'];
    $email = $_SESSION['email'];

    //Save new password
    if(isset($_POST['newpassword']) && isset($_SESSION['email']))
    {
        $query = "UPDATE users SET password = SHA('$password') WHERE email='" . $email . "'";
        $result = mysql_query($query);
        if($result)
        {
            mysql_query("UPDATE tokens SET used=1 WHERE token='" . $token . "'");
        }
        echo "Your password has been changed successfully";
        if(!$result)
        {
            echo "An error occurred. Please try the again or contact us at [email protected]";
        }
    }

?>



<table align="center" style="padding-bottom:40px;">
    <form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
    <tr>
    <td>New Password:</td>
    <td><input type="password" name="newpassword" id="password"/></td>
    </tr>
    <tr>
    <td colspan="2" align="center"><input type="submit" value="Change Password"></td></tr>
    <input type="hidden" name="reset" value="TRUE" />
</form>
</table>

さらに情報やコードが必要な場合は、遠慮なくお問い合わせください。

前もって感謝します!

ミッチ

新しいパスワードパラメータを入力した後、リセットページでトークンパラメータをサーバーに渡している場所がどこにも表示されません。あなたは別の隠された<input />コントロールを持っているべきです、私は期待します。$_SERVER['PHP_SELF']クエリ文字列パラメータを返しません。それが現在の問題の原因である可能性があります。

具体的には、

<table align="center" style="padding-bottom:40px;">
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    <tr>
    <td>New Password:</td>
    <td><input type="password" name="newpassword" id="password"/></td>
    </tr>
    <tr>
    <td colspan="2" align="center"><input type="submit" value="Change Password"></td></tr>
    <input type="hidden" name="reset" value="TRUE" />
</form>
</table>

する必要があります

<table align="center" style="padding-bottom:40px;">
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    <tr>
    <td>New Password:</td>
    <td><input type="password" name="newpassword" id="password"/></td>
    </tr>
    <tr>
    <td colspan="2" align="center"><input type="submit" value="Change Password"></td></tr>
    <input type="hidden" name="reset" value="TRUE" />
    <input type="hidden" name="token" value="<?php echo $_REQUEST['token']; ?>" />
</form>
</table>

最初はGETになり、2回目はPOSTになるので、必ず$_GET['token']sをに変更してください$_REQUEST['token']

そうは言っても、あなたのはるかに大きな問題は、' or 1=1 or '私のトークンとして指定することによって、あなたのすべてのセキュリティをバイパスする能力ですまたは、私は意地悪でいいことをすることができます'; update users set password = SHA('IKnowThisPassword') where username = 'admin'; --

パラメータ化されたSQLであるという話の教訓(PHPでSQLインジェクションを防ぐにはどうすればよいですか?

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

PHPでパスワードを忘れたメールから実際のパスワードを取得するにはどうすればよいですか?

分類Dev

ローカルアカウントのカスタムサインインポリシーでパスワードを忘れた場合のリンクを取得するにはどうすればよいですか?

分類Dev

このワークスペースの不具合を修正するにはどうすればよいですか?

分類Dev

このワークスペースの不具合を修正するにはどうすればよいですか?

分類Dev

MacO Xで忘れた管理者パスワードをリセットするにはどうすればよいですか?

分類Dev

このスクリプトを修正するにはどうすればよいですか

分類Dev

macOSのMySQLWorkbenchから忘れたMySQLパスワードを取得するにはどうすればよいですか?

分類Dev

LaravelでAPIを忘れたパスワードを作成してパスワードを変更するにはどうすればよいですか?

分類Dev

このファイルアップロードスクリプトの拡張子の指定を修正するにはどうすればよいですか?

分類Dev

Azure AD B2Cのreact-aad-msalで「パスワードを忘れた」を機能させるにはどうすればよいですか?

分類Dev

マップされたネットワークドライブのパスワードを保存するにはどうすればよいですか?

分類Dev

vim スクリプトの入力のような「パスワード」を取得するにはどうすればよいですか?

分類Dev

sudoのループを含むスクリプトにパスワードを繰り返し提供するにはどうすればよいですか?

分類Dev

authlibからパスワードをリセットするためのバックエンドを作成するにはどうすればよいですか。

分類Dev

このスクリプトをワードプレスにエンキューするにはどうすればよいですか?

分類Dev

忘れたパスワードを並べ替えて、ブルートフォース攻撃を試みるにはどうすればよいですか。

分類Dev

シェルスクリプトの次のコマンドのパスワードを保存するにはどうすればよいですか?

分類Dev

Microsoftリモートデスクトップで、アカウントのパスワードを変更するにはどうすればよいですか?

分類Dev

Windows PC用のネットワーク接続プリンターをパスワードで保護するにはどうすればよいですか?

分類Dev

crontabスクリプトのsudoに対するパスワード要求を回避するにはどうすればよいですか?

分類Dev

Bashスクリプトのパスワードを使用してsftpコマンドを実行するにはどうすればよいですか?

分類Dev

このスクリプトを修正して、クリックを数字キーにマップするにはどうすればよいですか?

分類Dev

このスクリプトを変更して複数のキーワードを検索するにはどうすればよいですか?

分類Dev

1つのコマンドの後でsudoにパスワードを自動的に忘れさせるにはどうすればよいですか?

分類Dev

このソートされたリンクリストの挿入を修正するにはどうすればよいですか?

分類Dev

MacのGitHubデスクトップでBitbucketパスワードをリセットするにはどうすればよいですか?

分類Dev

Dedicated Micros DVRのパスワードをリセットするにはどうすればよいですか?

分類Dev

Glassfishのパスワードをリセット/削除するにはどうすればよいですか?

分類Dev

mysqlのrootパスワードをリセットするにはどうすればよいですか?

Related 関連記事

  1. 1

    PHPでパスワードを忘れたメールから実際のパスワードを取得するにはどうすればよいですか?

  2. 2

    ローカルアカウントのカスタムサインインポリシーでパスワードを忘れた場合のリンクを取得するにはどうすればよいですか?

  3. 3

    このワークスペースの不具合を修正するにはどうすればよいですか?

  4. 4

    このワークスペースの不具合を修正するにはどうすればよいですか?

  5. 5

    MacO Xで忘れた管理者パスワードをリセットするにはどうすればよいですか?

  6. 6

    このスクリプトを修正するにはどうすればよいですか

  7. 7

    macOSのMySQLWorkbenchから忘れたMySQLパスワードを取得するにはどうすればよいですか?

  8. 8

    LaravelでAPIを忘れたパスワードを作成してパスワードを変更するにはどうすればよいですか?

  9. 9

    このファイルアップロードスクリプトの拡張子の指定を修正するにはどうすればよいですか?

  10. 10

    Azure AD B2Cのreact-aad-msalで「パスワードを忘れた」を機能させるにはどうすればよいですか?

  11. 11

    マップされたネットワークドライブのパスワードを保存するにはどうすればよいですか?

  12. 12

    vim スクリプトの入力のような「パスワード」を取得するにはどうすればよいですか?

  13. 13

    sudoのループを含むスクリプトにパスワードを繰り返し提供するにはどうすればよいですか?

  14. 14

    authlibからパスワードをリセットするためのバックエンドを作成するにはどうすればよいですか。

  15. 15

    このスクリプトをワードプレスにエンキューするにはどうすればよいですか?

  16. 16

    忘れたパスワードを並べ替えて、ブルートフォース攻撃を試みるにはどうすればよいですか。

  17. 17

    シェルスクリプトの次のコマンドのパスワードを保存するにはどうすればよいですか?

  18. 18

    Microsoftリモートデスクトップで、アカウントのパスワードを変更するにはどうすればよいですか?

  19. 19

    Windows PC用のネットワーク接続プリンターをパスワードで保護するにはどうすればよいですか?

  20. 20

    crontabスクリプトのsudoに対するパスワード要求を回避するにはどうすればよいですか?

  21. 21

    Bashスクリプトのパスワードを使用してsftpコマンドを実行するにはどうすればよいですか?

  22. 22

    このスクリプトを修正して、クリックを数字キーにマップするにはどうすればよいですか?

  23. 23

    このスクリプトを変更して複数のキーワードを検索するにはどうすればよいですか?

  24. 24

    1つのコマンドの後でsudoにパスワードを自動的に忘れさせるにはどうすればよいですか?

  25. 25

    このソートされたリンクリストの挿入を修正するにはどうすればよいですか?

  26. 26

    MacのGitHubデスクトップでBitbucketパスワードをリセットするにはどうすればよいですか?

  27. 27

    Dedicated Micros DVRのパスワードをリセットするにはどうすればよいですか?

  28. 28

    Glassfishのパスワードをリセット/削除するにはどうすればよいですか?

  29. 29

    mysqlのrootパスワードをリセットするにはどうすればよいですか?

ホットタグ

アーカイブ