[EC-CUBE] facebookに読み込むと「不正なページ移動です。」

土曜日 , 18, 2月 2012 1 Comment

明日2月17日は広島で第4回 LBIサロン+WebTouchMeetingの勉強会が開催されます。

 

私もEC-CUBEのセッションに登壇予定なのですが、対象聴講者を考えるとちょっとテクニカルになってしまう話題があったのでここで紹介。

 

facebookのページとしてEC-CUBEを読み込ませると、なぜか「正常に表示と、不正なページ移動エラーを交互に繰り返す」というもの。

 

(不正なページエラー)

 

不正なページ移動エラーって、

EC-CUBEだとフォームとかの遷移中にバックボタンで戻ったりを繰り返すとたまに出るあれだよね。

 

facebook内表示だとトップからいきなり出るから面白い!!

 

というわけで調査開始。

 

わかったこと、

LC_page.phpのdoValidToken()メソッド内でエラーになっている。

 

   function doValidToken($is_admin = false) {
        if ($_SERVER["REQUEST_METHOD"] == 'POST') {
            if (!SC_Helper_Session_Ex::isValidToken(false)) {
                if ($is_admin) {
                    SC_Utils_Ex::sfDispError(INVALID_MOVE_ERRORR);
                } else {
                    SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true);
                }
                exit;
            }
        }
    }

 

最初のif文の条件が「リクエストがPOSTなら」という判定。
どうやらfacebookのページとして読み込む場合POSTされる模様。
調べたら確かにそうだった。

POSTの場合にEC-CUBEはフォームの遷移と判断して、

その遷移が不正かどうかチェックするのだろうと推測。

 

つづいてisValidToken()の中身を追いかけてみる。
こいつがエラーになる原因に違いない。

 

    function isValidToken($is_unset = false) {
        $ret = $_REQUEST[TRANSACTION_ID_NAME] === $_SESSION[TRANSACTION_ID_NAME];

        if ($is_unset || $ret === false) {
            SC_Helper_Session_Ex::destroyToken();
        }
        return $ret;
    }
$_REQUEST[TRANSACTION_ID_NAME]はfacebookからのPOSTだから値はNULLに違いない。
確認したらやはりNULLだ。ということは$_SESSIONの値が悪さしている推測が成り立つ。

 

EC-CUBEのページ遷移は、乱数のIDをSESSIONとフォームのhiddenに持たせて、比較することで正常なページ遷移をチェックしているのを思い出しておく。
本来フォーム以外ではPOSTされることがないリクエストが今回facebookのせいでPOSTでリクエストされたために誤動作しているのかな。

 

だけど、トップページでなんでセッションID持つんだろ・・・?

 

読み進めると、LC_Page_FrontParts_Bloc_Login.phpに以下のコードを発見。

        //スマートフォン版ログアウト処理で不正なページ移動エラーを防ぐ為、トークンをセット
        $this->transactionid = SC_Helper_Session_Ex::getToken();

なるほど・・・スマフォ対策でIDを持たせてるわけだ・・・。

というわけで原因がわかってひと段落。

 

とりあえずの回避策として、
決め打ち回避として
    function isValidToken($is_unset = false) {
        // token の妥当性チェック
     
     // facebookで不正な移動になる場合の回避(暫定)
        if ($_SERVER ["SCRIPT_URL"] == "/ec_fb/user_data/facebook.php")
        {
            return true;
        }

        $ret = $_REQUEST[TRANSACTION_ID_NAME] === $_SESSION[TRANSACTION_ID_NAME];

        if ($is_unset || $ret === false) {
            SC_Helper_Session_Ex::destroyToken();
        }
        return $ret;
    }

こんな感じで回避できるけど、ちょっと綺麗じゃないかも。

参考にどうぞ程度で。

 


One thought on “ : [EC-CUBE] facebookに読み込むと「不正なページ移動です。」”
  • Please give us your valuable comment

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です