リロード対策

Webアプリケーションで、時間のかかる処理や、会員登録のフォームなどで良くあるのは、 submitボタンを複数押してしまい、同じデータが複数登録できてしまうことです。

これを防ぐ案として以下の対策を行ないます。

  • フォームごとにIDを振る (もしくは、フォーム作成ごと)
  • フォームがサブミットされる度にDBへ送信されたIDを利用して送信された情報のMD5ハッシュを記録

CREATE文

 CREATE TABLE submit_lock (
      id          INT4, -- フォームID
      digest      TEXT, -- 投稿内容のmd5
      submit_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- クリーニング用のタイムスタンプ
 
      PRIMARY KEY (id, digest)
 );

PHPでは、

<?php
 $md5 = get_md5_value_this_form_id($_POST['FID'])); # DB よりmd5の値を取得
 if ($md5 == md5(serialize($_POST)) {
   print('Data sent already. You are not supposed to submit the samedata.');
   exit;
 }
 set_md5_value_to_database($_POST['FID'], serialize($_POST));
 .....

という感じですね。(ソースコードは非常にいいかげん)