
残念ながら私は毎日業務でプログラムを書いているわけではないので、色々やっているうちに忘れてしまう危険があります・・・!!そんなわけで、プログラム系もぼちぼち記事にしていこうと思います。
A(手続き)ページ → B(処理完了)ページという想定した正規のフローで進んで欲しいWEBページがあります。
ブラウザからBページのURLを叩けば当然アクセス出来ます。何も特別なことを行っていないのですから。しかし、通常の一般ユーザの想定している振る舞いからはありえないことです。そんなわけで、今回は不正遷移としてエラーを出すチップスの御紹介です。
セッションで対策を行います。
Aページ 手続きページ
<?php session_start(); $_SESSION['kerberos_flg'] = 1; // 不正遷移判定用フラグ ?>
セッションとPostデータの有無で判定
- Aページに$_SESSION[‘kerberos_flag’]に1を入れておき、Bページに移動した時にその値を持っているか。
- Postデータを持っているか。
2点の判定で通常のページ遷移かどうかを判定します。
Bページ 処理完了ページ
<?php session_start(); ?>
<?php get_header(); ?>
<?php
//=======================================================================================
// 不正遷移チェック
//=======================================================================================
//* 直接のページのアクセスを禁止する。 正しいセッションフラグを持っていない、フォームデータemailを持っていない場合
//* else処理: セッションフラグを持っていた場合は、ここでセッションを破棄する。
if(!isset($_SESSION['kerberos_flg']) && $_SESSION['kerberos_flg'] !== 1 || !isset($_POST['email']) ){
echo '
<div align="center">
<h1>不正遷移です。</h1>
<p style="color : red;">
このページの直接アクセスは禁止されています。
</p>
<p>誠にご面倒をおかけしますが、お問い合わせフォームから入力をお願い致します</p>
<p><strong>Cookieを無効化している場合は、有効化を行って下さい。</strong></p>
<p>
<ul style=" list-style-type: none;">
<li><a href="https://support.google.com/chrome/answer/95647?co=GENIE.Platform%3DDesktop&hl=ja" target="_blank">Google ChromeのCookieの有効化方法</a></li>
<li><a href="https://support.mozilla.org/ja/kb/enable-and-disable-cookies-website-preferences" target="_blank">FirefoxのCookieの有効化方法</a></li>
<li><a href="https://support.microsoft.com/ja-jp/help/17442/windows-internet-explorer-delete-manage-cookies" target="_blank">IE, EdgeのCookieの有効化方法</a></li>
</ul>
<a href="/info/お問い合わせフォーム/"><strong>『お問い合わせページ』はこちら</strong></a>
</p>
</div><!--div center-->
';
exit();
}
else{
$_SESSION = array(); // セッション変数解除
// Cookie削除
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
// セッション破壊
session_destroy();
}
// 不正遷移チェック ここまで ============================================================
?>
ここで判定していますよ!
if(!isset($_SESSION['kerberos_flg']) && $_SESSION['kerberos_flg'] !== 1 || !isset($_POST['email']) ){
{
//例外処理 エラーメッセージを出力し、処理を止める。
}
else {
//正しい処理
}
$_SESSION[‘kerberos_flag’]にきちんとフラグデータがあるか、必須項目データの1つemailのPostがなければそこでエラーメッセージを表示させて、exit()で処理を完全に止めます。これでBページの直接アクセスした場合の対策が出来ました。
Aページからのフラグを持っている通常フローを行っているユーザに対しては、セッションとCookieを削除して通常の表示に進みます。
この仕様の問題点

Cookieを有効化していないブラウザではアクセス出来なくなることです。通常のデフォルトでは有効になっているはずなので、問題にはなりませんが、無効化しているユーザも全くいないわけでもないので、有効化にする方法のアナウンスが必要です。
*画像はChromeブラウザ

不正遷移エラーページでCookieの有効化をアナウンスを行っています。
お疲れ様です。
