
現在、以下2つのphp5プログラム(+ PEAR::AUTH)で、なんちゃってフォーム認証するCGIを作成しています。
環境 Windows XP、Web SV IIS 5.1
(1) aaa.php
: PEAR:AUTHを使った、ログイン画面(フォーム認証CGI)。
: 機能 : MySQLに格納されたID/PWで認証する。認証OKだったら、bbb.phpが出力するDBレコードデータ参照ページへのリンク集を出力する。
リンク1)http://domain.jp/bbb.php?id=1001
リンク2)http://domain.jp/bbb.php?id=1002
リンクn)http://domain.jp/bbb.php?id=nnnn
・・・といった感じで、DBに登録されたレコードを表示するCGIへのリンクをずらずら出します。
(2) bbb.php
: DBデータを整形し、多少見やすい形に加工したHTMLページを出力する。
この時、aaa.phpが認証OKの証?として出力したCookieが、
1.あったらHTMLページ出力し、
例1)http://domain.jp/bbb.php?id=1001 = 一意のキーid=1001の値で出力出来る、MySQL上のデータをHTML化したもの
例2)http://domain.jp/bbb.php?id=1002 = 一意のキーid=1002の値で出力出来る、MySQL上のデータをHTML化したもの
例n)http://domain.jp/bbb.php?id=nnnn = 一意のキーid=nnnnの値で出力出来る、MySQL上のデータをHTML化したもの
2.無かったら、
(a) http header 401を出力
(b) aaa.php(フォームログイン画面)にリダイレクトする。
一応、ここ迄はいいのですが、例えば、利用者が、上記例2のURLをブラウザ「お気に入り」で保存しておき、直接そのページをみたい、と言った時、リンク指定先のbbb.phpは、
・ そのユーザがログインしていない場合(Cookieが無い場合)、aaa.phpのログインフォームへリダイレクトする
・ aaa.phpは認証後、リンク集ページを出力する、
といった動作になってしまいます(てゆうかそうゆう作りなんで当たり前ですが・・・)。
そこで、aaa.phpの機能で、
・ 「どのURLから、リンク(リダイレクト)されてきたかを判定するロジック」を入れ、もし、「bbb.php?id=xxxx」だったら、
・ 認証OK後、直接、そのbbb.phpが出力するHTMLのURL(http://domain.jp/bbb.php?id=xxxx)に、再度リダイレクトする処理を入れれば良い?、
のかなーと短絡的に考えました。
で、問題となるのが、aaa.phpが表示された時、どこからリダイレクトされてきたか(リダイレクト元のURL)を知る方法です。
そこで、PHPの、$_SERVER[HTTP_REFERER]を入れてみた所、
・ bbb.phpにリダイレクトされる前のURLが、$_SERVER[HTTP_REFERER]に入っている(多分、別のHTMLのbbb.php?id=~へのリンク集?)
・ $_SERVER[HTTP_REFERER]の中が空(URL直接指定?)
という現象で詰まってしまいました。
ここから抜け出す為、何か良いアイディア(別の方法、関数等)があればお知恵拝借したいと考えています(書いてある事を理解して頂ける文章か今イチ不安ですが・・・)。
何卒よろしくお願いします。
No.2
- 回答日時:
リファラを見るよりセッションに保存しておくか、
header('Location: login.php?url=現在のURL');
で飛ばしてログインフォームでその値を見るとか。
後者の場合は、urlのエスケープ処理、永久ループ回避が必要です。
ログインフォームのCGIに、新たにgetパラメタをつける方法、というのも、見た目がわかり易そうでいいですね。やるとしたら、エスケープは面倒そうなので、base64かなんかで文字列化すれば、decode、encodeの関数もあったと思うので、URLの使いまわしは楽そうです。
ただ、seimurakamさんからも教えて頂いた様に、セッションに保存して、値を別のCGIで使いまわす、といった方法と、どちらがベターかつオーソドックスな方法なんでしょうか・・・?
ご回答ありがとうございました。
No.1
- 回答日時:
さらっと書いてしまうと、
>この時、aaa.phpが認証OKの証?として出力したCookieが、
こういった機構ではクッキーよりもセッションを使用した方が
セキュリティ上も好ましいと思うのですが、
クッキーにこだわる理由はありますか?
回答有難うございます。
> クッキーにこだわる理由はありますか?
全くありません。
認証を経ずbbb.php?id=xxxxにアクセスしてきたら、bbb.phpの方で、
$_SESSION['redirect_moto_URL'] = "http://domain.jp/bbb.php?id=nnnnx";
とかやってから、aaa.phpにリダイレクトし、aaa.phpは、
$_SESSION['redirect_moto_URL']
の値を取り出して、使い回す、という様な事でしょうか?(合ってますか?)
何か補足して頂ける事があれば、またよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
処理を止める関数
-
¥マークを出力したいがバック...
-
CSV出力にHTMLが入ってしまう
-
PHPSpreadsheetによる書き出し...
-
phpのheader("Location:#pos")...
-
PHPのif文でその処理を途中で抜...
-
.htaccessにphp_valueが使用できな
-
mysql→EUC-JP、php→UTF-8の時の...
-
2つの画像ファイルが異なるファ...
-
require_once()でファイルが読...
-
phpの中でphpを書けないか
-
FTPコマンドでディレクトリごと...
-
MkDir関数
-
【file_exists】ファイルが存在...
-
sqlで日付が一番古いデータの月...
-
フォームで戻った際に入力済み...
-
<A href ~ と一緒に値を渡すには
-
テレメールとは?
-
「クラス関数」「メンバ関数」...
-
Makefile.inとMakefile.am
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ob_end_clean と ob_clean の違...
-
CSV出力にHTMLが入ってしまう
-
GDで生成したはずの画像が文字...
-
Wordpress、カスタム投稿の管理...
-
mPDFでのPDF出力がうまくいかな...
-
phpにcssを適応させたい...
-
PHPで`headers already sent`と...
-
PHP/phpMyAdmin/データベースな...
-
TCPDFについて
-
PHPで取得したHTML内のdiv要素...
-
リダイレクト元のURLの取得方法...
-
ImageStringで日本語表示させたい
-
PHPにおける時間計算、時間足し...
-
PHPで五角形、または多角形のグ...
-
JavaScriptからPHP呼び出しHTML...
-
warningを画面に表示させない設...
-
CGIからPHPへの書き換え
-
FeedPHPでfeedをHTML表示を11個...
-
【smarty】<A href="">内でのみ...
-
PHPをSJISでやるのは不可能
おすすめ情報