ログイン後のユーザーを識別する方法 - PHPプロ!Q&A掲示板

2851

  • 1000P

ログイン後のユーザーを識別する方法

質問日時 / 2010年9月3日 19:10    回答数 / 4件

Questioner:  yukosaito  このエントリーをはてなブックマークに追加 

キーワード / セッション    ログイン   

あまり詳しくないもので、勉強不足な質問ですみません。

現在、ポータルサイト構築を行っています。
ログイン画面からログイン後、
それぞれのユーザーの専用ページに移行する仕組みです。

ログイン後、ユーザページまでは間違いなく進み、
ユーザーページにログインせずに直接アクセスしようとすると、ログイン画面に
リダイレクトするようにはなっています。

ただ現状、ログインユーザー同士が、お互いの専用ページにアクセスできてしまっています。
ログインユーザーを識別し、他のユーザーの専用ページにはアクセスできないようにする
必要があるのですが、どのように記述を変えれば良いかわからない状況です。

  1. <?php
  2. session_start();
  3. $_SESSION = array();

以下のように、usernameとPWを書き込んだ別ファイルを指定しています

  1. $data_file = "./d_file.dat";

このファイルの中には、以下のように各ユーザーのusernameとPWが記載されています。

member_name1,password1,
member_name2,password2,


