
現在、以下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で質問しましょう!
似たような質問が見つかりました
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- PHP PHP MySql ページング 2 2022/09/20 06:38
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- MySQL 「掲示板のログイン画面」はPHP~MySQLに「データベース認証のシステム」方式です。 1 2022/09/27 05:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
header('Content-type: ima
-
htmlspecialcharsの付けどころ...
-
image関数でMS Pゴシックを使い...
-
関数に@を付けて呼び出す
-
PHPで表示したテーブル内容をCS...
-
phpでmysqlから画像パスを出力する
-
PHP検索 完全一致のみヒット
-
PHPからjpeg画像出力時、コメン...
-
変数名の前後に文字列を追加す...
-
PHPで`headers already sent`と...
-
【smarty】<A href="">内でのみ...
-
PHPSpreadsheetによる書き出し...
-
連続投稿対策
-
cgi-binでPHP動作しない
-
モバイルサイトのxhtmlでPHPを...
-
FTPコマンドでディレクトリごと...
-
PHPのif文でその処理を途中で抜...
-
phpのrand関数は本当にランダム?
-
mingwにパスを通せたのですが、...
-
AS3外部テキスト読み込み
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CSV出力にHTMLが入ってしまう
-
リダイレクト元のURLの取得方法...
-
PHPSpreadsheetによる書き出し...
-
TCPDFについて
-
mPDFでのPDF出力がうまくいかな...
-
exit exit(); 言語構造
-
論理演算 NAND に関しての質問
-
smarty foreach 半角スペース
-
¥マークを出力したいがバック...
-
image関数でMS Pゴシックを使い...
-
phpにcssを適応させたい...
-
ob_end_clean と ob_clean の違...
-
画像をDBに保存し、表示させ...
-
Headerが送信されない!?
-
PHPでPDFを作成するためのライ...
-
phpexcelにてsubmitボタンを押...
-
PerlからPHPへ移行したときの注...
-
文字列を段落で分ける方法を教...
-
PHP/phpMyAdmin/データベースな...
-
PHPで取得したHTML内のdiv要素...
おすすめ情報