C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: PHP MYSQL ログイン認証機能


(過去ログ 138 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■80923 / inTopicNo.1)  PHP MYSQL ログイン認証機能
  
□投稿者/ エトレ (1回)-(2016/08/20(Sat) 08:45:54)

分類:[その他の言語] 

開発環境   :cloud9
プログラム言語:PHP
DB      :MySQL

【DBデータ】
フィールド   値
「name」  → admin
「password」→ pass


件名につきまして、
ログイン・ログアウトを
MySQLであらかじめ作成したユーザーとパスワードを
PHP処理で照合して、一致していればログインする処理を作成中です。

下記DBの値は合っているはずなのに、
「ユーザ名、またはパスワードが違います。」
という結果になり、どこが原因なのかが分かりません。
ご教示頂けませんでしょうか。

宜しくお願い致します。

以下コード

【login.php】

<?php
// セッション開始
session_start();

// エラーメッセージの初期化
$errorMessage = "";

// ログインボタンが押された場合
if (isset($_POST["login"])) {
  // 1.ユーザIDの入力チェック
  if (empty($_POST["userid"])) {
    $errorMessage = "ユーザIDが未入力です。";
  } else if (empty($_POST["password"])) {
    $errorMessage = "パスワードが未入力です。";
  } 

  // 2.ユーザIDとパスワードが入力されていたら認証する
  if (!empty($_POST["userid"]) && !empty($_POST["password"])) {
    // mysqlへの接続
    $mysqli = new mysqli('127.0.0.1', 'wakatsuki_takahi', '');
    if ($mysqli->connect_errno) {
      print('<p>データベースへの接続に失敗しました。</p>' . $mysqli->connect_error);
      exit();
    }

    // データベースの選択
    $mysqli->select_db('c9');

    // 入力値のサニタイズ
    $userid = $mysqli->real_escape_string($_POST["userid"]);

    // クエリの実行
    $query = "SELECT * FROM db_user WHERE name = '" . $userid . "'";
    $result = $mysqli->query($query);
    if (!$result) {
      print('クエリーが失敗しました。' . $mysqli->error);
      $mysqli->close();
      exit();
    }

    while ($row = $result->fetch_assoc()) {
      // パスワード(暗号化済み)の取り出し
      $db_hashed_pwd = $row['password'];
    }

    // データベースの切断
    $mysqli->close();

    // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。
    //if ($_POST["password"] == $pw) {
    if (password_verify($_POST["password"], $db_hashed_pwd)) {
      // 4.認証成功なら、セッションIDを新規に発行する
      session_regenerate_id(true);
      $_SESSION["USERID"] = $_POST["userid"];
      header("Location: main.php");
      exit;
    } 
    else {
      // 認証失敗
      $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。";
    } 
  } else {
    // 未入力なら何もしない
  } 
} 
 
?>
<!doctype html>
<html>
  <head>
  <meta charset="UTF-8">
  <title>サンプルアプリケーション</title>
  </head>
  <body>
  <h1>ログイン機能 サンプルアプリケーション</h1>
  <!-- $_SERVER['PHP_SELF']はXSSの危険性があるので、actionは空にしておく -->
  <!--<form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST">-->
  <form id="loginForm" name="loginForm" action="" method="POST">
  <fieldset>
  <legend>ログインフォーム</legend>
  <div><?php echo $errorMessage ?></div>
  <label for="userid">ユーザID</label><input type="text" id="userid" name="userid" value="<?php echo htmlspecialchars($_POST["userid"], ENT_QUOTES); ?>">
  <br>
  <label for="password">パスワード</label><input type="password" id="password" name="password" value="">
  <br>
  <input type="submit" id="login" name="login" value="ログイン">
  </fieldset>
  </form>
  </body>
</html>

引用返信 編集キー/
■80924 / inTopicNo.2)  Re[1]: PHP MYSQL ログイン認証機能
□投稿者/ ニートプログラマ (3回)-(2016/08/20(Sat) 20:21:00)
「ユーザ名、またはパスワードが違います。」
ソースコードにこのメッセージはないですよね
とりあえず
「プログラムは期待されたようにではなく書かれたように動く」

引用返信 編集キー/
■80925 / inTopicNo.3)  Re[2]: PHP MYSQL ログイン認証機能
□投稿者/ エトレ (2回)-(2016/08/21(Sun) 09:31:05)
No80924 (ニートプログラマ さん) に返信
> 「ユーザ名、またはパスワードが違います。」
> ソースコードにこのメッセージはないですよね
> とりあえず
> 「プログラムは期待されたようにではなく書かれたように動く」
>

ご指摘の件、失礼しました。
エラーメッセージは以下です。

「ユーザIDあるいはパスワードに誤りがあります。」
引用返信 編集キー/
■80926 / inTopicNo.4)  Re[3]: PHP MYSQL ログイン認証機能
□投稿者/ WebSurfer (1008回)-(2016/08/21(Sun) 11:56:23)
No80925 (エトレ さん) に返信

以下の記事を参考にしているのですよね? であれば一番最初の質問にその旨書いておい
ていただくようお願いします。

【初心者向け】PHP5とMySQLでつくるログイン機能のサンプルアプリケーション
http://replication.hatenablog.com/entry/2014/06/30/005815

php には触ったこともない自分がググって調べただけなのでハズレかもしれませんが・・・

> エラーメッセージは以下です。
> 「ユーザIDあるいはパスワードに誤りがあります。」

という結果になるということは、

> if (password_verify($_POST["password"], $db_hashed_pwd)) {

で password_verify メソッドの戻り値が false になるからですよね?

password_verify メソッドは、以下の記事によると、第一引数の文字列から password_hash
メソッドでハッシュを作り、それを第二引数の文字列と比較し、マッチすれば true を返し、
しなければ false を返すそうです。

password_verify
http://php.net/manual/ja/function.password-verify.php

false になるのですから、$_POST["password"] を password_hash でハッシュした文字列
と $db_hashed_pwd が一致しないということになっているはずです。

考えられる原因はいろいろあるので(DB に格納されている password はハッシュされて
ないとか、ハッシュ化されていてもハッシュ化のアルゴリズムが違うとか、同一 userid
でパスワードが違うレコードが複数あるとか)、回答者がピンポイントで指摘するのは難
しいです。

デバッガが使えればそれを使って、使えなければ printf などを使って変数の中身を調べ
るなどして、質問者さんの方で一致しない原因を調べていただくのがよさそうです。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -