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

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

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

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

Q&A

3回答

1006閲覧

phpでログイン機能を作ったがデータベースとの照合の部分がうまく実行できない

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2020/02/29 13:52

編集2020/02/29 14:55

PHPでログイン機能を作っています。
フォームでメールアドレスとパスワードを入力し、合致するものがデータベース上にあったら次のページに移行するというプログラムを書いたつもりなのですが、データベースに事前に用意したメールアドレスとパスワードを入力しても画面遷移が起こりません。コードのどの部分が原因か調べたりしましたがいまだに原因がわかりません。
わかる方がいらっしゃったらご回答お願い致します。
###自分で試してみたこと
12行目からのif文の条件式をisset($member)のようにして、そもそも$memberにnullであっても値が入っているかどうか調べました。そしたらログイン後のページに移行したので、データベースから値を取り出すところまではプログラムが実行されていることはわかっています。

php

1<?php 2require_once('../dbconnect.php'); 3ini_set('display_errors', 1); 4ini_set('error_reporting', E_ALL); 5session_start(); 6 7if(!empty($_POST)){ 8 if($_POST['email'] != ''&& $_POST['password'] != ''){ 9 $login=$db->prepare('SELECT * FROM members WHERE email=? AND password=?'); 10 $login->execute(array($_POST['email'],$_POST['password'])); 11 $member=$login->fetch(); 12 if($member){ 13 $_SESSION['id']=$member['id']; 14 $_SESSION['time']=time(); 15 header('Location:index.php'); 16       exit(); 17 }else{ 18 $error['login']='failed'; 19 20 } 21 }else{ 22 $error['login']="blank"; 23 24 } 25} 26?> 27 28<!DOCTYPE html> 29<html> 30<head> 31<meta charest="UTF-8"> 32<link rel="stylesheet" href="css/style.css"> 33<title>ログイン画面</title> 34</head> 35<body> 36<header><h1>ログインする</h1></header> 37<main class="login"> 38<div id="lead"> 39<p>メールアドレスとパスワードを記入してログインしてください</p> 40<p>入会手続きがまだの方はこちらからどうぞ</p> 41<p>&raquo<a href="index.php">入会手続きをする</a></p> 42</div> 43<form action="" method="POST"> 44<dl> 45 <dt>メールアドレス</dt> 46 <dd><input type="text" name="email" size="35" value="<?php echo isset($_POST['email'])? htmlspecialchars($_POST['email']):""?>"> 47 <?php if(isset($error['login'])&&$error['login']==="blank"):?> 48 <p class="error">メールアドレスとパスワードを入力してください</p> 49 <?php endif ?> 50 <?php if(isset($error['login'])&&$error['login']==='failed'):?> 51 <p class="error">ログインに失敗しました。正しくメールアドレスとパスワードを入力してください</p> 52 <?php endif ?> 53 54 </dd> 55 <dt>パスワード</dt> 56 <dd><input type="passwors" name="password" size="35" value="<?php echo isset($_POST['password'])? htmlspecialchars($_POST['password']):""?>"></dd> 57 <dt>ログイン時の記録</dt> 58 <dd><input type="checkbox" name="save" value="on"><label for="save">次回からは自動的にログインする</label></dd> 59</dl> 60 61<input type="submit" value="ログインする"> 62</form> 63 64</main> 65</body> 66</html>

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

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

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

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

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

guest

回答3

0

もはやログイン機能は自分で作るべきではないのであくまでも「PHPの学習目的」以外では作らないほうがいい。
パスワードそのまま使うとか最悪のログインなので学習段階以外では絶対に許されない。

足りないのはたぶんheader()の後のexit。終了させないと続きも出力される。

header(); exit;

こういう部分でさえもう自分では書いてない。

投稿2020/02/29 14:20

kawax

総合スコア10377

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

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

退会済みユーザー

退会済みユーザー

2020/02/29 14:34

