WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:二重投稿の防止について

0:[投稿] atusi [2002/07/14 11:21 ][環境:WIN+IE WIN系+Perl]

現在アンケートCGIをperlで作成しているのですが、

単純にボタンを押すとその項目が投票されるような
ものを作っています。

この場合、二重投稿の制御はクッキーを用いて
行うしかないのですよね?

ただ、下を拝見しましたがクッキーを受け付けない人も
いらっしゃるんですよね?
http://www.ybi.co.jp/koike/qa1500/qa1766.htm

やはり項目だけを選んで選択するだけ、であると
完全な二重投稿の禁止というのは理論的に不可能なのでしょうか?


1:[回答] itomasa7 [2002/07/14 15:29 ]

ひさびさ?に投稿させていただきます。

1度表示したページから、複数回投稿させるのを防ぐ(投稿ボタンを連打されるなど)、
ということであれば、

「方法1」
JavaScriptが非許可になっている場合などを考慮した場合

1.投稿元のページを表示
 (CGIなどでこの画面を表示、その際ページ上に一意の値(投稿キー、とする)を埋め込む)

2.投稿
 投稿キーの値でまだ投稿されていなければ、DBに投稿キーを登録し、投稿させる。

3.投稿元のページからさらに投稿した場合
 投稿キーの値がすでにDBに登録されているので、投稿を破棄する

(投稿キーをDBに登録していく必要があるので、投稿ごとにどんどんデータが増えてしまいます。
また、投稿元のページを開きなおした場合などは、投稿キーの値が変わりますので、再度1度は投稿されていまいます。)

「方法2」
JavaScript許可を前提とするなら

1.投稿元のページを表示
 JavaScriptの変数として投稿済みフラグ、を用意する。

2.投稿
 投稿元ページ上の投稿済みフラグをONにする。

3.投稿元のページからさらに投稿した場合
 投稿済みフラグが立っているので、投稿処理を行わせないようにする。
 (投稿元のページを移動してしまった場合なども、ブラウザの戻るボタンなどで前のページに戻った場合、
 IE,NNはページ上の変数値の値を保持しているはず・・・)

HTTP_REFERERの値などを使用することも考えられますが、
どうなんでしょう。


2:[質問] atusi [2002/07/14 18:50 ]

ご返信どうもありがとうございます。

まず今回作りたいCGIですが、

> 1度表示したページから、複数回投稿させるのを防ぐ(投稿ボタンを連打されるなど)、

上の機能に加えてある程度(1週間くらい)の間は再投稿を防ぐ、というものを
作りたいのですが、これはやはりクッキーも使わないと無理ですよね?

「投稿キー」も組み合わせて使えばクッキーOFFの環境にもある程度対応できる、という
ことですよね?

さらにJavaScript の方法も使わせて頂く、、、

という具合に、「色々と組み合わせ」れば対応できる環境も増える、といった
解釈は正しいのでしょうか?

どうぞよろしくお願いいたします。


3:[回答] itomasa7 [2002/07/15 01:18 ]

>上の機能に加えてある程度(1週間くらい)の間は再投稿を防ぐ、というものを
>作りたいのですが、これはやはりクッキーも使わないと無理ですよね?

多分、無理だと思います。


Cookieが使える場合、
投稿時にそのユーザのブラウザのCookieに投稿した日時などを登録することで、
(ブラウザを開きなおす、インターネット接続を切断する、などに関係なく)
そのユーザが再度投稿元ページを表示し投稿を行おうとした際、
そのユーザのCookieを参照することで、そのユーザが投稿済みであること
(+1週間経っているかどうかなど)を判定できるので、
問題なく再投稿を防ぐことができます。


しかし、Cookieが使えない場合、
そのユーザが投稿後そのページを表示している間
再度投稿を行おうとするのは防ぐことが出来ますが、
一度ブラウザを閉じまた開いて投稿元ページを表示し投稿を行おうとした場合、

・ページ上に投稿キーを埋め込んだ場合
・JavaScriptの変数で投稿済みフラグを用意した場合

どちらの場合も、投稿済みであることを判定するための情報を埋め込んだ
ページ自体を一度閉じてしまっている為、そのユーザが投稿済みということを
判定できなくなってしまいます。

(環境変数REMOTE_ADDR(アクセスしているユーザのIPアドレス(先の書き込みのHTTP_REFERERは間違いです。すいません))
でそのユーザのIPアドレスを判定することで、ブラウザを開きなおした場合の再投稿を防ぐことは可能になりますが、
インターネット接続を一度切断した場合、次の接続時REMOTE_ADDRの値は多分変わってしまうので、
結局これもあまり意味がありません。)


>という具合に、「色々と組み合わせ」れば対応できる環境も増える、といった
>解釈は正しいのでしょうか?

間違いではありませんが、結局のところ

Cookieが使える
 =1週間の間再投稿を防ぐ、という仕組みが実現できる。

Cookieが使えない(JavaScriptの許可/不許可関わらず)
 =投稿元ページで投稿を行った時、そのページを表示している間
  再投稿を行おうとするのは防ぐことが出来る。
  しかし、ブラウザを開きなおす、インターネット接続を解除する、
  などした場合はもう再投稿を防ぐことはできない。

といったところだと思います。

長文ですいません。
その他の実現方法などありましたら、どなたかご回答していただければと・・


4:[完了] atusi [2002/07/15 14:35 ]

どうもありがとうございました。

とてもわかりやすく、この一晩で書籍のクッキーの項を
読み返しました。

本当に助かりました。
それでは失礼致します。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World