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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

2回答

923閲覧

ログイン処理で正しいパスワードを入力しているにもかかわらず、ログイン後の該当ページに遷移しない

yayochan_0305

総合スコア1

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

1クリップ

投稿2021/11/29 08:29

編集2021/11/30 02:46

前提・実現したいこと

PHP初心者です。何卒宜しくお願い致します。
PHPで、DB(PostgreSQL)に登録している名前とID、パスワードを照合し、ログインする画面を作っています。

課題

login_form.phpで、DB上正しいデータを入力しているにもかかわらず、ログインが成功しない

該当のソースコード①login_form.php

php

1<html> 2<body> 3 <form name="login_form" action="login.php" method="post"> 4 <div class="login_form_top"> 5 <h1>〇〇システム</h1> 6 </div> 7 <div class="login_form"> 8 <br> 9 <label>ユーザーID<label> 10 <input type="id" name="user_id" placeholder="ユーザーIDを入力してください"><br> 11 <label>パスワード:<label> 12 <input type="password" name="pass" placeholder="パスワードを入力してください"> 13 </div> 14 <button type="submit" value="ログイン">ログイン</button> 15</form> 16 </body> 17</html>

該当のソースコード②login.php

php

1<?php 2session_start(); 3$user_id = $_POST['user_id']; 4//DB接続 5$dsn = "pgsql:dbname=postgres host=localhost port=5432'"; 6$username = "postgres"; 7$password = "pospos"; 8try { 9 $dbh = new PDO($dsn, $username, $password); 10} catch (PDOException $e) { 11 $msg = $e->getMessage(); 12} 13 14//ユーザー情報の照合 15$sql = "SELECT user_id,password FROM ms_user WHERE user_id = :user_id"; 16$stmt = $dbh->prepare($sql); 17$stmt->bindValue(':user_id', $user_id); 18$stmt->execute(); 19$member = $stmt->fetch(); 20 21//パスワードにマッチしているかチェック 22if (password_verify(@$_POST['pass'], @$member['password'])) { 23 //DBのユーザー情報をセッションに保存 24 $_SESSION['user_id'] = $member['user_id']; 25 $_SESSION['pass'] = $member['password']; 26 $msg = 'ログインしました。'; 27 $link = '<a href="menu.php">〇〇システム</a>'; 28 } 29 else { 30 $msg = 'ユーザーIDもしくはパスワードが間違っています。'; 31 $link = '<a href="login_form.php">戻る</a>'; 32} 33?> 34 35<h1><?php echo $msg; ?></h1> 36<?php echo $link; ?>

DBについて

テーブル名:ms_user
項目   :
user_id(character varying(50))→ユーザーID
user_name(character varying(20))→ユーザー名
password(character varying(30))→パスワード
auth(character varying(2))→権限
※今回使うのは、user_idとpasswordです。
また、今回は単純にDBに先に流し込んでおいたデータを用いてひとまずログインを、という考え方でやっておりますので、登録処理については未実装です。

試したこと

参考にしているのは、次のページです。
https://qiita.com/ryo-futebol/items/5fb635199acc2fcbd3ff
ひとまず、var_dump()で$memberの値が取れているのは確認しています。
また、SQLについては、A5Mk2で流してみておそらく正しいことを確認しています。
完全に手づまりな状態です。助力いただければ幸いです。

【2021/11/30 追記】
var_dump($_POST)は試したうえで、値が取れていたことを確認しました。
var_dump(password_hash($_POST['pass'], PASSWORD_DEFAULT));とvar_dump($member['pass']);については、前者はハッシュ値、後者はあらかじめDBに登録しているパスワードが出力されました。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/11/29 08:35

データ登録処理も提示してください
m.ts10806

2021/11/29 08:35

あと、DBの定義も
skys215

2021/11/30 01:22

password_verifyがfalseで、elseに入って行く事ですか? var_dump($_POST)は試したか? var_dump(password_hash($_POST['pass']));とvar_dump($member['pass']);は同じですか?
yayochan_0305

2021/11/30 02:23

m.ts10806さん> DBについて記載しました。 また、登録処理については未実装です。(ひとまずDBの値から引っ張ってきてログインの処理を実装しようとしているため。) skys215さん> 試したこと、上記結果について現状記載しました。
m.ts10806

