php ログインについて
解決済
回答 4
投稿
- 評価
- クリップ 4
- VIEW 3,871
現在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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+3
期待通りの値が渡っていない可能性はありませんか?
if (isset($_POST['userid']) && isset($_POST['password'])) {
if ($_POST['userid'] === $userid[$key] &&
ここらへんのifの判定が通っていない気がします。
var_dump($_POST);
などで一度確認してみては?投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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();
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
問題無ければvar_dump($_POST);
は↓の感じで表示されると思います。
array(3) { ["userid"]=> string(1) "1" ["password"]=> string(5) "pass1" ["submit"]=> string(12) "ログイン" }
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
ユーザIDに1
パスワードにpass1
を入力しても、ログインチェック部分でエラーになりますか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
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
$ 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で試したところ
m
という一文字が渡ってきていました。