スレッド表示 | フラット表示〕 全トピック 920 件中 378 番目 次≫ ≪前

PHPのセッションがうまく使えません

created: 2005-08-30 17:56 | modified: 2005-09-02 09:38 | reply: 12

[2517] PHPのセッションがうまく使えません

user: さくら | created: 2005-08-30 17:56
はじめて質問をさせていただきます。
現在、PHPとMysqlでWEBアプリケーションを作っています。

そこで、セッションを使用した認証を実装したいのですが、
なかなかうまくいきません。
恐れ入りますが、ご助力をお願いします。

【実装したいこと】
ログイン画面で、ログインできたユーザーにセッションを渡して
以後、他のページを使用する場合は、セッションが存在しないと
確認できないようにしたい。

つまり、ログインしていないユーザーが、
他のページのURLを直接指定してもページの閲覧ができないように
したいのです。


【現状】

ログイン後、他のページを閲覧してサイトのURLをコピーし、
一旦ブラウザを閉じて、コピーしたURLを貼り付けると
閲覧していたページが見えてしまいます。。

この状態でリロードしても、ページは閲覧できる状態のままです。

ただし、閲覧しているページ上に存在しているリンクをクリックすると
その先は、ログインしないと見えないようにはなっています。

これは、ブラウザのキャッシュを見てしまっているのでしょうか。

session.use_cookies = 1
session.use_only_cookies = 1
session.cookie_lifetime = 0
session.cache_limiter = private

現在は、上記のような設定にしています。
他に、確認すべき設定事項があったら教えてください。
また、お気づきの点があったら教えてください。


以上、よろしくお願いします。
reply: 2518 返信 編集 削除

[2518] セッションを使った認証

user: ゆうじ | created: 2005-08-30 19:19
こんばんわ。

私の場合は、
セッション変数にログインを示す値を入れておいて
各ページでその値を確認するという手法を取っています。
実際にはタイムアウト処理もかねて下のような感じになります。

認証ページではこう
session_start();
$LifeTime = 1440; //タイムアウト用有効期限(秒)

if ($auth) {
// 認証○
$_SESSION['login'] = time() + $LifeTime;
} else {
// 認証×
$_SESSION['login'] = null;
}


各ページではこう
session_start();
$LifeTime = 1440; //タイムアウト用有効期限(秒)

if ($_SESSION['login'] > time()) {
// 認証○
$_SESSION['login'] = time() + $LifeTime;
echo '認証済:ごゆっくりご覧下さい。';
} else {
// 認証×
echo '認証未:ログインしてご利用下さい。';
}


> 以後、他のページを使用する場合は、セッションが存在しないと
> 確認できないようにしたい。

『このセッションが存在しない』ことを
どのような方法で確認するんでしょうか。
大変興味ありますので宜しければ教えてください。
Parent: 2517  reply: 2520 返信 編集 削除

[2520] Re.セッションを使った認証

user: さくら | created: 2005-08-31 09:46
おはようございます。

返信いただきありがとうございます。
ご提示いただいた方法は、非常に参考になります。
現在私が作成中のものは、特にタイムアウトを設けて降りませんが、今後必要があれば参考にさせていただきます!


ゆうじさんの方法でも、各ページで値を確認しているとのことなので、
当然、認証ページを通っていない場合は、各ページのURLを直接指定しても
【認証未:ログインしてご利用ください】のメッセージが表示されるのですよね?

私が作成しているものは、この部分でつまづいてしまっています。。
一度ログイン後、ブラウザを一旦閉じても直接URLを指定すると認証していないのに、各ページが確認できてしまいます。
キャッシュを見ているのかなぁとも思うのですが、
原因がまだ分かりません。
もし、何かお気づきの点がございましたら教えてください。



> > 以後、他のページを使用する場合は、セッションが存在しないと
> > 確認できないようにしたい。
>
> 『このセッションが存在しない』ことを
> どのような方法で確認するんでしょうか。
> 大変興味ありますので宜しければ教えてください。

初心者なので、変な文章の書き方をしてしまいましたか・・?
認証ページで認証ができたときに、セッションに値を挿入しているので、各ページでは値が確認できなければ
『セッションが存在しない』ということにしています。。
Parent: 2518  reply: 2521 返信 編集 削除

[2521] Re.セッションを使った認証

