このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

POSTのSUBMITか再読込みかを判断する方法

発言者:sinbe
( Date Saturday, July 15, 2000 17:23:41 )


ひょっとして、過去にもあった話題かもしれませんが、過去ログで探しきれなか
ったので、ご質問します。

MacOS8.6+WEB共有J1.5.1を使ってREADBasic2.1.2JPROでCGIを作っています。

AというページとBというページがあって、お互い相手のページへ飛ぶ方法
をSUBMITボタンを押して、CGIを通して表示させるようにします。
AもBもCGIが生成したhtmlでno-cache指定をしてあります。

ブラウザの戻るボタンでは表示させないようにしました。
そこまではよかったのですが、戻るボタンを押した際に
ブラウザが"再読込みボタンを押せば表示されます"と出てきまして、
"フォームページを送信しなおしますか?"で はい を押すと
あっさりページが表示されてしまいます。

CGIの方でSUBMITボタンを押されたものか再読込みで来たものかを判断する
方法があるのでしょうか?

event.StringParam("post")の中身が空でくるかと思いきやそうでも
ないようなので。

また、フォームページを送信させないようにするmetaタグとかがもし
あればお教えください。


浜川みゆき さんからのコメント
( Sunday, July 16, 2000 17:34:03 )

> 戻るボタンを押した際に
> ブラウザが"再読込みボタンを押せば表示されます"と出てきまして、
> "フォームページを送信しなおしますか?"で はい を押すと
> あっさりページが表示されてしまいます。

これだと、普通にSubmitボタンを押された場合と同じ情報が
ブラウザから送られて、Webserver側では判断できない
という気がするのですが、違うのでしょうか。

例えば、A, B ページが作成された時に、絶対的にユニークなページIDを
hidden タグに埋め込んでおいて、サーバー側でIDのログと比較して、
同一ページIDからは一度だけしか受け付けない、
というのはどうでしょうか。

田中求之 さんからのコメント
( Sunday, July 16, 2000 19:13:46 )

>Webserver側では判断できない

そうですね。Web サーバ(CGI 側)では、そのままでは区別できません。
何らかの形で履歴管理を行うしかないでしょうね。浜川さんのおっしゃる
ような方法とか、Cookie でセッション ID をテンポラリに発行して、
履歴を管理するといった方法が考えられますが…

META タグでフォームの送信を禁止することはできませんが、JavaScript
あたりを使えばなんとかなるのかもしれません(JavaScript については
詳しくないので、正確には分りませんが、確かブラウザ側の履歴の情報を
操作できたように思うんですが… このへんは、詳しい方、フォローよろしく)

もしくは、根本的に、発想を変えるということも考えたほうがいいかも
しれませんね。

ショージ さんからのコメント
( Sunday, July 16, 2000 21:15:24 )

単純にCookieを使うというのはダメなんでしょうか。

フォームのページでCookieの値を消去、結果のページでCookieの値を
Onにします。

もしもCookieの値がOnになっていれば結果のページに続けて2回来たこ
とになりますから、Submitはしないという具合です。

これがもしもデータベース(またはテキストファイル)に登録するよ
うな仕組みなら、最後のレコードを調べて同じ内容なら登録をしない
様にするのも良いと思います。

僕ならばIPアドレスなんかのユーザー情報で同じ人(っぽい)ような
ら受けつけないということにします。

ここら辺の技術はカウンターのCGIなんかに盛り込まれていたり、ア
ンケートのCGIにも取り入れられていると思いますので、色々と探し
てみるのも良いと思います。

sinbe さんからのコメント
( Sunday, July 16, 2000 23:18:40 )

みなさん、ありがとうございます。

Cookieはいままで使ったことがなかったので、これから勉強してみようと
思います。

>もしくは、根本的に、発想を変えるということも考えたほうがいいかも
>しれませんね。

そうかもしれません。

一応状況を具体的に申しますと、社内LAN上のWEBサーバでの検索ページを
作っているのですが、情報の種類によっては見せる人を限定したいとします。
社内のパソコンの台数と使う人の比率は1:3〜4 ぐらいですので、
1台のパソコンを複数人が入れ代わり使うといった状況です。

画面遷移としては、IDとパスワード入力画面、検索条件入力画面、
結果表示画面の3つがあります。

IDとパスワードはDBを参照して認証するようにしています。
一旦認証したら、検索条件画面と結果表示画面は自由に行き来できる
ようにします。で検索が終わったらブラウザを閉じるか、ホームページ
に戻ってもらうようにします。

検索条件画面と結果表示画面には、そのIDの氏名を表示してあり、
開きっぱなしでパソコンをはなれた場合そのひとの責任だというルール
を作っておきます。

プログラムは、2本使っておりましてIDとパスワードを受け取って、
認証作業をし検索条件入力画面を返すものと、検索条件を受け取って
結果ページを返すものです。

検索条件画面と結果表示画面はSUBMITでお互いのCGIにむけてPOST
するようにしています。ですからそのページのHiddenにはIDとパスワード
を隠し持っています。

神経質になりすぎなのかもしれませんが、外部のものも入って来たり
社員が辞めたり入ったりが多い会社なので、ここまでのセキュリティ
は最低欲しいなと思っています。



sinbe さんからのコメント
( Sunday, July 16, 2000 23:46:51 )

あ、あと浜川さんの案ですが今日会社の帰り道かんがえてたり
したのですが、疲れれがあってか、考えがまとまらずじまいでした。
また、明日(今はビールが入っているので)ちゃんと考えなおして
みます。

おがわまこと さんからのコメント
( Monday, July 17, 2000 23:14:28 )

ページの構成とブラウザの種類によりますが
Refererを拾えば区別できる可能性があります.

sinbe さんからのコメント
( Tuesday, July 18, 2000 19:12:53 )

Cookieを少しかじってみました。

まだコードに組み込んで試してはいないのですが、こういうやり方で
いいでしょうか?

パスワード画面で認証が成功したら、検索条件入力画面を送るのといっしょに
IDとパスワードをset Cookieで有効期限なしにHEDAにつけて送ります。

結果表示の方は検索条件を受けるとともに、Cookieをチェックしてここでも
認証作業を行います、認証に成功したらIDとパスワードをSet Cookieで
有効期限なしで、結果表示のHEDAにつけて送ります。

結果表示画面から、検索条件入力画面に戻る際もCookieをつけて送ります。

このまま、ブラウザを閉じた場合はCookieは保存されないはずなのでOK
ということになります。

最後に、両方の画面からホームページに戻る処理を、SUBMITボタンで
実行するようにし、その時にIDとパスワードを意味の無い値にして
set Cookieする。

これでうまくいくのであれば、望みどうりの機能にできます。

CookieをチェックするにはFull Requestを得ないといけないということで、
それを取り出す方法は、event.StringParam("Kfrg") って指定すれば
いいんでしょうか?

ただ、WEB共有がFull Requestをパラメータで送ってくる仕様でなかったら
意味ないじゃんということになってしまいますが...。



森本哲司 さんからのコメント
( Friday, July 21, 2000 04:59:21 )

相乗りで申し訳ないのですが、Cookieを理解したいので、よい参考書など有りま
すれば、教えていただけなおでしょうか。
宜しくお願いします。

田中求之 さんからのコメント
( Friday, July 21, 2000 15:28:59 )

>Cookieを理解したいので

MacOS の CGI を作るうえでの利用法ということでしたら、この会議室の
資料室にある Understand_HTTP.pdf という PDF ファイルに、基本的な
ことは書いてあります。