ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

類似システムを同時利用された場合の対処

類似のシステムを同時に利用された場合、以下の手順で現象が発生しました。

  1. 一方の入力画面で入力された値を、確認画面でセッション変数に格納する。
  2. もう一方のシステムの入力画面を表示する。
  3. もう一方のシステムの入力画面は、確認画面から戻ったときにセッション変数から値を表示するようになっているので、最初に入力した値が復元される。
  4. もう一方のシステムではそのまま問題なく、確認画面まで進む。

f:id:AJYA:20160118075824j:plain
photo credit: $videoname via photopin (license)

対処方法

入力画面を表示したときに、システム毎に異なる値を割り振るようにします。
確認画面で、その値が想定される値と異なっていたらエラーとするようにしました。

入力画面

session_start();

$_SESSION["uniquekey"] = "123";

確認画面

session_start();

if ($_SESSION["uniquekey"] == "" || ($_SESSION["uniquekey"] != "" && $_SESSION["uniquekey"] != "123")) {
    header("Content-type: text/html; charset=UTF-8");

    $_SESSION = array();

    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), "", time() - 42000, "/");
    }

    session_destroy();
    echo "invalid access. Please try to register again";
    exit();
}

確認画面のあとは、実際にデータをデータベースに登録する処理を行う画面があり、そこでもどうように処理を行います。
これで対処はできているはずです。