user: ゆうじ | created: 2005-08-31 11:14
> 当然、認証ページを通っていない場合は、各ページのURLを直接指定しても
> 【認証未:ログインしてご利用ください】のメッセージが表示されるのですよね?

はい。URLを直接指定しても
ログインのフラグが立っていなければ認証未となります。


> 認証ページで認証ができたときに、セッションに値を挿入しているので、各ページでは値が確認できなければ
> 『セッションが存在しない』ということにしています。。

私が挙げた方法とほぼ変わりないように読み取れるのですが
URLを直接指定すると未認証でも認証済のコードが実行されるんですね。
session_start()が無いとか、ちょっとしたコードの書き方でしょうか。
認証の確認方法の違いだと思いますがこれ以上は
実際のコードを見てみないとなんともいえません。

URLを直接指定した時に表示されるページがキャッシュかどうかは、
該当ページに時刻を表示させればわかります。
Parent: 2520  reply: 2523 返信 編集 削除

[2523] キャッシュのようです・・

user: さくら | created: 2005-08-31 12:05
ゆうじ様
返信いただきありがとうございます。

> URLを直接指定した時に表示されるページがキャッシュかどうかは、
> 該当ページに時刻を表示させればわかります。

教えいただいた通り、該当ページに時刻を表示させてみたところキャッシュが表示されていました。
キャッシュが表示されないために、何か対策はございますか?


ちなみに、このキャッシュが表示されている状態で
リロードしてみましたが、時刻は変わりませんでした。。
こういうものなのでしょうか?

初心者でよく分かっていない部分が多々あるので、
何を言っているのか?と思われるかもしれませんが、
イメージ的にリロードするということは、再度ページを読み込むということだと思うので、
時刻も変わるのではないか?と思ったのですが・・。
Parent: 2521  reply: 2524 返信 編集 削除

[2524] ローカルキャッシュなら問題ないと思いますが

user: ach | created: 2005-08-31 13:31
さくらさん初めまして

>リロードしてみましたが、時刻は変わりませんでした。
普通変わります。変わらない可能性があるのはプロクシを使っている時です。
サーバーがリバースプロクシを使っている時も起こりえますね。

次のことを試してみて下さい。
IEでログイン -> ログアウト(もしくはタイムアウト)-> IE以外のブラウザ(携帯端末、NSなど:その辺のタブブラウザはだめ)でURLを直接指定

時間表示が変わっていない時はネットワークに問題があります。
時間表示は変わっているがページが見えている時は認証に問題があります。

ページが見えない時は実用上の問題はありません(他人のページを見ることは出来ないという点で)。
IEの設定か、クッキーとセッションの有効期限の問題と思います。
参考:http://ns1.php.gr.jp/pipermail/php-users/2001-October/002744.html
ゆうじさんがタイムアウトをもうけているのはこの問題を明確に解決するためです(たぶん)
Parent: 2523  reply: 2525 返信 編集 削除

[2525] 確認してみました

user: さくら | created: 2005-08-31 14:53
ach様 はじめまして
回答いただきありがとうございます。


> 次のことを試してみて下さい。
> IEでログイン -> ログアウト(もしくはタイムアウト)-> IE以外のブラウザ(携帯端末、NSなど:その辺のタブブラウザはだめ)でURLを直接指定

早速試してみました。
NSでコピーしたURLを直接指定したところ、
認証のエラーページ(私が作成したセッションが確認できなかった場合表示するエラーページ)が
表示されました。

したがって、ash様にご指摘いただいている
> ページが見えない時は実用上の問題はありません(他人のページを見ることは出来ないという点で)。

このような形になると思うのですが、
「実用上の問題はありません」の意味がいまいちよく分かりませんでした。
大変申し訳ないのですが、もう少し詳しくお話していただけるととても助かります。。



> IEの設定か、クッキーとセッションの有効期限の問題と思います。
> 参考:http://ns1.php.gr.jp/pipermail/php-users/2001-October/002744.html

つまり、一旦ブラウザを閉じてもセッションが有効となっているからページが表示されてしまうということでしょうか。
記憶違いだったら申し訳ないのですが、以前ブラウザを閉じた時点でセッションは切断される、、、
というようなことを見かけたことがあるような気がしますが
これは間違いなのですね。
(とっても曖昧な記憶なので、もう一度調べてみます)