2021/11/30 02:24

余談ですが、DBアプローチがpg_*とPDO混ざってます。実装のブレとなるのでいずれかに統一してください。 あと、どうやってデータ流し込んだのですか? 直にSQLならPHPの機能であるpassword_hash()は利用できず、それは同時にpassword_verify()による照合もできないということになります。
skys215

2021/11/30 02:28

すみませんvar_dump(password_hash($_POST['pass'], PASSWORD_DEFAULT));でした
FKM

2021/11/30 02:40

password_hash関数は第2引数が必要ですが、下手に使うとドツボにはまりますよ。なぜなら、毎回毎回ロード時にハッシュ値を書き換えてしまうからです。なので、一回だけ読みだしたら、すぐにその値をpostgreSQLに更新し、かつvar_dump(password_hash(…))をコメントアウトしてください。
yayochan_0305

2021/11/30 03:01

皆様、本当にありがとうございます。 まず、m.ts10806さんがおっしゃるように、まず、データについてはSQLで直に流し込んでいたので、それでまずはハッシュ値も何も……という状況でした。 また、skys215さんやFKMさんも、ハッシュ値についての情報、ありがとうございます。 毎回毎回、書き換わってしまうのですね……。 今回、DBから直に値を取ってこようとしていたので、ハッシュ値そのものを用いていなかったのですが、今後勉強していく中で間違いなく必要な知識になるので、しっかり勉強しようと思います。 ひとまず、処理としては一旦解決できたので、その旨書きたいと思います。 本当にお手数をおかけしました。ありがとうございました。
skys215

2021/11/30 03:11

すみません、password_hashは毎回書き変わることを忘れてしまいました。
guest

回答2

0

自己解決

結論から申し上げますと、そもそのDBにSQLで直接値を流し込んでいたのが原因だったので、処理が上手く動いてきていませんでした。
login.phpのパスワードのマッチングは、以下の様にかけるのが正解でした。

php

1if ($_POST['pass']==$member['password']) { 2 $msg = 'ログインしました。'; 3 $link = '<a href="menu.php">電子帳帳簿管理システム</a>'; 4 } 5 else { 6 $msg = 'ユーザーIDもしくはパスワードが間違っています。'; 7 $link = '<a href="login_form.php">戻る</a>'; 8}

しかしながら、ハッシュ値等々自分がよく分かっていなかったため、いただいたアドバイスや回答を参考にもっとしっかり知識をつけていかなければと感じました。
ご回答・ご指摘いただいた皆様、本当にありがとうございました。

投稿2021/11/30 03:04

編集2021/11/30 03:12
yayochan_0305

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FKM

2021/11/30 03:07

それだと代入式ですよ。==にしないと。
skys215

2021/11/30 03:12

if ($_POST['pass']=$member['password']) { 一つ=じゃなく、二つ==じゃないでしょうか?
yayochan_0305

2021/11/30 03:13

すみません、ありがとうございます! 早めにこの記述にも慣れないといけないですね……。助かりました!
guest

0

password_hash関数で生成した暗号とpostgreSQL上に登録されているpasswordの暗号が一致していない可能性が極めて高いですね。

password_hash関数は非常に最新の注意を払う必要がある関数で、毎回毎回ロードする度に生成するハッシュ値が変化します。

たとえば
passwordをhogeとしたときに一度目は暗号がabcdefとなっても、もう一度ロードすると二度目はbcdefghになったりします。その状態でpassword_verify関数を用いても当然認証が一致しません。

なので、作成中にpassword_hash関数をそのままにしていたために、postgreSQL上には一世代前に生成された暗号が入力されている状態だと考えます。

対策としてはvar_dumpでもう一度暗号を出力し、その値をそのままpostgreSQLのpasswordの値に差し替えてください。次に必ずデバッグに用いたpassword_hash関数の部分を消去してから、もう一度ログインすると認証が一致するようになります。

自分もこれでかなり大変な目に遭ったことがありますので。

投稿2021/11/30 02:53

編集2021/11/30 02:55
FKM

総合スコア3633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問