質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

1回答

5743閲覧

パスワードリセットのパスワード上書きについて

TadashiOsanai

総合スコア10

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2018/07/30 07:45

こんにちは。
現在、ログイン機能を実装しております。
そこで、パスワード忘れた方へのパスワードリセットページを作成しております。
下記のソースで上手く動きません。

PHPの勉強中で、ログインのINSERTとちょっと変更したら登録できるのかなと試行錯誤しております。そもそものコードがおかしいのかわからないく、指摘をいただけないでしょうか?

<?php include ('config.php'); include ('function.php'); $mail = $_GET['mail']; $userID = UserID($mail); $verifytoken = verifytoken($userID, $token); //パスワードのハッシュ化 if(isset($_POST['submit'])){ $new_password = $_POST['new_password']; $password_hash = password_hash($_SESSION['new_password'], PASSWORD_DEFAULT); $password_hash = password_hash($_SESSION['retype_password'], PASSWORD_DEFAULT); if($new_password == $retype_password) { try{ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //トランザクション開始 $dbh->beginTransaction(); $statement = $dbh->prepare("UPDATE member SET password = '$new_password' WHERE id = $userID"); $statement->bindValue(':new_password_hash', $new_password_hash, PDO::PARAM_STR); $statement->execute(); if($update_password){ $statement = $dbh->prepare("UPDATE recovery_keys SET valid = 0 WHERE userID = $userID AND token ='$token'"); $msg = 'Your password has changed successfully. Please login with your new passowrd.'; $msgclass = 'bg-success'; } }else { $msg = "パスワードが一致しません。"; $msgclass = 'bg-danger'; } // トランザクション完了(コミット) $dbh->commit(); }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>パスワードリセット</title> <!-- Bootstrap --> <link href="css/bootstrap.css" rel="stylesheet"> </head> <body> <div class="container"> <div class="row"> <?php if($verifytoken == 1) { ?> <div class="col-lg-4 col-lg-offset-4"> <form class="form-horizontal" role="form" method="post"> <h2>Reset Your Password</h2> <?php if(isset($msg)) { ?> <div class="<?php echo $msgclass; ?>" style="padding:5px;"><?php echo $msg; ?></div> <?php } ?> <div class="row"> <div class="col-lg-12"> <label class="control-label">新しいパスワード</label> </div> </div> <div class="row"> <div class="col-lg-12"> <input class="form-control" name="new_password" type="password" placeholder="New Password" required> </div> </div> <div class="row"> <div class="col-lg-12"> <label class="control-label">再入力</label> </div> </div> <div class="row"> <div class="col-lg-12"> <input class="form-control" name="retype_password" type="password" placeholder="Re-type New Password" required> </div> </div> <div class="row"> <div class="col-lg-12"> <button class="btn btn-success btn-block" name="submit" style="margin-top:8px;">Submit</button> </div> </div> </form> </div> <?php }else {?> <div class="col-lg-4 col-lg-offset-4"> <h2>Invalid or Broken Token</h2> <p>Opps! The link you have come with is maybe broken or already used. Please make sure that you copied the link correctly or request another token from <a href="index.php">here</a>.</p> </div> <?php }?> </div> </div> </body> </html>

参考にしたコードは下記になります。
こちら、パスワードの暗号がMD5で古いようなので、PDOの
password_hashに書き換えたいと思い、挑戦して言います。

if(isset($_POST['submit'])) { $new_password = $_POST['new_password']; $new_password = md5($new_password); $retype_password = $_POST['retype_password']; $retype_password = md5($retype_password); if($new_password == $retype_password) { $update_password = mysqli_query($db, "UPDATE member SET password = '$new_password' WHERE id = $userID"); if($update_password) { mysqli_query($db, "UPDATE recovery_keys SET valid = 0 WHERE userID = $userID AND token ='$token'"); $msg = 'Your password has changed successfully. Please login with your new passowrd.'; $msgclass = 'bg-success'; } }else { $msg = "Password doesn't match"; $msgclass = 'bg-danger'; } }

もしもっといい方法があるようでしたら、そちらもヒントを教えていただけないでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/07/30 07:56

上手く動かないとは、どういうふうに動くんでしょうか。詳しく説明してください
TadashiOsanai

2018/07/30 08:35

ご連絡ありがとうございます。画面が表示されません。
m.ts10806

2018/07/30 12:18

質問は編集できますので適宜調整してください。
m.ts10806

2018/07/30 12:20

エラー表示はOnにして確認してください。何も表示されない=処理が中断するようなエラーが起きているのにエラー表示がOnになっていないため何も起きていないように見える と思われます。https://qiita.com/Morio/items/d83092caf3a32f94b506
guest

回答1

0

$password_hash = password_hash($_SESSION['new_password'], PASSWORD_DEFAULT);
$password_hash = password_hash($_SESSION['retype_password'], PASSWORD_DEFAULT);
どちらも$password_hashに入っています。

更に$retype_password$new_password_hash$update_passwordなど定義されてない変数が見受けられます。

更に更に$dbh->prepare内で変数を直入れしているのでプリペアドステートメント出来てません。

参考にしたコードは見た感じ問題無いと思うので、自分のコードを理解しながら全体的に見直した方がいいと思います。

投稿2018/07/30 08:00

sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TadashiOsanai

2018/07/30 08:41

ありがとうございます。 $statement = $dbh->prepare("INSERT INTO member (account,mail,password) VALUES (:account,:mail,:password_hash)"); ログイン画面のIDとメール、パスワードを作成しましたが、こちらの形に近いのでしょうか? また、md5($new_password);の部分を password_hash($_SESSION['new_password'], PASSWORD_DEFAULT);にする場合、全体を見直したほうが良いのでしょうか? それとも少し修正すれば上手くいくのでしょうか? その辺も、ヒントをいただければと思います。
sakura_hana

2018/07/30 09:11

近いも何も、そうしないとSQLインジェクションの危険性から逃れられません。 以下のページが詳しいのでご覧ください。 https://qiita.com/mpyw/items/b00b72c5c95aac573b71 password_hashについては、md5(〜)をpassword_hash(〜)に置き換えればそれでOKです。 (認証チェックの方法は以下参照) https://qiita.com/rana_kualu/items/3ef57485be1103362f56 「上手くいくかどうか?」と思った際には、まずは「php pdo」とか「php password_hash」でググれば例文や解説がいっぱい出て来ます。 トライ&エラーしつつ理解を進めてみてください(1つの題材でも色々なサイトを見てみるとよいです)。 そして画面が表示されないとのことですが、エラーも非表示設定になっていると思われるので <?php の次の行あたりにでも ini_set( 'display_errors', 1 ); と書いておくとエラー文が画面に表示されるようになります。(リリース時はこの行を消してください) 何言ってるのか分からないエラーもあるとは思いますが、文面をそのままググれば解決の助けになります。 https://qiita.com/shotets/items/3c95aef631b2c5eadae5
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問