> ゆうじさんがタイムアウトをもうけているのはこの問題を明確に解決するためです(たぶん)

そうでしたか!
本当に初心者なもので、何も分からず・・。
このように説明いただけるととてもうれしいです。
Parent: 2524  reply: 2526 2527 返信 編集 削除

[2526] Re. 確認してみました

user: ゆうじ | created: 2005-08-31 17:19
本題とはちょっと離れますが、

> ブラウザを閉じた時点でセッションは切断される

session.cookie_lifetime = 0 ならば
ブラウザを閉じた時点でブラウザが持つセッションIDは破棄されますので、
実質「セッションは破棄される」と考えて間違いありません。

しかし、サーバにあるセッション情報はすぐに破棄されないので、
何らかの方法でセッションIDが漏れると再びセッションが有効になる場合があります。
これを防ぐのがタイムアウトを確認する認証処理です。

セッションを使った認証にタイムアウト処理が必要になるのは
もっぱらセッションIDの受け渡しに URL を使っている場合です。

・クッキが有効で無いブラウザでセッションを使う。(携帯端末他)
・異なるサーバ間でセッションを共有する。(http <-> https)
・期限付きのURLを発行する(メールを使ったユーザ登録)

このページのスレッド
[972] ユーザー認証
http://www.sound-uz.jp/php/bbs/thread/972

セッションの切断に関するメモ
http://www.sound-uz.jp/php/archives/memo/session_login.txt

以上参考まで。


話を戻しますが、一切キャッシュさせたくないなら
session.cache_limiter = nocache としてはいかがでしょう。
http://jp.php.net/manual/ja/function.session-cache-limiter.php
Parent: 2525  reply: 2528 返信 編集 削除

[2528] ありがとうございます

user: さくら | created: 2005-09-01 09:54
ゆうじ様
返信が遅くなり申し訳ございません。


セッションに関するお話、とても参考になりました。
本当にありがとうございます。
(・・まだまだ分かっていない部分が多いのですが、随時理解するよう努力していきます)


> session.cookie_lifetime = 0 ならば
> ブラウザを閉じた時点でブラウザが持つセッションIDは破棄されますので、
> 実質「セッションは破棄される」と考えて間違いありません。
>
> しかし、サーバにあるセッション情報はすぐに破棄されないので、

そうだったんですね。
初めてセッション情報が保存されているディレクトリの確認をしてみましたが、ちゃんと残っていました・・。

教えていただくまでは、こんなところをチェックしてみようなんて思いもしなかったです。


> 話を戻しますが、一切キャッシュさせたくないなら
> session.cache_limiter = nocache としてはいかがでしょう。
> http://jp.php.net/manual/ja/function.session-cache-limiter.php

ご指摘の通りです。。
ただ、このセッション問題にぶつかるずっと前に、
【入力ページ】⇒【確認ページ】⇒「戻る」ボタンを押して【入力ページ】
このような動作をした場合に、入力ページで入力した内容が消えてしまうという現象に悩まされ、
session.cache_limiter = nocache を変更したという経緯があります。

この設定を変更しなおしたら、上記の問題が再度浮上してしまうので避けたいと思っています。
Parent: 2526  返信 編集 削除

[2527] 実用上の問題

user: ach | created: 2005-09-01 00:17
は、そのページのセキュリティ上の問題と言うことです。

私はてっきりMyYahooやgoo-mailのようなユーザー毎にページを管理するシステムの話だと思っていたので、
“セッションを通じてユーザーの情報が漏れる心配があるか?”という視点で考えていましたが・・・
つまり、一人のユーザーがログインしたらあとは誰でもその隠されたページを見ることが出来るようになっていないか? という問題を考えていたのですが・・・
なんだか違うような気が・・・
Parent: 2525  reply: 2529 返信 編集 削除

[2529] 説明不足でごめんなさい

user: さくら | created: 2005-09-01 10:06
ach様
返信いただきありがとうございます。


> は、そのページのセキュリティ上の問題と言うことです。
>
> 私はてっきりMyYahooやgoo-mailのようなユーザー毎にページを管理するシステムの話だと思っていたので、
> “セッションを通じてユーザーの情報が漏れる心配があるか?”という視点で考えていましたが・・・
> つまり、一人のユーザーがログインしたらあとは誰でもその隠されたページを見ることが出来るようになっていないか? という問題を考えていたのですが・・・
> なんだか違うような気が・・・

