-1

私はmysqliとphpを使用していますが、これを実行したい場合は、ユーザーが新しいパスワードを作成できるようにすることを試みています。

ユーザーがパスワードを変更するには、[ユーザー名]テキストボックスにユーザー名を入力し、[新しいパスワード]テキストボックスに新しいパスワードを入力します。

ユーザーがフォームを送信するとき、データベースを調べ、データベースで一致するユーザー名を見つけ、その行を更新して、以前のパスワードが新しいパスワードに変更され、暗号化を強化するためにパスワードをソルトする必要があります。

しかし、問題はそれがまったくこれを行っていないということです。データベースはパスワードをまったく更新していません。パスワードをソルトしてもかまいません。何をする必要があるのか​​わかりません。

以下は私の試みです(私はdbに接続しましたが、以下にそのコードを含めていません):

     <?php
          // PHP code
          session_start(); 

          $salt = ""; 
        for ($i = 0; $i < 40; $i++) { 
           $salt .= substr(
             "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 
             mt_rand(0, 63), 
             1); 
        }


          $username = (isset($_POST['username'])) ? $_POST['username'] : '';
          $newpassword = (isset($_POST['newpassword'])) ? $_POST['newpassword'] : '';

          if (isset($_POST['submit'])) {

            // don't use $mysqli->prepare here
     $query = "UPDATE Teacher SET TeacherSalt = $salt, TeacherPassword = SHA1(CONCAT($newpassword,$salt)) WHERE TeacherUserName = ?";
            // prepare query
            $stmt=$mysqli->prepare($query);
            // You only need to call bind_param once
            $stmt->bind_param("s",$username);
            // execute query
            $stmt->execute(); 
            // get result and assign variables (prefix with db)
            $stmt->bind_result($dbTeacherUsername,$dbTeacherPassword);

            while($stmt->fetch()) {
              if ($username == $dbTeacherUsername) {
                $loggedIn = true;
              }
            }

            /* close statement */
            $stmt->close();

            /* close connection */
            $mysqli->close();


          }

....

          <p>Username</p><p><input type="text" name="username" /></p>      <!-- Enter Teacher Username-->
          <p>New Password</p><p><input type="password" name="newpassword" /></p>  <!-- Enter Teacher Password--> 

データベーステーブルは現在どのようになっていますか。

TeacherUsername    TeacherPassword     TeacherSalt
j.lu               fgrfre4r4ffsdfv

したがって、j.luがパスワードを変更したい場合は、ユーザー名を入力してから新しいパスワードを入力します。これをすべて上記の表に更新する必要があります。しかし、それは何も更新していません。

ありがとうございました

4

3 に答える 3

1

ユーザー名を変数 named にフェッチして$usernameいますが、bind_param() で呼び出された変数をバインドし$teacherusernameているため、クエリは結果をフェッチしません。

bind_param コードは次のようになります。

    // You only need to call bind_param once
    $stmt->bind_param("s",$username);
于 2012-08-08T22:17:51.400 に答える
0

1)エラーのチェックや処理が見られません。

2)変数「$ username」、「$ newpassword」、「$ dbTeacherUsername」、「$ dbTeacherPassword」などについて混乱しています。適切な場所で適切な名前を使用していますか? ?

3)少なくとも、「$ stmt-> execute()== false」を確認し、必要に応じてPDO「errorInfo」を表示してください。

見つけたものを投稿してください。

于 2012-08-08T22:30:48.900 に答える