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

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

ただいまの
回答率

90.48%

  • PHP

    20878questions

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

php ログインについて

解決済

回答 4

投稿

  • 評価
  • クリップ 3
  • VIEW 2,490

shinoda

score 82

お世話になります。
現在phpでログイン画面を作っているのですがうまくいかず困っています。

**********
<?php

require_once 'h.php';

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

# セッション開始
session_start();

# ユーザー名とパスワードを設定します。複数名分の設定ができます。
$userid[]   = '1';   // ユーザーID
$username[] = '1';  // お名前
// パスワード「pass1」をpassword_hash()関数でハッシュ化した文字列
$hash[] = '$2y$10$7llM8TDTW3cxrMPzwd1ydOky3FP7yYOzn/d4bEWWbeFDiQ.tTbM3O';

$userid[]   = 'test';
$username[] = 'テスト';
// パスワード「pass2」をpassword_hash()関数でハッシュ化した文字列
$hash[] = '$2y$10$qNxqM4UP79klxfqV9cIwcO6LBJI44Z34k76m9w9teN.PLpfTe8lxG';

# エラーメッセージの変数を初期化します。
$error = '';

# 認証済みかどうかのセッション変数を初期化します。
if (! isset($_SESSION['auth'])) {
  $_SESSION['auth'] = false;
}

if (isset($_POST['userid']) && isset($_POST['password'])) {
  foreach ($userid as $key => $value) {
    if ($_POST['userid'] === $userid[$key] &&
# 入力されたパスワード文字列とハッシュ化済みパスワードを照合します。
        password_verify($_POST['password'], $hash[$key])) {
# セッション固定化攻撃を防ぐため、セッションIDを変更します。
      session_regenerate_id(true);
      $_SESSION['auth'] = true;
      $_SESSION['username'] = $username[$key];
      break;
    }
  }
  if ($_SESSION['auth'] === false) {
    $error = 'ユーザーIDかパスワードに誤りがあります。';
  }
}

if ($_SESSION['auth'] !== true) {
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>簡単なログインフォームを作成したい</title>
</head>
<body>
<div id="login">
  <h1>認証フォーム</h1>
  <?php
  if ($error) {  // エラー文がセットされていれば赤色で表示
    echo '<p style="color:red;">' . h($error) . '</p>';
  }
  ?>
  <form action="<?php echo h($_SERVER['SCRIPT_NAME']); ?>" method="post">
    <dl>
      <dt><label for="userid">ユーザーID:</label></dt>
      <dd><input type="text" name="userid" id="userid" value=""></dd>
    </dl>
    <dl>
      <dt><label for="password">パスワード:</label></dt>
      <dd><input type="password" name="password" id="password" value=""></dd>
    </dl>
    <input type="submit" name="submit" value="ログイン">
  </form>
</div>
</body>
</html>
<?php
  exit();
}
**************
******↓h.php******
<?php
function h($var)  // HTMLでのエスケープ処理をする関数
{
  if (is_array($var)) {
    return array_map('h', $var);
  } else {
    return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
  }
}
*************

上記のコードなのですが
$error = 'ユーザーIDかパスワードに誤りがあります。';
が出てしまいます。
どこが間違っているのでしょうか?
ご教授いただければ幸いです。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+2

このPHPにPOSTでどのような値を渡されているのでしょうか?
期待通りの値が渡っていない可能性はありませんか?

