読者です 読者をやめる 読者になる 読者になる

EC-CUBEでハマル。GETの場合はOKでPOSTのときにセッションが切れてたらリダイレクトされるのか。


セキュリティ的に当たり前といえば当たり前だなぁ。。。

セッションはファクトリーパターンでcookieかリクエストパラメータかの分別をしているっぽい。

該当箇所 SC_SessionFactory_UseRequest.php はリクエストパラメータを使う場合。

<?php
class SC_SessionFactory_UseRequest extends SC_SessionFactory {
    /**
     * セッション初期処理を行う。
     *
     * @return void
     */
    function initSession() {
        // セッションIDの受け渡しにクッキーを使用しない。
        ini_set('session.use_cookies', '0');

        // パラメーターから有効なセッションIDを取得する。
        $sessionId = $this->getSessionId();

        if (!$sessionId) {
            session_start();
        }

        // セッションIDまたはセッションデータが無効な場合は、セッションIDを再生成
        // し、セッションデータを初期化する。
        if ($sessionId === false || !$this->validateSession()) {
            session_regenerate_id(true);
            // セッションデータの初期化
            $this->state->inisializeSessionData();

            // 新しいセッションIDを付加してリダイレクトする。
            if ($_SERVER['REQUEST_METHOD'] == 'GET') {
                // GET の場合は同じページにリダイレクトする。
                $objMobile = new SC_Helper_Mobile_Ex;
                header('Location: ' . $objMobile->gfAddSessionId());
            } else {
                // GET 以外の場合はトップページへリダイレクトする。
                header('Location: ' . URL_SITE_TOP . '?' . SID);
            }
            exit;
        }

        // 有効期限を更新する.
        $this->state->updateExpire();
    }


    /**
     * セッションデータが有効かどうかをチェックする。
     *
     * @return boolean セッションデータが有効な場合は true、無効な場合は false を返す。
     */
    function validateSession() {
        /**
         * PCサイトでは
         *  ・セッションデータが適切に設定されているか
         *  ・UserAgent
         *  ・IPアドレス
         *  ・有効期限
         * モバイルサイトでは
         *  ・セッションデータが適切に設定されているか
         *  ・機種名
         *  ・IPアドレス
         *  ・有効期限
         *  ・phone_id
         * がチェックされる
         */
        return $this->state->validateSessionData();
    }

ちなみにrequire_base.phpで呼ばれたりする。

<?php

// セッション初期化・開始
require_once CLASS_PATH . 'session/SC_SessionFactory.php';
$sessionFactory = SC_SessionFactory::getInstance();
$sessionFactory->initSession();