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

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

ただいまの
回答率

89.63%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 733

dog57

score 119

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

パスワードをハッシュ化して
password_verify 関数で整合させているのですが
エラーメッセージが出ずにどこが原因かわかりません。

どなかたご教授いただけないでしょうか。
よろしくお願いします。

login_form.html

      <form id="loginform" class="form-horizontal" role="form" method="post" action="login_check.php">

                            <div style="margin-bottom: 25px" class="input-group">
                                        <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
                                        <input id="login-email" type="text" class="form-control" name="email" placeholder="email" value="{{ email }}">
                                    </div>

                            <div style="margin-bottom: 25px" class="input-group">
                                        <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
                                        <input id="login-password" type="password" class="form-control" name="password" placeholder="password" value="{{ password }}">
                                    </div>



                            <div class="input-group">
                                      <div class="checkbox">
                                        <label>
                                          <input id="login-remember" type="checkbox" name="remember" value="1"> Remember me
                                        </label>
                                      </div>
                                    </div>


                                <div style="margin-top:10px" class="form-group">
                                    <!-- Button -->

                                    <div class="col-sm-12 controls">
                                      <button name="login" id="btn-login" class="btn btn-success">Login</button>
                                      <a id="btn-fblogin" href="#" class="btn btn-primary">Login with Facebook</a>
                                       <input type="hidden" name="csrf" value="{{ 
csrftoken }}">
                                    </div>
                                </div>

logincheck.php

<?php
// 開発時にこれを書かないのはNG
ini_set('display_errors', true);
error_reporting(E_ALL);

session_start();
header("Content-type: text/html; charset=utf-8");

//クロスサイトリクエストフォージェリ(CSRF)対策のトークン判定
// if ($_POST['token'] != $_SESSION['token']){
//    echo "不正アクセスの可能性あり";
//    exit();
// }

// クリックジャッキング対策
header("X-FRAME-OPTIONS: SAMEORIGIN");

// クロスサイトリクエストフォージュリ(CSRF)対策のトークン判定
if (isset($_POST["csrfToken"])) {
    if ($_POST["csrfToken"] !== $_SESSION["csrfToken"]) {
        echo "不正アクセス(CSRF)の可能性あり。正規の画面から来てください。";
        exit();
    }
}

// 変数の初期化
$email = '';
$name = '';


// セッション変数の定義
$_SESSION["email"] = $_POST["email"];
$_SESSION["password"] = $_POST["password"];

// エラーメッセージの配列の初期化
$errors = array();

// エラーメッセージの初期化
$_SESSION['errors'] = array();

// データベース接続
require_once("../config/db.php");

// 前後にある半角全角スペースを削除する関数
function spaceTrim($str) {

    // 行頭
    $str = preg_replace('/^[   ]+/u', '', $str);
    // 末尾
    $str = preg_replace('/[   ]+$/u', '', $str);

    return $str;
}


 // ログインボタンが押された場合
 if (isset($_POST["login"])) {


    // POSTされたデータを各変数に入れる
     $email = filter_input(INPUT_POST, 'email');
     $password = filter_input(INPUT_POST, 'password');

     // 前後にある半角全角スペースを削除
     $email = spaceTrim($email);
     $password = spaceTrim($password);

     // アカウント入力判定
     if (empty($email)) {
         $errors["email"] = "Emailが入力されていません。";
     } elseif (!empty($email) && !preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email)) {
         $errors["email"] = "Emailを正しく入力してください。";
     }

     // パスワード入力判定
     if (empty($password)) {

         $errors["password"] = "パスワードが入力されていません。";

     } elseif (preg_match('/^[0-9a-zA-Z]{1,7}$/', $password)) {

         $errors["password"] = "パスワードは8文字以上で入力してください。";

     } else {

         $password_hide = str_repeat('*', strlen($password));

     }
 }

// エラーがなければ実行する
if (count($errors) === 0) {

    try {

        // 例外処理を投げる(スロー)ようにする
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // アカウントで検索
        $statement = $dbh->prepare("SELECT * FROM users WHERE email = (:email)");
        $statement->bindValue(":email", $email, PDO::PARAM_STR);
        $statement->execute();


        // アカウントが一致
        if ($row = $statement->fetch()) {

            $password_hash = $row['password'];

            // パスワードが一致
            if (password_verify($password, $password_hash)) {


          // セッションハイジャック対策
                session_regenerate_id(true);

                $_SESSION["email"] = $email;
                $email =  $_SESSION["email"];

                header("Location: login_admin.php");
                exit();

            } else {

                $errors["email"] = "Email及びパスワードが一致しません。";

            }

        } else {

            $errors["password"] = "Email及びパスワードが一致しません。";

        }

        if (count($errors) > 0) {
            $_SESSION['errors'] = $errors;
            $errors = $_SESSION['errors'];
            header("Location: login_form.php");

        }



    } catch (PDOException $e) {
        print("Error:" .$e->getMessage());
        die();
    }

} else {

    $_SESSION['errors'] = $errors;
    $errors = $_SESSION['errors'];
    header("Location: login_form.php");

}



//
// Twig
//

// Composerで作成されたautoload.phpを読み込む
require_once('../vendor/autoload.php');
// Twig_Loader_Filesystemを使う。login_check.phpからのtemplatesディレクトリを指定。(相対パス)
$loader = new Twig_Loader_Filesystem('../templates');
// $loaderをTwigの環境設定として Twig instance を生成
$twig = new Twig_Environment($loader);

// render
echo $twig->render('login_check.html', array(

  'email' => $email,
  'password' => $password,
  'errors' => $errors

  )
);

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2018/02/15 21:52

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

    キャンセル

  • dog57

    2018/02/15 22:12

    私のミスでした。修正しました。

    キャンセル

  • asahina1979

    2018/02/15 22:16

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

    キャンセル

回答 3

checkベストアンサー

+4

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる