[PHP-users 2174] Re: ブラウザのキャッシュについて

Yasuo Ohgaki php-users@php.gr.jp
Wed, 19 Sep 2001 13:05:04 +0900


大垣です。

*SNIP*
> 私は自前のFormクラスで各フォーム毎にIDを割り当てDBに記録し、フォーム
が
> サブミットされる度にDBへ送信されたIDを利用して送信された情報のMD5
ハッ
> シュを記録して同じ情報の再送信を防いでいます。

書くのを忘れていました。Form IDは各フォーム(ページ)毎にユニークにす
る必要があります。

$id = md5(microtime());
や
$id = md5(uniqid());
等で割り当てています。

こうしないと、複数のブラウザを開いている場合や同じフォームを複数回開い
た場合に使えません。
DB等に保存された古いIDは適当にガーベッジコレクションする必用がありま
す。

>
> $md5 = get_md5_value_this_form_id($HTTP_POST_VARS['FID']));
> if ($md5 == $md5(serialize($HTTP_POST_VARS)) {
>   print('Data sent already. You are not supposed to submit the same
> data.');
> }
>
> のような感じです。コンカレンシーを考えて、DBに確認・登録する順序に注
意
> するか、トランザクションを利用する必要があります。そうしないと意味が
あ
> りません。
>
> ブラウザ(Cookie,HTTPキャッシュコントロール)に頼るより信頼性は高いで
> す。

ところで、セッションを使わない理由はForm IDは基本的に1度かぎりの使いき
りなのでセッションに保存するのは非効率と言う理由だけでセッションでも同
じように実装できます。

--
Ohgaki, Yasuo (大垣 靖男) 
Mail: yohgaki@dd.iij4u.or.jp