PHPのログイン機能を作成していますが、ログインできません。
パスワードをハッシュ化して
password_verify 関数で整合させているのですが
エラーメッセージが出ずにどこが原因かわかりません。
どなかたご教授いただけないでしょうか。
よろしくお願いします。
login_form.html
html
1 <form id="loginform" class="form-horizontal" role="form" method="post" action="login_check.php"> 2 3 <div style="margin-bottom: 25px" class="input-group"> 4 <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span> 5 <input id="login-email" type="text" class="form-control" name="email" placeholder="email" value="{{ email }}"> 6 </div> 7 8 <div style="margin-bottom: 25px" class="input-group"> 9 <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span> 10 <input id="login-password" type="password" class="form-control" name="password" placeholder="password" value="{{ password }}"> 11 </div> 12 13 14 15 <div class="input-group"> 16 <div class="checkbox"> 17 <label> 18 <input id="login-remember" type="checkbox" name="remember" value="1"> Remember me 19 </label> 20 </div> 21 </div> 22 23 24 <div style="margin-top:10px" class="form-group"> 25 <!-- Button --> 26 27 <div class="col-sm-12 controls"> 28 <button name="login" id="btn-login" class="btn btn-success">Login</button> 29 <a id="btn-fblogin" href="#" class="btn btn-primary">Login with Facebook</a> 30 <input type="hidden" name="csrf" value="{{ 31csrftoken }}"> 32 </div> 33 </div>
logincheck.php
php
1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6session_start(); 7header("Content-type: text/html; charset=utf-8"); 8 9//クロスサイトリクエストフォージェリ(CSRF)対策のトークン判定 10// if ($_POST['token'] != $_SESSION['token']){ 11// echo "不正アクセスの可能性あり"; 12// exit(); 13// } 14 15// クリックジャッキング対策 16header("X-FRAME-OPTIONS: SAMEORIGIN"); 17 18// クロスサイトリクエストフォージュリ(CSRF)対策のトークン判定 19if (isset($_POST["csrfToken"])) { 20 if ($_POST["csrfToken"] !== $_SESSION["csrfToken"]) { 21 echo "不正アクセス(CSRF)の可能性あり。正規の画面から来てください。"; 22 exit(); 23 } 24} 25 26// 変数の初期化 27$email = ''; 28$name = ''; 29 30 31// セッション変数の定義 32$_SESSION["email"] = $_POST["email"]; 33$_SESSION["password"] = $_POST["password"]; 34 35// エラーメッセージの配列の初期化 36$errors = array(); 37 38// エラーメッセージの初期化 39$_SESSION['errors'] = array(); 40 41// データベース接続 42require_once("../config/db.php"); 43 44// 前後にある半角全角スペースを削除する関数 45function spaceTrim($str) { 46 47 // 行頭 48 $str = preg_replace('/^[ ]+/u', '', $str); 49 // 末尾 50 $str = preg_replace('/[ ]+$/u', '', $str); 51 52 return $str; 53} 54 55 56 // ログインボタンが押された場合 57 if (isset($_POST["login"])) { 58 59 60 // POSTされたデータを各変数に入れる 61 $email = filter_input(INPUT_POST, 'email'); 62 $password = filter_input(INPUT_POST, 'password'); 63 64 // 前後にある半角全角スペースを削除 65 $email = spaceTrim($email); 66 $password = spaceTrim($password); 67 68 // アカウント入力判定 69 if (empty($email)) { 70 $errors["email"] = "Emailが入力されていません。"; 71 } elseif (!empty($email) && !preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $email)) { 72 $errors["email"] = "Emailを正しく入力してください。"; 73 } 74 75 // パスワード入力判定 76 if (empty($password)) { 77 78 $errors["password"] = "パスワードが入力されていません。"; 79 80 } elseif (preg_match('/^[0-9a-zA-Z]{1,7}$/', $password)) { 81 82 $errors["password"] = "パスワードは8文字以上で入力してください。"; 83 84 } else { 85 86 $password_hide = str_repeat('*', strlen($password)); 87 88 } 89 } 90 91// エラーがなければ実行する 92if (count($errors) === 0) { 93 94 try { 95 96 // 例外処理を投げる(スロー)ようにする 97 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 98 99 // アカウントで検索 100 $statement = $dbh->prepare("SELECT * FROM users WHERE email = (:email)"); 101 $statement->bindValue(":email", $email, PDO::PARAM_STR); 102 $statement->execute(); 103 104 105 // アカウントが一致 106 if ($row = $statement->fetch()) { 107 108 $password_hash = $row['password']; 109 110 // パスワードが一致 111 if (password_verify($password, $password_hash)) { 112 113 114 // セッションハイジャック対策 115 session_regenerate_id(true); 116 117 $_SESSION["email"] = $email; 118 $email = $_SESSION["email"]; 119 120 header("Location: login_admin.php"); 121 exit(); 122 123 } else { 124 125 $errors["email"] = "Email及びパスワードが一致しません。"; 126 127 } 128 129 } else { 130 131 $errors["password"] = "Email及びパスワードが一致しません。"; 132 133 } 134 135 if (count($errors) > 0) { 136 $_SESSION['errors'] = $errors; 137 $errors = $_SESSION['errors']; 138 header("Location: login_form.php"); 139 140 } 141 142 143 144 } catch (PDOException $e) { 145 print("Error:" .$e->getMessage()); 146 die(); 147 } 148 149} else { 150 151 $_SESSION['errors'] = $errors; 152 $errors = $_SESSION['errors']; 153 header("Location: login_form.php"); 154 155} 156 157 158 159// 160// Twig 161// 162 163// Composerで作成されたautoload.phpを読み込む 164require_once('../vendor/autoload.php'); 165// Twig_Loader_Filesystemを使う。login_check.phpからのtemplatesディレクトリを指定。(相対パス) 166$loader = new Twig_Loader_Filesystem('../templates'); 167// $loaderをTwigの環境設定として Twig instance を生成 168$twig = new Twig_Environment($loader); 169 170// render 171echo $twig->render('login_check.html', array( 172 173 'email' => $email, 174 'password' => $password, 175 'errors' => $errors 176 177 ) 178);
回答3件
あなたの回答
tips
プレビュー