if (isset($_POST['userid']) && isset($_POST['password'])) {
if ($_POST['userid'] === $userid[$key] && 

ここらへんのifの判定が通っていない気がします。


var_dump($_POST);
などで一度確認してみては?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/02/04 21:29

    お世話になっております。
    var_dump($_POST);
    で何も表示されないので困っていたので質問させていただきました。
    エラーは吐いてないので何かしらはPOSTに入っているとは思うのですが原因がわからなく困っています。
    もう少しいろいろ試してみます。

    キャンセル

  • 2015/02/04 22:25

    初めまして。

    var_dump($_POST);

    で何も表示されないとなると、formからpostされてないのではないでしょうか??
    post側のコードのコードの見直しをしてみては如何でしょうか?

    キャンセル

  • 2015/02/05 02:00

    h-yoshinakaさんのおっしゃる通り、正常にPOSTされていない可能性があります。通常、var_dumpすると以下のように変数の内容が表示されます。

    $ php -r '$a=[1,2,3]; var_dump($a)';
    array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
    }

    もし変数に何も入っていない場合でも以下のように何かしら表示されるかと思います。

    $ php -r 'var_dump($_POST)';
    array(0) {
    }

    おそらく何かしらのエラーが起きているような気がするので、
    一度コード全体をコメントアウトし( /* */ で)、var_dump($_POST)だけを実行してみてください。


    ちなみにどうやって値を送っていますか?
    <form action="foo.php" method="POST">
    <input type="text" name="userid">
    </form>
    とかタグ書いてますよね?

    キャンセル

  • 2015/02/05 11:31

    お世話になっております。
    ご指摘の件は早急に試したいとおもいます。
    form部分は以下に記述します。
    *************************************************
    <form action="<?php echo h($_SERVER['SCRIPT_NAME']); ?>" method="post">
    <dl>
    <dt><label for="userid">ユーザーID:</label></dt>
    <dd><input type="text" name="userid" id="userid" value=""></dd>
    </dl>
    <dl>
    <dt><label for="password">パスワード:</label></dt>
    <dd><input type="password" name="password" id="password" value=""></dd>
    </dl>
    <input type="submit" name="submit" value="ログイン">
    </form>
    *************************************************

    全体のコードは最初の質問に書いてあります。
    それでは引き続き色々と試してみたいと思います。

    キャンセル

  • 2015/02/05 12:06

    お世話になっております。
    いまvar_dumpで試したところ

    という一文字が渡ってきていました。

    キャンセル

checkベストアンサー

+1

コレで試してみてください。ファイル名を変えて。
<?php 
var_dump($_POST);
require_once 'h.php'; 

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

# セッション開始 
session_start(); 

# ユーザー名とパスワードを設定します。複数名分の設定ができます。 
$userid[]   = '1';   // ユーザーID 
$username[] = '1';  // お名前 
// パスワード「pass1」をpassword_hash()関数でハッシュ化した文字列 
$hash[] = '$2y$10$7llM8TDTW3cxrMPzwd1ydOky3FP7yYOzn/d4bEWWbeFDiQ.tTbM3O'; 

$userid[]   = 'test'; 
$username[] = 'テスト'; 
// パスワード「pass2」をpassword_hash()関数でハッシュ化した文字列 
$hash[] = '$2y$10$qNxqM4UP79klxfqV9cIwcO6LBJI44Z34k76m9w9teN.PLpfTe8lxG'; 

# エラーメッセージの変数を初期化します。 
$error = ''; 

# 認証済みかどうかのセッション変数を初期化します。 
if (! isset($_SESSION['auth'])) { 
  $_SESSION['auth'] = false; 
} 

if (isset($_POST['userid']) && isset($_POST['password'])) { 
  foreach ($userid as $key => $value) { 
    if ($_POST['userid'] === $userid[$key] && 
        # 入力されたパスワード文字列とハッシュ化済みパスワードを照合します。 
        password_verify($_POST['password'], $hash[$key])) { 
      # セッション固定化攻撃を防ぐため、セッションIDを変更します。 
      session_regenerate_id(true); 
      $_SESSION['auth'] = true; 
      $_SESSION['username'] = $username[$key]; 
      break; 
    } 
  } 
  if ($_SESSION['auth'] === false) { 
    $error = 'ユーザーIDかパスワードに誤りがあります。'; 
  session_destroy();

  } else{
  echo "ok";
  session_destroy();

  
  }
} 

if ($_SESSION['auth'] !== true) { 
?> 
OK
<!DOCTYPE html> 
<html lang="ja"> 
<head> 
<meta charset="UTF-8"> 
<meta name="viewport" content="width=device-width,initial-scale=1.0"> 
<title>簡単なログインフォームを作成したい</title> 
</head> 
<body> 
<div id="login"> 
  <h1>認証フォーム</h1> 
  <?php 
  if ($error) {  // エラー文がセットされていれば赤色で表示 
    echo '<p style="color:red;">' . h($error) . '</p>'; 
  } 
  ?> 
  <form action="<?php echo h($_SERVER['SCRIPT_NAME']); ?>" method="post"> 
    <dl> 
      <dt><label for="userid">ユーザーID:</label></dt> 
      <dd><input type="text" name="userid" id="userid" value=""></dd> 
    </dl> 
    <dl> 
      <dt><label for="password">パスワード:</label></dt> 
      <dd><input type="password" name="password" id="password" value=""></dd> 
    </dl> 
    <input type="submit" name="submit" value="ログイン"> 
  </form> 
</div> 
</body> 
</html> 
<?php 
  exit(); 
} 

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/02/05 13:42

    お世話になっております。
    今試してみたところ
    array (size=3)
    'userid' => string '1' (length=1)
    'password' => string '1' (length=1)
    'submit' => string 'ログイン' (length=12)
    と出ました
    ただし、ユーザー名とパスワードに誤りがあります
    と出たということはifでパスワードを照合するところに間違いがあるということでしょうか?

    キャンセル

  • 2015/02/05 19:57

    よこからすみません&&的外れなことを言っていたらすみません。
    そのvar_dump結果を見ると、ユーザID:1、パスワード:1を入力しているようですが、
    パスワードは"1"ではなく"pass1"を入力しないと照合出来ないのではないでしょうか。

    キャンセル

  • 2015/02/05 20:06

    自分もそう思います。ロジック的には問題ないですので。。。

    キャンセル

  • 2015/02/05 20:32

    お世話になっております。

    k.tada 様
    naoq3 様

    お二人のご教授によりうまくいきました。
    ありがとうございます。

    ただし、なぜpass1にしなければいけないのかがわかっていません。
    お手すきのの時にでもご説明いただけたら幸いです。

    キャンセル

  • 2015/02/05 20:35

    > なぜpass1にしなければいけないのか
    比較しているHashが、"pass1"という文字列をハッシュ化した文字列だからです。

    // パスワード「pass1」をpassword_hash()関数でハッシュ化した文字列
    $hash[] = '$2y$10$7llM8TDTW3cxrMPzwd1ydOky3FP7yYOzn/d4bEWWbeFDiQ.tTbM3O';

    キャンセル

  • 2015/02/05 20:44

    ↑ですね。
    多分なのですが、なんらかの書籍からソースコードをコピー等したのかもしれませんが、
    であるにしても、利用するのであれば、各関数仕様くらいは、今後の為に見てみた方がよいですよ。

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

    キャンセル

  • 2015/02/05 21:14

    k.tada 様
    naoq3 様

    お世話になっております。
    ご指摘の通りただいま教材を片手に作っているところでして動かしながら勉強しているところなので理解せずに使っている部分が多々あります。
    今後も引き続き勉強していきたいと思います。

    この度は無知な私に何から何までご教授頂き誠にありがとうございました。

    キャンセル

+1

phpのバージョンはいくつでしょうか。
問題無ければvar_dump($_POST);
は↓の感じで表示されると思います。
array(3) { ["userid"]=> string(1) "1" ["password"]=> string(5) "pass1" ["submit"]=> string(12) "ログイン" }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/02/05 12:46

    お世話になっております。
    ただいま
    <?php phpinfo(); ?>
    で確認したところ。
    バージョン5.6.3でした。

    今はxamppでテストしているところです。
    よろしくお願いします。

    キャンセル

+1

入力フォームから
ユーザIDに1
パスワードにpass1
を入力しても、ログインチェック部分でエラーになりますか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/02/05 14:08

    はい
    先ほどお答えしたように誤りがありますの方に行ってしまいます。

    キャンセル

  • 2015/02/05 15:12

    下記のタイミングでvar_dumpしてhash値が正しいか検証してみては如何でしょうか??

    password_verify($_POST['password'], $hash[$key])) {

    キャンセル

  • 2015/02/05 17:01

    お世話になっております。
    ただ今試したところ

    var_dump($_POST['$hash']);
    ↓結果
    Notice: Undefined index: $hash

    となったのでPOSTでusernameの部分が渡ってないということですか?

    キャンセル

  • 2015/02/05 17:31

    var_dump($_POST['password']);

    var_dump($_POST['userid']);
    ではいかがですか?

    キャンセル

  • 2015/02/05 18:51

    ともに
    string '1' (length=1)
    となっていたのでちゃんと渡っていました。
    となるとハッシュ化したパスワードの照合がおかしいということですかね?

    キャンセル

  • 2015/02/05 19:12

    その可能性は高いですね。
    私はpassword_verifyは使ったことないのですが・・・下記ご参考までに。

    http://gyouza-daisuki.hatenablog.com/entry/2013/12/08/161440

    var_dump()で、双方のHash値を比較してみても良いかもしれませんね。

    キャンセル

  • 2015/02/05 20:35

    お世話になっております。
    上記の方のご教授によりうまくいきました。
    親切丁寧に教えて頂きありがとうございました。

    端的に原因を申しますとパスワードを'1'で入力していたのですが'pass1'と入力しなければいけなかったようです。
    この度はありがとうございました。

    キャンセル

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

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

関連した質問

  • 受付中

    PHPでセッション管理の設定を行いたい

    Joomlaでポータルサイト制作を行っている者です Joomlaで作ったログイン機能付きのホームページに PHPを組み込んでセッション関数でセッション管理が出来るようにしたいのです

  • 受付中

    cakephpで登録された情報でログインできない

    cakephpを最近勉強し始めました。 簡単な会員制掲示板を勉強していますが、 登録された情報でログインできません。 (メールアドレスとパスワードが一致していればログインできるは

  • 解決済

    PHPとMySQLについて

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

  • 解決済

    phpでの値の受け渡しについて

    現在。htmlで値を取得しphpでチェック処理しております。 name="password"はしっかり値が渡せて、phpでチェックができるのですが、 name="usern

  • 解決済

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

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

  • 解決済

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

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

  • 解決済

    会員登録ページの性別箇所がデータベースに登録されない

    性別以外の ユーザー名、パスワード等は、データベースに登録されるのですが、 性別のみ登録されません。 原因がわかりません。 ちなみに、 phpmyadminでカラムs

  • 解決済

    PHPセッションCookie

    いつもお世話になっています。 数ある投稿の中ありがとうございます。 さて、早速本題に入らせていただきますが、私はPHP初心者でまだサンプルコードなどを参考にしながら勉強をしているも

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

  • PHP

    20878questions

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