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

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

ただいまの
回答率

90.50%

  • PHP

    20367questions

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

  • PDO

    335questions

    PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PDOでログイン画面 ハッシュ化の比較方法で上手く行かない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 550

chokochokochok

score 24

現在PDOの勉強中です。
データベースにハッシュ化した値を格納し、その値とログインフォームに入ってきたパスワードをpassword_verifyで確認しているのですが上手くいきません。

1.新規登録時にパスワード「aaa」と入力し、ハッシュ化「$2y$10$u7p8」。
2.この値をデータベースに保存。
3.ログイン画面でパスワードを入力
4.if (password_verify($_POST["pass"], $db_hashed_pwd)) {}
の比較でtrueにならない

データベースから値は取得できており、POSTの情報も取得できています。
ここで詰まって進めない状態です。
大変申し訳ございませんがここからどこを確認すれば良いのでしょうか?
ご教授お願いいたします。

<?php
session_start();

if(isset($_POST['soushin'])){ 

  //ログイン名が入力されていない場合の処理
  if (empty($_POST["name"])) {
    $errorMessage = "名前が未入力です。";
    } 
    //パスワードが入力されていない場合の処理
    else if (empty($_POST["pass"])) {
        $errorMessage = "パスワードが未入力です。";
      } 

    //両方共入力されているか判別してログイン処理開始!!
    if (!empty($_POST["name"]) && !empty($_POST["pass"])) {
    $host = "localhost";
    $db_name ="blueBlog";    //作ったデータベース名を入れる
    $dsn = "mysql:dbname=$db_name;host=$host;charset=utf8";
    $user = 'root';    //xampやmampなら初期値は"root"
    $password = 'root';    //xampやmampなら初期値は"root"
    try {
      $dbh = new PDO($dsn, $user, $password);
    }
    catch (PDOException $e){
      die('Error'.$e->getMessage());
    }


    //ログイン名とパスワードのエスケープ処理
    $name = htmlspecialchars($_POST['name'],ENT_QUOTES);
    $pass = htmlspecialchars($_POST['pass'],ENT_QUOTES);

    //データベースアクセスの処理文章。ログイン名があるか判定
    $query = "select * from user where name like '%".$name."%' ";

    //$dbhは最初に設定したデータベースアクセスの変数です。
        $result = $dbh->query($query);

    //データベースにアクセス出来なかった場合の処理
        if (!$result) {
        print('クエリーが失敗しました。' . $dbh->error);
        $dbh->close();
      exit();
          }

    $ryou = $result->rowCount();  

    //1以上あればデータがあるということなので、判定に使用しています
    if ($ryou>=1) {

    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {

        $db_hashed_pwd = $row['password'];
    }
PASSWORD_DEFAULT);

     if (password_verify($_POST["pass"], $db_hashed_pwd)) {
       session_regenerate_id(true);
       $_SESSION["login"] = session_id();
       $_SESSION["loginname"] = $name;

       //ログイン後のphpを読み込ませます。
      header("Location: list.php");
      exit;

        }
        //パスワードが違ってた時の処理
        else {
          $errorMessage = "パスワードに誤りがあります。";
        }
      }
      //ログイン名がなかった時の処理
      else {
        $errorMessage = "ユーザが登録されていません。";
        }
    }
}
?>
<!doctype html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ログインページ</title>
</head>
<body>
<h2>ログイン画面</h2>

<form method="post" action="<?php print($_SERVER['PHP_SELF']) ?>">
名前:<input type="text" name="name" size="15"><br><br>
パスワード:<input type="text" name="pass" size="15"><br><br>
<input type="submit" name="soushin" value="ログイン">
<input type="submit" name="kuria" value="クリア">
</form>
<br>
<br>
<div><?php echo $errorMessage ?></div>
<br>
<br>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Kosuke_Shibuya

    2017/03/04 15:05

    ソースコードを見せずに問題を指摘してくれと言われても、無理な話では?

    キャンセル

  • chokochokochok

    2017/03/04 15:07

    途中で投稿してしまいました、ソースコードを貼り付けましたのでご確認をお願いいたします。

    キャンセル

回答 3

+3

まともなIDEを使ってください。

世の中には便利なツールがあって、文法エラーを即時にしてく¥気してくれるツールがあります。

提示されたソースコードを Netbeans に貼り付けて見ると、以下のようになります。

イメージ説明

開発時はエラーメッセージを表示すること

<?php の次の行に、以下を必ず記述すること。これを記述した、実行するとエラーメッセージが表示されます。エラーには、何故動かないのかという理由が書かれています。これがないとデバッグできません。
また、表示されたメッセージをキーワードにググれば、たいていの解決方法は見つかります。
これを機会に、闇雲にソースコードをいじってデバッグすることから卒業しましょう。

<?php

ini_set('display_errors', true);
error_reporting(E_ALL);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/04 15:26

    その通りですね。
    エラーを確認しながら開発することは大事ですよね。
    今回は特に関数の使用等しない、簡単な開発だったためsublime textでやりました。IDEは重かったため。でもIDEの便利さにはかなわないので次回からは IDEで開発したいと思います。
    ありがとうございました。

    キャンセル

  • 2017/03/04 15:30

    sublime 使っているなら、こちら
    https://liginc.co.jp/web/js/73704

    キャンセル

  • 2017/03/04 15:34

    ありがとうございます。
    早速インストールさせて頂きました。

    キャンセル

check解決した方法

0

すみません。そもそもハッシュ化したパスワードが全部登録されていなかったことが原因でした。大変申し訳ございません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/04 15:24

    パスワードに「<」や「>」、「&」があると、認証できませんよこのコードでは。

    キャンセル

  • 2017/03/04 16:21

    確かにあげていただいたものだと認証できませんでした。。
    エンコードなんでしょうか?確認してみます。

    キャンセル

0

まず、trim()で取得文字列の前後の空白を削除してみるために、

password_verify($_POST["pass"], $db_hashed_pwd))

password_verify(trim($_POST["pass"]), $db_hashed_pwd))

としてみてはどうでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/04 15:23

    ありがとうございます。
    もしかすると空白が入ることもありますもんね。
    trim次回使ってみようと思います!

    キャンセル

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

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

関連した質問

  • 解決済

    PHP ログインフォーム作成

    いろんなサイトを見ながらログインフォームを作成しています。 tablename = staff id,name,password DBの設計は単純に上記のような形としまし

  • 解決済

    PHPとMySQLについて

    ](fadebad2fd9a28a1fd4d1ebd714c7f9b.png) 今、PHPとMySQLを使った認証システムを作成しているのですが、ここで質問があります。

  • 受付中

    PHPでのUndefined indexについて。

    前提・実現したいこと データをPHPで入力し、DBへ転送する。 そのデータを更に修正を加える、というプログラミングをしています。 発生している問題・エラーメッセージ N

  • 解決済

    電話番号もしくはメールアドレスでユーザ認証させたい

    ユーザー認証を ・電話番号orメールアドレス ・パスワード にしたいのですが、どのように書けば良いでしょうか。 $sql ='SELECT * FROM user

  • 解決済

    PHPで同じファイル内で異なるテーブルに保存する方法がわかりません

    PHPでデータベースに値を保存したいのですが、同じファイルで違うテーブルに保存する方法でつまづいています。 実行すると、$pro_producerを保存するところで I

  • 解決済

    会員制サイト:メールアドレスでログイン

    前提・実現したいこと Qiita:PHPとMySQLで新規登録とログインを実装する(PDO使用)を参考に、PHPで会員制サイトを作っています。 このサイトで作れるものでは、ID

  • 解決済

    【PHP】ログイン機能の実装

    PHP初心者です。 PHPの勉強がてら、会員制のページを作成してます。 新規会員登録機能は実装できていますが、 ログイン機能の実装がうまくいきません。 やりたいことを実

  • 解決済

    ECサイトにおけるログイン機能について

    現在、ECサイトのログイン機能を作成しています。 データベース上に登録されている情報と照らし合わせて、一致するものがあればログインするという感じにしようと思っています。

同じタグがついた質問を見る

  • PHP

    20367questions

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

  • PDO

    335questions

    PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。