リロード等による二重投稿防止平成30年 11月 15日 作成

00606

概略

お問い合わせやコメント投稿フォームの利用において、リロード(更新)や前画面へ戻って再送信と言ったユーザーアクションが考えられ、二重投稿が懸念される。

故意的な操作は勿論の事、ユーザーの間違った操作においても二重投稿がされない様な工夫が必要だと感じる。

よって、二重投稿を防止するスクリプトの習得を目的とする。

手段

「セッションを用いた対策」と「.header関数を用いた対策」の2通りの手段が考えられる。

実装方法

二重投稿が起こる理由

リロード(更新)を行うと、直前の動作を再実行する為、直前データ投稿等を行っていれば、再度送信され二重投稿となってしまう。

対策

1).セッションを用いた対策

ユニークな値を生成、それをセッションに保存すると同時にPOST(GET)送信データの値とし、両方の値をチェックして整合性を確認する方法。(クロスサイトリクエストフォージェリ(CSRF)の対策に用いられる手法と同じ要領。)


2).header関数を用いた対策

POSTで送られたデータを処理した後header関数を用いてリダイレクトする方法。これは、header関数を用いてリダイレクトするとGETの実行となり、たとえリロードしても最後に実行されたのがGETになっている。

サーバー変数:$_SERVER['REQUEST_METHOD']にて”POST判定”しておけば二重投稿が起こらない仕組み。


上記内容を踏まえ、下記にサンプルコードを記述。


対策「1」に関して

遷移前ページ

<?php
	// ユニークな値
	$token = "N6pbqzRd";
	
	session_start();
	$_SESSION['token'] = $token;
?>

<form method="POST">
	<input type="hidden" name="token" value="<?php echo $token ?>" />
	<input type="submit" value="送信" />
</form>

遷移後ページ

<?php
	session_start();
	
	// セッションとPOSTデータがセットされているか否かとセッションとPOSTデータが一致するか否かの確認
	if(isset($_SESSION['token']) && isset($_POST['token']) && $_SESSION['token'] === $_POST['token']){
		
		一致した時の処理
		
		// セッションに保持されているキーを削除する
		unset($_SESSION['token']);
	}else{
		
		一致しない(リロードされた)時の処理
		
		// 例:フォーム画面へ強制的に戻す
		header("HTTP/1.1 301 Moved Permanently");
		header('location: フォーム画面へのURL等');
		exit();
		
		// 例:エラーメッセージ表示
		echo 'リロードは禁止されています';
	}
?>

対策「2」に関して

遷移前ページ

<form method="POST">
	<input type="text" name="name" />
	<input type="submit" value="送信" />
</form>

遷移後ページ

<?php
	// 文字化け対策
	header('Content-Type: text/html; charset=utf-8');
	
	if($_SERVER['REQUEST_METHOD'] === 'POST'){
		
		// ここに登録等の処理を記載する
		
		// 処理後に自分自身にリダイレクトする
		header("HTTP/1.1 301 Moved Permanently");
		header('location: 自分自身のパス');
		exit();
	}else{
		// リロードしても「GET」の為 下記が表示される
		echo '送信完了しました';
	}
?>

考察

対策「2」の方がソースコードも短くて良さそうだが、戻るボタンで前ページへ戻った後同データを再送信出来てしまうのが難点。

上記には記載していないがリファラー対策もあるみたいなので、臨機応変に対策案を使い分けていければと思った次第です。

最後までお読み下さり ありがとうございました。記事はここ迄です。

尚、本記事は作成から「5年以上」経過しています。

記事作成当時と現在の状況等により内容が適切でない場合があります。また、リンク切れが生じている場合もあります事を予めご了承下さい。

お気に入りに登録しますとお気に入り記事を一元管理でき、再度閲覧したい場合等 容易に記事を探し出す事ができますのでご活用下さい。

下段にはコメントを掲載しております。

広告バナー

コメント

頂いたコメントを下記に掲載しております。更に下部にはコメント投稿フォームを設けております。

注意事項を確認・了承した上、コメント投稿お願いいたします。

注意事項に該当するコメントにつきましては、事前告知なしに投稿したコメントの削除を行う場合があります。

予めご了承下さい。

  • 記事内容と無関係なコメント
  • 公序良俗に反するコメント
  • 個人情報や法令違反を含むコメント
  • その他、管理者が不適切と判断したコメント

現在 頂いているコメントはありません

返信先(コメント管理番号)コメントに対し返信する場合のみ
お名前・ハンドルネーム2~32文字内で入力下さい
メールアドレス公開される事はありません
電話番号半角数字+ハイフンで入力下さい
コメント全角500文字内で入力下さい