register_confirm.phpまではほぼ正常に動いているのを確認しました。
(メールを飛ばす部分はローカルサーバーなのでやっていません)
PHP Myadminでテーブルにデータの追加されているのが確認できているのに
ログインができません。ソースコードでおかしいところがありましたら
ご指摘お願いします。
register_submit.php
<?php require("function.php"); session_start(); header("Content-type: text/html; charset=utf-8"); //CSRFチェック if($_SESSION['token'] != $_POST['token']){ $_SESSION = array(); session_destroy(); session_start(); $_SESSION["error_status"] = 2; header("HTTP/1.1 301 Moved Permanently"); header("Location: login.php"); exit(); } //エラー情報のリセット $_SESSION["error_status"] = 0; $id = filter_input(INPUT_POST,'id'); $mail = $_POST["mail"]; $password = $_POST["password"]; //ソルト作成 $salt = get_salt(); //一時URLパスワード作成 $url_pass = get_url_password(); //ユーザー仮登録 //ストレッチングパスワード $hash = stretchedPassword($salt,$password); //データベース接続 $dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8mb4'; $user = 'root'; $password = ''; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); var_dump(isset($dbh)); //プレースホルダでSQL作成 $sql = "INSERT INTO USER (ID,SALT,PASSWORD,MAILADDRESS, TEMP_PASS,LAST_CHANGE_PASS_TIME,RESISTER_TIME)"; $sql .= "VALUES(?,?,?,?,?,?,?);"; var_dump(isset($sql)); //パラメータの型を指定 $stmt = $dbh->prepare($sql,array('text','text','text','text','text','timestamp','timestamp')); //パラメータを渡してSQL実行 $res = $stmt->execute(array($id,$salt,$hash,$mail,$url_pass,date('Y-m-d H:i:s'),date('Y-m-d H:i:s'))); //ID重複チェック ※ try{ }catch(PDOException $e){ die("接続失敗です{$e->getMessage()}"); $dbh = null; $_SESSION['error_status'] = 4; header("HTTP/1.1 301 Moved Permanently"); header("Location: register.php"); exit(); } $dbh = null; //ユーザーに確認メール送信 $mail = str_replace(["/r" , "/n"] , "" , $mail); $url = "http://" . SERVER . "/register_confirm.php?" . $url_pass; $msg = "以下のアドレスからアカウントを有効にしてください。" . PHP_EOL; $msg .= "アドレスの有効期限は10分間です。" . PHP_EOL; $msg .= "有効時間が過ぎたらパスワードのリセットをしてください" . PHP_EOL . PHP_EOL; $msg .= $url; mb_send_mail($mail,"ユーザー登録",$msg,"From:" . SENDER_EMAIL); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <h1>仮登録完了</h1> 仮登録が完了しました。<br /> 登録を完了するには送信されたメールで手続きを行ってください。<br /> <a href="login.php">ログイン画面へ</a><br /> </body> </html>
register_confirm.php
<?php require_once("function.php"); session_start(); header("Content-type: text/html; charset=utf-8"); //URLからパラメータ取得 $url_pass = parse_url($_SERVER['REQUEST_URI'] , PHP_URL_QUERY); //ユーザー正式登録 $dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8mb4'; $user = 'root'; $password = ''; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //プレースホルダでSQL作成 $sql = "SELECT * FROM USER WHERE TEMP_PASS = ? AND RESISTER_TIME >= ?"; //パラメータの型を指定 $stmt = $dbh->prepare($sql,array('text' , 'timestamp')); // 10分前の時刻を取得 $date = new DateTime("- 10 min"); //パラメータを渡してSQL実行 $rs =$stmt->execute(array($url_pass , $date->format('Y-m-d H:i:s'))); $count = 0; while($row = $rs->fetch(PDO::ASSOC)){ $id = $row['id']; $count++; } if($count == 0){ //URLが不正か期限切れ $_SESSION["error_status"] = 3; header("HTTP1.1 301 Moved Permanently"); header("Location: register.php"); $dbh = null; exit(); } $sql = "UPDATE USER SET IS_USER = 1 WHERE ID = ? ;"; //パラメータの方を指定 $stmt = $dbh->prepare($sql , array('text')); //パラメータを渡してSQL実行 $stmt->execute(array($id)); $dbh = null; ?> <!DOCTYPE html> <html lang="ja"> <head> <body> <h1></h1> ユーザー登録完了しました。<br /> ログイン画面からログインしてください。<br /><br /> <a href="/login.php">ログイン画面に戻る</a> </body> </html> ?>
login.php
<?php // phpinfo(); require_once("function.php"); session_start(); header("Content-type: text/html; charset=urf-8"); ?> <style> a{ text-decoration:none; } input{ border-radius: 10px; -webkit-border-radius: 10px; -moz-border-radius: 10px; } </style> <!DOCTYPE HTML> <html lang="ja"> <body> <h1>LOG IN</h1> <?php if($_SESSION["error_status"] == 1){ echo "<h2 style='color:red'>IDまたはパスワードが異なります</h2>"; } if($_SESSION["error_status"] == 2){ echo "<h2 style='color:red'>不正なリクエストです。</h2>"; } $_SESSION["error_status"] = 0; ?> <form action="login_check.php" method="post"> ID<br /><input type="text" name="id"><br /> PASS<br /><input type="password" name="password"><br /> <input type="submit" value="login"> <input type="reset" value="reset"><br /> </form> <a href="register.php">新規登録</a><br /> <a href="password_reset.php">パスワードリセット<br /> </body> </html>
login_check.php
<?php require_once("function.php"); session_start(); header("Content-type:text/html;charset=utf-8"); //パラメーター取得 $id = $_POST['id']; $password = $_POST['password']; // //ログイン判定 //DB接続 ※ $dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8'; $user = 'root'; $password = ''; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //プレースホルダでSQL作成 $sql= "SELECT * FROM USER WHERE ID =? AND IS_USER =1;"; //パラメータの型指定 $stmt = $dbh->prepare($sql,array('text')); //パラメータを渡してSQL実行 $rs = $stmt->execute(array($sql)); try { $dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); exit; } $count = 0; while($row = $stmt->fetch()){ $id = $row["id"]; $salt = $row["salt"]; $db_password = $row["password"]; $reset = $row["reset"]; $count++; } $dbh = null; //ログイン失敗 if($count !=1){ $_SESSION["error_status"]=1; header("HTTP/1.1 301 Moved Permanently"); header("Location: login.php"); exit(); } //パスワードリセット対応 if($reset == 1){ $_SESSION["error_status"] =1; header("HTTP/1.1 301 Moved Permanently"); header("Location: login.php"); exit(); } //パスワード生成 $hash = stretchedPassword($salt,$pw); if($hash == $db_password){ //ログイン成功 //セッション ID振り直し session_regenerate_id(true); //セッションにID格納 $_SESSION['id']=$id; //CSRFのトークン作成 $_SESSION["token"] = $get_csrf_token(); //DB接続 $dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8'; $user = 'root'; $password = ''; $dbh = new PDO($dsn,$user,$pass); $dbh->setAttrbute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //プレースホルダでSQL作成 $sql = "UPDATE USER SET LAST_LOGIN_TIME = ? WHERE ID = ?"; //パラメータの型を指定 $stmt = $dbh->prepare($sql,array('timestamp','text')); //パラメータを渡してSQL実行 $stmt->execute(array(date('Y-m-d H:i:s'),$id)); $dbh = null; //リダイレクト header("HTTP/1.1 301 Moved Permanently"); header("Location: welcome.php"); }else{ $_SESSION["error_status"]=1; header("HTTP/1.1 301 Moved Permanently"); header("Location: login.php"); } ?>
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/08/13 00:56
2017/08/13 01:10
退会済みユーザー
2017/08/13 02:36
退会済みユーザー
2017/08/13 03:53