ご回答ありがとうございます! 一応PHPの学習教材を使ってやるというものでした。 一つ質問なのですが、この教材では、パスワードにsha1()を使っていたのですが、以前、sha1は使わない方がいいということを耳にし、使わないようにしました。それではなく、password Hasing関数などを使うべきということでしょうか? またなぜパスワードをハッシュしなければいけないのでしょうか? データベースが他の人に見られる可能性などを考えてということでしょうか? 素人質問ですみません。
退会済みユーザー

退会済みユーザー

2020/02/29 14:35

後exit()を使ってもページは変わりませんでした、、、
m.ts10806

2020/02/29 20:32 編集

kyuyaさん kawaxさんは再質問や確認を投げても答える人ではないので(プロフィール参照) 回答やコメントを1発で理解できなければ、質問に追記して別の回答待った方が良いです。(ただし私はこの回答に賛成していますし、他の回答者も同じかと思います)
guest

0

ログインシステムって、「会員管理システム」の一部であり、その意味では kawax さんが回答しているとおり、スクラッチで作るようなものではなくなっています。

ただ、学習素材として切り出すのであれば、一度設計からチャレンジするのは良い方法だと思います。

以下は、かなり硬い実装を必要とする要件になりますが、参考に読んでみると良いです。

参考資料:
政府機関等の対策基準策定のためのガイドライン(平成30年度版)

P171 あたりから読むと良いです。
質問コードの背景にある設計に色々問題があることがわかると思います。

また、この辺も参考になるかと
暗号化すべき情報とは?

質問への回答

画面遷移しないのであれば、遷移条件を満たしているか確認するのが適切です。
デバッグ環境を整え、ステップ実行で変数繊維を追ってみるのがおすすめですが、以下のように、該当箇所の変数の確認をするのも簡易的にはアリです。

php

12session_start(); 3 4var_dump($member);//追記 5var_export((boolean)$member);//追記 6 7if(!empty($_POST)){ 8

「sha1」を使用しない理由

安全に使用できるとされているハッシュ関数は、NIST や電子政府推奨暗号リストを参考にするとよく、sha1 はそこから外れています。

ただ、sha1 を使用すべきでない理由はそれほど強いものではないと思っています。

sha1 がハッシュアルゴリズムとして抱える問題は、主に「Collision」に関してですが、これは password をハッシュ化するときにはそれほど問題になりません。また、総当たりのための計算が高速化されていることも問題ですが、こちらも主たる問題ではないです。

一般的に問題となるのは実装方法によるものです。

sha1 で実装されている多くの場合、今どきのパスワード管理として必須である「salt」「ストレッチング」が使用されているケースがほぼ無いです。
上記の実装に関しての解説は、各所で行われているので調べてみると良いです。

sha1 + salt + ストレッチング でハッシュ値を作るのであれば、そこそこ問題のないものが出来上がりますが、積極的に採用する意味がない以上、推奨されるハッシュ関数を使用するのが適切です。

php であれば、諸々を考慮してくれる「password_hash()」が用意されているのでそれを利用するのが楽です。

投稿2020/03/01 00:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

パスワードにsha1()を使っていたのですが、以前、sha1は使わない方がいいということを耳にし、使わないようにしました。

だからって平文で保存していいわけではない。

それではなく、password Hasing関数などを使うべきということでしょうか?

「password Hasing関数」という名の関数はPHPに存在しませんが、
フレームワーク使わないのであればpassword_hash()で生成、照合はpassword_verify()で行うこと。

またなぜパスワードをハッシュしなければいけないのでしょうか?

データベースが他の人に見られる可能性などを考えてということでしょうか?

そのまま検索すれば結構出てきますよ?
「パスワード なぜ暗号化するのか」

このあたりのセキュリティについては下記など参考にしてしっかり学習した方がいいですね。

「体系的に学ぶ 安全なWebアプリケーションの作り方 」という書籍もあります(著者もteratail回答者として活動されています)

投稿2020/02/29 23:24

m.ts10806

総合スコア80765

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問