以下にコード続きます。

  1. $error_message = "";

  1. if(!isset($PHP_SELF)){ $PHP_SELF = $_SERVER["PHP_SELF"]; }
  2. if(!isset($action)){ $action = $_POST['action']; }
  3. if(!isset($member_name)){ $member_name = $_POST['member_name']; }
  4. if(!isset($password)){ $password = $_POST['password']; }

  1. if (isset($_POST["login"])) {
  2.   $p_data = file($data_file);
  3.   $p_flag = 0;
  4.   for($i=0; $i<count($p_data); $i++){
  5.     list($id,$pass) = split(",", $p_data[$i]);
  6.     if($id == $member_name && $pass == $password){
  7.       $p_flag++;
  8.     }
  9.   }
  10. if($p_flag > 0){
  11.     
  12. $_SESSION["login_name"] = $_POST["member_name"];

ユーザ専用画面へブラウザをリダイレクトします
  1. header("location: http://〜/$member_name/");
  2.     exit;
  1. <?php
  2. session_start();
  3. $old_session_id = session_id();
  4. session_regenerate_id();
  5. unlink(session_save_path() . '/sess_' . $old_session_id);
  6.  
  7. if (!isset($_SESSION["login_name"])) {
  8.  
  9.   header("location: http://〜/");
  10.   exit;
  11. }
  12. ?>

このようにログイン画面を設置。
ログインすると、URLの末尾にmember_nameのあるページに遷移します。

ログイン後のページには以下のように記述しています。

この記述では、各ユーザーを識別できていないのでしょうか?

試行錯誤しておりますが、うまくいきません。
何卒アドバイスを、よろしくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01yuuki<?php session_start(); $old_session_id = session
 ┗A01-1yukosaitoyuukiさん、ご回答ありがとうございます! とても
  ┗A01-1-1yuuki>ログイン後のページの記述として、おかしいのでしょ
   ┗A01-1-1-1yukosaitoありがとうございます。 場所がおかしい、という意味

回答一覧

並び替え:

A01 参考になった
answereryuuki [9月3日 20:05]

<?php
session_start();
$old_session_id = session_id();
session_regenerate_id();
unlink(session_save_path() . '/sess_' . $old_session_id);

if (!isset($_SESSION["login_name"])) {

header("location: http://〜/");
     exit;
}
?>
これが、各ユーザーのログイン後のページのソースですか?
場所が違うような・・・。

まぁそうだと仮定して進めると、
if (!isset($_SESSION["login_name"])) {

}
原因はこれでしょう。
これだと$_SESSION["login_name"]に何の値が入っていても認証が通ってしまいます。
仮にユーザーが3人、Aさん、Bさん、Cさんがいたとして、
ログインしたら値は何であれ$_SESSION["login_name"]はセットされます。
セットされた時点でこの認証はクリアできてしまう訳です。
ちなみに
$_SESSION["login_name"] = '';
これでも通ってしまいます。

それはさておき、これをユーザー本人がログインしているかどうかの判定を加える方法を考えます。
ログインしたらそのユーザー名のディレクトリに飛ぶのであれば
ディレクトリ名=$_SESSION["login_name"]かどうかという判定を加えたらどうでしょうか?
つまりはURLにログインユーザーの名前が含まれているかを判定するんです。

  1. <?php
  2. //urlを取得
  3. $url = $_SERVER['REQUEST_URI'];
  4. $user_name = $_SESSION["login_name"];
  5.  
  6. //urlにユーザー名が完全に含まれていなかったらリダイレクト
  7. if (strpos($url,'/'.$user_name) === false) {
  8.   header("location: http://〜/");
  9.   exit;
  10. }
  11. ?>

こんな感じ。

この意見に回答する

ツリーへ TOPへ

A01-1
replyeryukosaito [9月3日 22:20] (最終編集:9月4日 20:35)

yuukiさん、ご回答ありがとうございます!

とても参考になったのですが、冒頭でおっしゃられていた、「場所が違う」とは、
具体的にどういう事ですか?

ログイン後のページの記述として、おかしいのでしょうか?
素人の仕事なので、すみません。どう違うのかわからないです。

ぜひ教えていただけないでしょうか。お願いいたします。

※補足です

もしかしたら、

  1. $old_session_id = session_id();
  2. session_regenerate_id();
  3. unlink(session_save_path() . '/sess_' . $old_session_id);

これはログイン前の画面で行うべき処理ですか?

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyeryuuki [9月6日 11:46]

>ログイン後のページの記述として、おかしいのでしょうか?
いや、
ログイン後のページには以下のように記述しています。
って書いてあるのに「以下」にソースが何も書かれてないなぁ、と思っただけです。

>$old_session_id = session_id();
>session_regenerate_id();
>unlink(session_save_path() . '/sess_' . $old_session_id);
は現在の状態では何も意味をなしてないですね。

やるんであれば、
ログイン成功、セッションID発行

ユーザーページに遷移
セッションIDが正常に発行されているか確認
正常でなかったら、エラー、リダイレクト

という流れでしょうかね。

このやり方を使うのであれば、ディレクトリ名での判定はなくてもいいかもしれません。
(両方あっても問題はなし)
ここでのコツはどうやって「セッションIDが正常に発行されているか確認」を上手くやるかになるかなぁと思います。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyeryukosaito [9月7日 22:26]

ありがとうございます。
場所がおかしい、という意味、わかりました。
単純に書き方がおかしかったんですね…。

それより、いろいろアドバイスいただきまして、ありがとうございます!
おかげさまで、ユーザーページが相互にアクセスできてしまう問題は
解決いたしました。ひとまず、解決というか、アクセスできないようにはなりました。

その上で、セッションの件なのですが、
これはそもそも、セッションについて私がまだ良くわかっていないのが問題と認識しました。
このままでは、機能していないんだな、という事が理解できる所まで来れましたが…。


>やるんであれば、
>ログイン成功、セッションID発行
>↓
>ユーザーページに遷移
>セッションIDが正常に発行されているか確認
>正常でなかったら、エラー、リダイレクト

アドバイスいただいたような流れで、何とか挑戦してみます。
この度は、本当に助かりました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
include されたファイルの変数
 このエントリーをはてなブックマークに追加 
A
出来ます。include(require)は、その部分に読み込むファイルの内容を展開したのと同義です。エディタでファイル読み込み(あるいはコピペ)した状態と同じだと考えていいです。 #defineや変数定義だけの共通フ...

>>続きを読む

shimix様、いつもわかりやすい説明をありがとうございます。 「includeはエディタでコピペした状態と同じ」 この表現、私も授業で使わせていただきたいと思います。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)