中学受験専門 理科総合研究所 −理総研−

フロントページへ
Name:
Pass:
RSS
: ユーザー登録はコチラ :
左 理総研:技術情報と開発メモ 右

006:ページをリロード禁止/再読み込み禁止にする

対象言語:PHP / Cookie
キーワード:PHP 5.0 session cookie リロード 再読込 させない 禁止 制限 不可能 対策
Ajaxを導入していない状況で、フォームで入力されたデータをページ遷移(移動)で反映させるとき、多くの場合は遷移後のページでデータ処理→表示という流れになります。 理総研においても「A'n'kingで問題を解く」→(ページ移動)→「マッチレポート画面で成績集計・データベース登録・発表」という王道パターンを利用しています。
このとき遷移後のページをユーザーがリロードすると、成績処理が再び実行されてしまい成績の正当性が保証されません。遷移後のページのみデータをキャッシュしないという逃げ道はありそうでいて、理総研では何らかの事情(もう忘れた)でその逃げ道が絶たれた記憶があり、 他の方法を模索しているときにセッションクッキーの短期発行という方法に思い至りました。
クッキーを発行できるツールであれば、それがPHPでなくともPerlやJavaScript等でもこのリロード対策が可能です。 もちろんこれはユーザー側のクッキーの受け入れ態勢が整っていないと功を奏しませんが、理総研はそもそもユーザー登録制でセッションによる認証をベースに置いているので問題とはなりません。そこでここでは、セッションクッキーを使ったリロード対策について解説していきます。
  • 遷移前のページ
    まずPHPで、リロード対策用のセッションデータ(文字列'taisaku')を格納し、そのデータを変数($reload_off)にも格納します。
    そしてフォームで、この変数のデータを他のデータと共に次のページへ送ります。
	<?php
	session_start();
	
	$_SESSION['user']['reload'] = "taisaku";
	$reload_off = $_SESSION['user']['reload'];
	
	print <<<EOF
	
	<input type="hidden" name="reload" value="$reload_off" />
	
	EOF;
	?>
  • 遷移後のページ
    フォームで送られてきた$_POST['reload']には、文字列'taisaku'が格納されています。その情報がセッションデータ($_SESSION['user']['reload'])と一致するかチェックします。 このときデータが一致すればセッションデータを空にする、という処理を施せば、リロードしてもすでにセッションデータは空!つまりフォームのデータと比較しても一致するわけ無い、という事になります。

	<?php
	session_start();
	
	if ($_SESSION['user']['reload'] === $_POST['reload']) {

		//一致するならセッションデータを消す。
		$_SESSION['user']['reload'] = "";
		
		//(一致したときの処理...)
	
	} else {
	
		//(リロードされたとき、一致しないときの処理...)
	
		header("Location: http://www.kantei.go.jp/");
		//リロードされたから首相官邸(例)のページへ

		exit;
	
	}
	?>

  • この手法は同時に、セッションデータを格納する遷移前ページを限定する事でリファラー制限も可能です。特定のページ以外からの遷移は受け付けない、とか。
著者 You Mizuguchi
© 2011 System-iDO IT Devisers