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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

3329閲覧

ログイン機能:直接URL禁止

xxx0_0xxx

総合スコア9

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2021/06/28 13:01

ただいまログイン機能を作成中です。
<ログイン成功時>
ログインボタン押下

POSTで送られてきたID&パスワードをDBに登録されているか検索

確認が取れればID&パスワードをそれぞれセッションに格納

ログイン成功

<ログイン失敗時>
ログインボタン押下

POSTで送られてきたID&パスワードをDBに登録されているか検索

存在しない情報

ログイン失敗

ログイン画面のままエラー表示

<直接URL禁止>
POSTでID&パスワードが送られてこなければ、メインページには行かず
ログイン画面に遷移

という流れで作っています。
しかし、直接URLをたたいてもメインページに入れてしまいます。
セッションが残ったままなので、ログインできてしまうということなのでしょうか。
ログアウト機能を作らなければ、セッションは消すことができないのでしょうか?

ログインPHP

<?php require_once "db.php"; session_start(); // エラーメッセージ初期化 $err_msg = ""; if (isset($_POST['login'])) { $login_id = $_POST['login_id']; $password = $_POST['password']; try { $pdo = new PDO($dsn,$user,$pass); // POSTされたID&パスワードをDB内で検索 $sql = 'SELECT count(*) FROM m_employee WHERE login_id=? AND password=?'; $stmt = $pdo->prepare($sql); $stmt->execute(array($login_id,$password)); $result = $stmt->fetch(); // データが渡って来なかったときの処理 }catch (PDOException $e) { echo $e->getMessage(); exit; } // ログイン認証ができたときの処理 if ($result[0] != 0) { session_regenerate_id(TRUE); $_SESSION['login_id'] = $_POST['login_id']; header('Location:http://localhost/php_kintai/shainmasuta.php'); exit; }else { // アカウント情報が間違っていたときの処理 $err_msg = "正しいログイン情報を入力してください。"; } } ?>

メインページPHP

<?php require "shainmasuta_sql.php"; //ログインされていない場合は強制的にログインページにリダイレクト if (!isset($_SESSION["login_id"])) { header("Location: login.php"); exit(); }else{ //ログインされている場合は表示用メッセージを編集 echo $_SESSION['login_id']."さんようこそ"; } ?>

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

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

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

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

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

takasima20

2021/06/28 13:21

$_SERVER['HTTP_REFERER'] はどう?
xxx0_0xxx

2021/06/28 13:56

takashima20様 >$_SERVER['HTTP_REFERER'] はどう? ありがとうございます! 調べて試してみたのですが、ログインする前のURLを if (parse_url($referer, PHP_URL_HOST) == 'login.php') { // 成功時 }else{ //失敗時 } で書いてみました。 しかし、失敗でelseに入ってしまいます。 書き方教えていただければ嬉しいです。
takasima20

2021/06/28 14:09

そこは PHP_URL_PATH じゃね? ただし、ディレクトリも含むと解析もあれなんで、とりあえず暫定的な機能ってことなら str_contains() でお茶をにごすという方法も(汗 あと、ログイン後のページ間ジャンプがあると使えない手段ではあります。
guest

回答2

0

ログイン状態のセッションが残っている状態で、メインページ(ログインが必要)が直接閲覧できるというのは、極めて一般的な仕様であり、とくに問題ではないように思います。twitterもfacebookもteratailもそうなっています。
それとは別に、ログアウト機能はあるべきだと思います。ログアウトしてセッション情報を破棄すれば、メインページは閲覧できなくなります。

投稿2021/06/28 13:25

ockeghem

総合スコア11705

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

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

xxx0_0xxx

2021/06/28 15:24 編集

ockeghem様 なるほど・・・ 確かに一般的にはログインは保持されていますね!! ログアウト機能を実装したのですが、セッションが破棄されず、そのままになってしまいます・・・ コードチェックしていただけると嬉しいです! <?php if (isset($_SESSION["login_id"])) { session_start(); unset($_SESSION["login_id"]); session_destroy(); header('Location:http://localhost/hogehoge/login.php'); exit; }else{ // 何もしない } ?>
ockeghem

2021/06/28 23:27

session_start()を先頭に移動させてください。そうしないと、$_SESSIONの参照ができず、2行目の if文が常に失敗します。このif はなくてもよく、session_start(); session_destroy(); だけでもログアウトになります。
guest

0

ベストアンサー

<直接URL禁止>

POSTでID&パスワードが送られてこなければ、メインページには行かず
ログイン画面に遷移

セッションとは別に、メインページへの遷移をログイン画面からしかできないように制限することで実現できると思います。
適当な token をログイン画面で生成し、メインページで判定してあげればよいかと。
仕組みは CSRF 対策の token と似たものになるので、参考にしてみてください。

仕様によっては、簡易的に HTTP referer で判定するというのもありかもしれません。

余談1

php

1$sql = 'SELECT count(*) FROM m_employee WHERE login_id=? AND password=?';

この記述は、パスワードが生文字列で保存されている場合に使用できるモノなので、現在、生の文字列で登録されていると思います。

パスワードは、以下の理由により、現在は適当な処理をしたハッシュ値を保存して突合することが主流になっています。
・そもそもユーザの投稿した生文字列である必要性がない
・流出した際に他のサイトで使いまわしている可能性がある
・辞書攻撃に対して一定の時間を稼ぐ必要がある

実装方法は、password_hash2018年のパスワードハッシュ を参照してください。後者は少し古いので、マニュアルを見ながら読み解くと良いです。

余談2

ログアウト機能は、以下の日記を読むと良いです。
ログアウト機能の目的と実現方法 - 徳丸浩の日記

最近、cookie 周辺の事情が怪しくなり始めていますが、今のところ有用な情報です。

投稿2021/06/28 23:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問