明日2月17日は広島で第4回 LBIサロン+WebTouchMeetingの勉強会が開催されます。
私もEC-CUBEのセッションに登壇予定なのですが、対象聴講者を考えるとちょっとテクニカルになってしまう話題があったのでここで紹介。
facebookのページとしてEC-CUBEを読み込ませると、なぜか「正常に表示と、不正なページ移動エラーを交互に繰り返す」というもの。
不正なページ移動エラーって、
EC-CUBEだとフォームとかの遷移中にバックボタンで戻ったりを繰り返すとたまに出るあれだよね。
facebook内表示だとトップからいきなり出るから面白い!!
というわけで調査開始。
わかったこと、
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; } } }
POSTの場合にEC-CUBEはフォームの遷移と判断して、
その遷移が不正かどうかチェックするのだろうと推測。
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; }
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; }
こんな感じで回避できるけど、ちょっと綺麗じゃないかも。
参考にどうぞ程度で。
[…] 繰り返す」 …coelacanth.heteml.jp/blog/?p=172 […]