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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Twig

Twig は、簡潔で可読性の高いテンプレートを記述することができ、 シンプルに記述することを目的として作られた PHPテンプレートエンジンです。

Q&A

解決済

3回答

544閲覧

PHPのログイン機能を作成していますが、ログインできません。

dog57

総合スコア131

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Twig

Twig は、簡潔で可読性の高いテンプレートを記述することができ、 シンプルに記述することを目的として作られた PHPテンプレートエンジンです。

0グッド

0クリップ

投稿2018/02/15 12:26

編集2018/02/15 13:11

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);

イメージ説明

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/02/15 12:52

?htmlファイルにphpタグがかかれてるけどこれは?
dog57

2018/02/15 13:12

私のミスでした。修正しました。
退会済みユーザー

退会済みユーザー

2018/02/15 13:16

(ファイル名のほうが正しかったのか
guest

回答3

0

ベストアンサー

画面キャプチャの上部のダンプから推測するに、password_verifyで失敗しているようなので、$password と $password_hash をダンプしてみてはどうでしょうか?

投稿2018/02/15 14:46

ockeghem

総合スコア11701

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

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

0

もうすこしシンプルな構造から始めればいいでしょう
まずはuserとpasswordを投げて、あらかじめ用意したものと合致したら
セッションを生成するところからですね

投稿2018/02/15 12:27

yambejp

総合スコア114583

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

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

0

状況から見て、'password_verify' が false なんだと思います。
パスワードがハッシュ化されてないとかじゃないですか?
多分、11111111のまま登録されているのかと。

ただ、全体的に意味が分からない記述が多くあります。

ざっと見た感じ
・$_POST["csrfToken"]が空だと素通り
$_SESSION["email"] = $_POST["email"]; $_SESSION["password"] = $_POST["password"];になぜ filter_input を使用しない?
・記号1文字とか、パスワードに意図しないモノが登録できそう
$_SESSION['errors'] = $errors; $errors = $_SESSION['errors'];???
等々。

ちゃんと全体見直したほうがイイですよ。

投稿2018/02/16 16:05

編集2018/02/16 16:07
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問