説明不足で申し訳ございません。

現在作成しているのは、ユーザー毎にページを管理するようなシステムではございません。
限られた人のみがアクセスすることができ、アクセスできれば皆同じ内容が確認できるようなシステムです。

したがって、限られたユーザー以外の人が、
ログイン後のURLをコピーして直接指定してページを確認する、なんてことが現実あるかどうか非常に疑問です。。
特にブラウザのキャッシュが存在して見えているのであれば、
尚更ありえなさそうです。

ただ、URLをコピーして直接指定することで、前のページを確認できるという事実が、なんとなく気持ちが悪く質問させていただきました。



問題は、セッションではなくブラウザのキャッシュらしいということは分かったのですが、
何か回避する方法があったら教えていただけると嬉しいです。
(ブラウザのキャッシュを無効にする方法とか・・)

昨日検証するよう教えていただいたときにNSを導入して確認したのですが、
NSでは、URLの直接指定でページを閲覧することはできませんでした。
また、ページに挿入した現在時刻もリロードするごとに変更されました。

上記から、IEの設定によってもNSと同じような動作をするのではないかと思い、
昨日色々探してみたのですが、なかなかよさそうな設定が見つかりません。


もし、ご存知でしたら教えていただきたく思っています。
Parent: 2527  reply: 2530 返信 編集 削除

[2530] IEの設定案

user: ゆうじ | created: 2005-09-01 17:59
私の方では試せないので有効な手段か判断できないのですが
以下の設定を変えればキャッシュの有無に関わらず
ページを読みにいってくれそうです。

IEのメニューから、[ツール]→[インターネットオプション]を開き、
[全般]タブ中ほどの「インターネット一時ファイル」の
[設定]ボタンをクリックし「設定」を開きます。

「保存しているページの新しいバージョンの確認」のところを
デフォルトでは「自動的に確認する」になっていると思いますが、
これを「ページを表示するごとに確認する」を選択する。


もしこれでキャッシュの問題が解決できたとして、
ユーザにこの設定変更を促すことは出来ても強制は無理なので
根本的解決策にはならないでしょうね。

session.cache_limiter = nocache として
フォームを使ったページの場合は

1.フォームの入力値をセッションに保存する。
2.確認ページに「やり直す」ボタンを目立つようつける。
3.フォームのvalueに保存してあるセッションの値を挿入する。

少々手間ですがこうした仕様のほうがユーザに親切な気がします。
まあこういう方法もあるということで検討材料にしてください。
Parent: 2529  reply: 2532 返信 編集 削除

[2532] アプリケーションで対応してみます

user: さくら | created: 2005-09-02 09:38
ゆうじ様
返信ありがとうございます。


> IEのメニューから、[ツール]→[インターネットオプション]を開き、
> [全般]タブ中ほどの「インターネット一時ファイル」の
> [設定]ボタンをクリックし「設定」を開きます。
>
> 「保存しているページの新しいバージョンの確認」のところを
> デフォルトでは「自動的に確認する」になっていると思いますが、
> これを「ページを表示するごとに確認する」を選択する。

上記の方法ですが、既に私の環境で試してみていたのですが、
残念ながら効果はありませんでした。

NSで同様の設定をした場合は、効果があったのですが・・・。


> もしこれでキャッシュの問題が解決できたとして、
> ユーザにこの設定変更を促すことは出来ても強制は無理なので
> 根本的解決策にはならないでしょうね。

本当に、ご指摘の通りです。。


> session.cache_limiter = nocache として
> フォームを使ったページの場合は
>
> 1.フォームの入力値をセッションに保存する。
> 2.確認ページに「やり直す」ボタンを目立つようつける。
> 3.フォームのvalueに保存してあるセッションの値を挿入する。
>
> 少々手間ですがこうした仕様のほうがユーザに親切な気がします。
> まあこういう方法もあるということで検討材料にしてください。

ありがとうございます。
ご教授いただいた上記の方法含めて、アプリケーション側で対応できるよう検討してみたいと思います。


色々と親切に教えていただき本当にありがとうございました。

以上、よろしくお願いします。
Parent: 2530  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 378 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