/** * Page のアクション. * * @return void */ public function action() { $objCustomer = new SC_Customer_Ex(); // クッキー管理クラス $objCookie = new SC_Cookie_Ex(); // ログイン判定 if ($objCustomer->isLoginSuccess()) { $this->tpl_login = true; $this->tpl_user_point = $objCustomer->getValue('point'); $this->tpl_name1 = $objCustomer->getValue('name01'); $this->tpl_name2 = $objCustomer->getValue('name02'); } else { // クッキー判定 $this->tpl_login_email = $objCookie->getCookie('login_email'); if ($this->tpl_login_email != '') { $this->tpl_login_memory = '1'; } // POSTされてきたIDがある場合は優先する。 if (isset($_POST['login_email']) && $_POST['login_email'] != '') { $this->tpl_login_email = $_POST['login_email']; } } $this->tpl_disable_logout = $this->lfCheckDisableLogout(); //スマートフォン版ログアウト処理で不正なページ移動エラーを防ぐ為、トークンをセット $this->transactionid = SC_Helper_Session_Ex::getToken(); }
/** * isValidToken() のテストケース(エラー). * * 値が渡されてない場合 */ function testIsValidTokenNotParam() { $objSession = new SC_Helper_Session_Ex(); $token = $objSession->getToken(); // 値を渡さなければ false $this->assertEquals(false, $objSession->isValidToken()); }
/** * トランザクショントークンの妥当性をチェックする. * * 生成されたトランザクショントークンの妥当性をチェックする. * この関数を使用するためには, 前画面のページクラスで LC_Page::getToken() * を呼んでおく必要がある. * * トランザクショントークンは, SC_Helper_Session::getToken() が呼ばれた際に * 生成される. * 引数 $is_unset が false の場合は, トークンの妥当性検証が不正な場合か, * セッションが破棄されるまで, トークンを保持する. * 引数 $is_unset が true の場合は, 妥当性検証後に破棄される. * * @access protected * @param boolean $is_unset 妥当性検証後, トークンを unset する場合 true; * デフォルト値は false * @return boolean トランザクショントークンが有効な場合 true */ public function isValidToken($is_unset = false) { // token の妥当性チェック $ret = $_REQUEST[TRANSACTION_ID_NAME] === $_SESSION[TRANSACTION_ID_NAME]; if ($is_unset || $ret === false) { SC_Helper_Session_Ex::destroyToken(); } return $ret; }
* along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ if (!defined("DATA_REALDIR")) { define("DATA_REALDIR", HTML_REALDIR . HTML2DATA_DIR); } // PHP4互換用関数読み込み(PHP_Compat) require_once DATA_REALDIR . 'require_compat.php'; // アプリケーション初期化処理 require_once DATA_REALDIR . 'app_initial.php'; // 各種クラス読み込み require_once DATA_REALDIR . 'require_classes.php'; // インストール中で無い場合、 if (!SC_Utils_Ex::sfIsInstallFunction()) { // インストールチェック SC_Utils_Ex::sfInitInstall(); // セッションハンドラ開始 require_once CLASS_EX_REALDIR . 'helper_extends/SC_Helper_Session_Ex.php'; $objSession = new SC_Helper_Session_Ex(); // セッション初期化・開始 require_once CLASS_REALDIR . 'session/SC_SessionFactory.php'; $sessionFactory = SC_SessionFactory::getInstance(); $sessionFactory->initSession(); /* * 管理画面の場合は認証行う. * 認証処理忘れ防止のため, LC_Page_Admin::init() 等ではなく, ここでチェックする. */ $objSession->adminAuthorization(); // プラグインを読み込む //require_once DATA_REALDIR . 'require_plugin.php'; }
/** * アプリケーション内でリダイレクトする * * 内部で生成する URL の searchpart は、下記の順で上書きしていく。(後勝ち) * 1. 引数 $inheritQueryString が true の場合、$_SERVER['QUERY_STRING'] * 2. $location に含まれる searchpart * 3. 引数 $arrQueryString * @param string $location 「url-path」「現在のURLからのパス」「URL」のいずれか。「../」の解釈は行なわない。 * @param array $arrQueryString URL に付加する searchpart * @param bool $inheritQueryString 現在のリクエストの searchpart を継承するか * @param bool|null $useSsl true:HTTPSを強制, false:HTTPを強制, null:継承 * @return void * @static */ function sendRedirect($location, $arrQueryString = array(), $inheritQueryString = false, $useSsl = null) { // url-path → URL 変換 if ($location[0] === '/') { $netUrl = new Net_URL($location); $location = $netUrl->getUrl(); } // URL の場合 if (preg_match('/^https?:/', $location)) { $url = $location; if (is_bool($useSsl)) { if ($useSsl) { $pattern = '/^' . preg_quote(HTTP_URL, '/') . '(.*)/'; $replacement = HTTPS_URL . '\\1'; $url = preg_replace($pattern, $replacement, $url); } else { $pattern = '/^' . preg_quote(HTTPS_URL, '/') . '(.*)/'; $replacement = HTTP_URL . '\\1'; $url = preg_replace($pattern, $replacement, $url); } } } else { if (!is_bool($useSsl)) { $useSsl = SC_Utils_Ex::sfIsHTTPS(); } $netUrl = new Net_URL($useSsl ? HTTPS_URL : HTTP_URL); $netUrl->path = dirname($_SERVER['PHP_SELF']) . '/' . $location; $url = $netUrl->getUrl(); } $pattern = '/^(' . preg_quote(HTTP_URL, '/') . '|' . preg_quote(HTTPS_URL, '/') . ')/'; // アプリケーション外へのリダイレクトは扱わない if (preg_match($pattern, $url) === 0) { SC_Utils_Ex::sfDispException(); } $netUrl = new Net_URL($url); if ($inheritQueryString && !empty($_SERVER['QUERY_STRING'])) { $arrQueryStringBackup = $netUrl->querystring; // XXX メソッド名は add で始まるが、実際には置換を行う $netUrl->addRawQueryString($_SERVER['QUERY_STRING']); $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryStringBackup); } $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryString); $session = SC_SessionFactory::getInstance(); if (SC_MobileUserAgent_Ex::isMobile() || $session->useCookie() == false) { $netUrl->addQueryString(session_name(), session_id()); } $netUrl->addQueryString(TRANSACTION_ID_NAME, SC_Helper_Session_Ex::getToken()); $url = $netUrl->getURL(); header("Location: {$url}"); exit; }
/** * オペレーションの実行権限をチェックする * * @param string オペレーション名 * @param array リクエストパラメータ * @return boolean 権限がある場合 true; 無い場合 false */ protected function checkOperationAuth($operation_name, &$arrParam, &$arrApiConfig) { if (SC_Utils_Ex::isBlank($operation_name)) { return false; } $arrAuthTypes = explode('|', $arrApiConfig['auth_types']); $result = false; foreach ($arrAuthTypes as $auth_type) { $ret = false; switch ($auth_type) { case self::API_AUTH_TYPE_REFERER: $ret = SC_Api_Operation_Ex::checkReferer(); break; case self::API_AUTH_TYPE_SESSION_TOKEN: $ret = SC_Helper_Session_Ex::isValidToken(false); break; case self::API_AUTH_TYPE_API_SIGNATURE: $ret = SC_Api_Operation_Ex::checkApiSignature($operation_name, $arrParam, $arrApiConfig); break; case self::API_AUTH_TYPE_CUSTOMER: $ret = SC_Api_Operation_Ex::checkCustomerAccount($arrParam['login_email'], $arrParam['login_password']); break; case self::API_AUTH_TYPE_MEMBER: $ret = SC_Api_Operation_Ex::checkMemberAccount($arrParam['member_id'], $arrParam['member_password']); break; case self::API_AUTH_TYPE_CUSTOMER_LOGIN_SESSION: $objCustomer = new SC_Customer_Ex(); $ret = $objCustomer->isLoginSuccess(); break; case self::API_AUTH_TYPE_MEMBER_LOGIN_SESSION: $ret = SC_Utils_Ex::sfIsSuccess(new SC_Session_Ex(), false); break; case self::API_AUTH_TYPE_IP: $ret = SC_Api_Operation_Ex::checkIp($operation_name); break; case self::API_AUTH_TYPE_HOST: $ret = SC_Api_Operation_Ex::checkHost($operation_name); break; case self::API_AUTH_TYPE_SSL: $ret = SC_Utils_Ex::sfIsHTTPS(); break; case self::API_AUTH_TYPE_OPEN: $result = true; break 2; // foreachも抜ける // foreachも抜ける default: $ret = false; break; } if ($ret === true) { $result = true; } else { $result = false; break; // 1つでもfalseがあれば,その時点で終了 } } return $result; }
/** * パラメーターから有効なセッションIDを取得する。 * * @return string|false 取得した有効なセッションIDを返す。 * 取得できなかった場合は false を返す。 */ function getSessionId() { // パラメーターからセッションIDを取得する。 $sessionId = @$_POST[session_name()]; if (!isset($sessionId)) { $sessionId = @$_GET[session_name()]; // AU動画音声ファイルダウンロード対策 // キャリアがAUで、動画、音声ファイルをダウンロードする際に // SESSIONIDの後に余計なパラメータが付与され、セッションが無効になるケースがある if (SC_MobileUserAgent::getCarrier() == 'ezweb') { $idArray = split("\\?", $sessionId); $sessionId = $idArray[0]; } } if (!isset($sessionId)) { $sessionId = $this->getExtSessionId(); } if (!isset($sessionId)) { return false; } // セッションIDの存在をチェックする。 $objSession = new SC_Helper_Session_Ex(); if ($objSession->sfSessRead($sessionId) === null) { GC_Utils_Ex::gfPrintLog("Non-existent session id : sid={$sessionId}"); return false; } return session_id($sessionId); }
* * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ if (!defined('DATA_REALDIR')) { define('DATA_REALDIR', HTML_REALDIR . HTML2DATA_DIR); } // アプリケーション初期化処理 require_once DATA_REALDIR . 'app_initial.php'; // 定数 SAFE が設定されている場合、DBアクセスを回避する。主に、エラー画面を意図する。 if (!defined('SAFE') || !SAFE) { // インストール中で無い場合、 if (!GC_Utils_Ex::isInstallFunction()) { // インストールチェック SC_Utils_Ex::sfInitInstall(); // セッション初期化・開始 $sessionFactory = SC_SessionFactory_Ex::getInstance(); $sessionFactory->initSession(); /* * 管理画面の場合は認証行う. * 認証処理忘れ防止のため, LC_Page_Admin::init() 等ではなく, ここでチェックする. */ SC_Helper_Session_Ex::adminAuthorization(); } }
/** * 管理者ログイン処理 * * @param string $login_id ログインID文字列 * @return string $arrData メンバー情報(アクセス用トークンIDを含む) */ function lfDoLogin($login_id) { $objQuery =& SC_Query_Ex::getSingletonInstance(); //メンバー情報取得 $cols = 'member_id, authority, login_date, name'; $table = 'dtb_member'; $where = 'login_id = ?'; $arrData = $objQuery->getRow($cols, $table, $where, array($login_id)); // アクセス用トークンを取得 $arrData['token_id'] = SC_Helper_Session_Ex::createToken(); // ログイン情報記録 $this->lfSetLoginData($token_id, $arrData['member_id'], $login_id, $arrData['authority'], $arrData['login_date']); return $arrData; }
function logout() { unset($_SESSION['cert']); unset($_SESSION['login_id']); unset($_SESSION['authority']); unset($_SESSION['member_id']); unset($_SESSION['uniqid']); // トランザクショントークンを破棄 SC_Helper_Session_Ex::destroyToken(); // ログに記録する GC_Utils_Ex::gfPrintLog('logout : user='******' auth=' . $this->authority . ' sid=' . $this->sid); }
/** * トランザクショントークンを取得し, 設定する. * * @access protected * @return void */ function setTokenTo() { $this->transactionid = SC_Helper_Session_Ex::getToken(); }
/** * トランザクショントークンを取得する * * @return string */ function getRefusalToken() { if (empty($_SESSION['refusal_transactionid'])) { $_SESSION['refusal_transactionid'] = SC_Helper_Session_Ex::createToken(); } return $_SESSION['refusal_transactionid']; }
public function doAction($arrParam) { $this->doInitParam($arrParam); if ($this->isParamError()) { return false; } $objDb = new SC_Helper_DB_Ex(); $masterData = new SC_DB_MasterData_Ex(); // 対象データ switch ($arrParam['target']) { // カテゴリー case 'category': list($arrCatVal, $arrCatOut) = $objDb->sfGetLevelCatList(false); for ($i = 0; $i < count($arrCatVal); $i++) { $arrData[] = array('id' => $arrCatVal[$i], 'name' => $arrCatOut[$i], 'order' => $i, 'remarks1' => ''); } break; // 商品ステータス // 商品ステータス case 'status': $arrStatus = $masterData->getMasterData('mtb_status'); $i = 0; foreach ($arrStatus as $key => $val) { $arrData[] = array('id' => $key, 'name' => $val, 'order' => ++$i, 'remarks1' => ''); } break; // メーカー // メーカー case 'maker': $arrMaker = SC_Helper_DB_Ex::sfGetIDValueList('dtb_maker', 'maker_id', 'name'); $i = 0; foreach ($arrMaker as $key => $val) { $arrData[] = array('id' => $key, 'name' => $val, 'order' => ++$i, 'remarks1' => ''); } break; // 発送日目安 // 発送日目安 case 'deliv_date': $arrDelivDate = $masterData->getMasterData('mtb_delivery_date'); $i = 0; foreach ($arrDelivDate as $key => $val) { $arrData[] = array('id' => $key, 'name' => $val, 'order' => ++$i, 'remarks1' => ''); } break; // サイトパラメータ // サイトパラメータ case 'site_param': $arrComments = SC_Utils_Ex::getHash2Array($masterData->getDBMasterData('mtb_constants', array('id', 'remarks', 'rank'))); $i = 0; foreach ($masterData->getDBMasterData('mtb_constants') as $key => $val) { $arrData[] = array('id' => $key, 'name' => $val, 'order' => $i, 'remarks1' => $arrComments[$i++]); } break; // 規格 // 規格 case 'class': $arrClass = $this->getAllClass(); $i = 0; foreach ($arrClass as $key => $val) { $arrData[] = array('id' => $key, 'name' => $val, 'order' => ++$i, 'remarks1' => ''); } break; // 規格分類 // 規格分類 case 'classcategory': $arrClassCat = $this->lfGetClassCat($arrParam['class_id']); $i = 0; foreach ($arrClassCat as $key => $val) { $arrData[] = array('id' => $val['classcategory_id'], 'name' => $val['name'], 'order' => ++$i, 'remarks1' => ''); } break; // トランザクションID // トランザクションID case 'transaction': $arrData[] = array('transactionid' => SC_Helper_Session_Ex::getToken(), 'sessionid' => session_id()); break; default: break; } $this->setResponse('Item', $arrData); $this->setResponse('StatusCode', '0'); return true; }
/** * アプリケーション内でリダイレクトする * * 内部で生成する URL の searchpart は、下記の順で上書きしていく。(後勝ち) * 1. 引数 $inheritQueryString が true の場合、$_SERVER['QUERY_STRING'] * 2. $location に含まれる searchpart * 3. 引数 $arrQueryString * * @param string $location * 「url-path」「現在のURLからのパス」「URL」のいずれか。「../」の解釈は行なわない。 * @param array $arrQueryString * URL に付加する searchpart * @param bool $inheritQueryString * 現在のリクエストの searchpart を継承するか * @param bool|null $useSsl * true:HTTPSを強制, false:HTTPを強制, null:継承 * @return void * @static * */ public function sendRedirect($location, $arrQueryString = array(), $inheritQueryString = false, $useSsl = null) { // ローカルフックポイント処理 $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg); if (is_object($objPlugin)) { $arrBacktrace = debug_backtrace(); if (is_object($arrBacktrace[0]['object'])) { $pattern = '/^[a-zA-Z0-9_]+$/'; if (isset($_REQUEST['mode']) && preg_match($pattern, $_REQUEST['mode'])) { $mode = $_REQUEST['mode']; } $parent_class_name = get_parent_class($arrBacktrace[0]['object']); $class_name = get_class($arrBacktrace[0]['object']); } $objPlugin->doAction($parent_class_name . '_action_' . $mode, array($arrBacktrace[0]['object'])); if ($class_name != $parent_class_name) { $objPlugin->doAction($class_name . '_action_' . $mode, array($this)); } } // url-path → URL 変換 if ($location[0] === '/') { $netUrl = new Net_URL($location); $url = $netUrl->getUrl(); } elseif (strpos($location, HTTPS_URL) === 0 || strpos($location, HTTP_URL) === 0) { $url = $location; } else { $netUrl = new Net_URL(HTTP_URL); $netUrl->path = dirname($_SERVER['SCRIPT_NAME']) . '/' . $location; $url = $netUrl->getUrl(); } if (!is_bool($useSsl)) { $useSsl = SC_Utils_Ex::sfIsHTTPS(); } if ($useSsl) { $url = str_replace(HTTP_URL, HTTPS_URL, $url); } else { $url = str_replace(HTTPS_URL, HTTP_URL, $url); } // アプリケーション外へのリダイレクトは扱わない if (!SC_Utils_Ex::isAppInnerUrl($url)) { trigger_error('URL IS APP NOT INNER URL', E_USER_ERROR); } $netUrl = new Net_URL($url); if ($inheritQueryString && !empty($_SERVER['QUERY_STRING'])) { $arrQueryStringBackup = $netUrl->querystring; // XXX メソッド名は add で始まるが、実際には置換を行う $netUrl->addRawQueryString($_SERVER['QUERY_STRING']); $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryStringBackup); } $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryString); $session = SC_SessionFactory_Ex::getInstance(); if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE || $session->useCookie() == false) { $netUrl->addQueryString(session_name(), session_id()); } if (GC_Utils_Ex::isAdminFunction()) { // 管理画面またはmode指定時は付与 $netUrl->addQueryString(TRANSACTION_ID_NAME, SC_Helper_Session_Ex::getToken()); } $url = $netUrl->getURL(); header("Location: {$url}"); exit; }
/** * アプリケーション内でリダイレクトする * * 内部で生成する URL の searchpart は、下記の順で上書きしていく。(後勝ち) * 1. 引数 $inheritQueryString が true の場合、$_SERVER['QUERY_STRING'] * 2. $location に含まれる searchpart * 3. 引数 $arrQueryString * @param string $location 「url-path」「現在のURLからのパス」「URL」のいずれか。「../」の解釈は行なわない。 * @param array $arrQueryString URL に付加する searchpart * @param bool $inheritQueryString 現在のリクエストの searchpart を継承するか * @param bool|null $useSsl true:HTTPSを強制, false:HTTPを強制, null:継承 * @return void * @static */ function sendRedirect($location, $arrQueryString = array(), $inheritQueryString = false, $useSsl = null) { // ローカルフックポイント処理 $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg); $arrBacktrace = debug_backtrace(); if (is_object($arrBacktrace[0]['object']) && method_exists($arrBacktrace[0]['object'], 'getMode')) { $parent_class_name = get_parent_class($arrBacktrace[0]['object']); $objPlugin->doAction($parent_class_name . '_action_' . $arrBacktrace[0]['object']->getMode(), array($arrBacktrace[0]['object'])); $class_name = get_class($arrBacktrace[0]['object']); if ($class_name != $parent_class_name) { $objPlugin->doAction($class_name . '_action_' . $arrBacktrace[0]['object']->getMode(), array($this)); } } elseif (is_object($arrBacktrace[0]['object'])) { $pattern = '/^[a-zA-Z0-9_]+$/'; $mode = null; if (isset($_GET['mode']) && preg_match($pattern, $_GET['mode'])) { $mode = $_GET['mode']; } elseif (isset($_POST['mode']) && preg_match($pattern, $_POST['mode'])) { $mode = $_POST['mode']; } $parent_class_name = get_parent_class($arrBacktrace[0]['object']); $objPlugin->doAction($parent_class_name . '_action_' . $mode, array($arrBacktrace[0]['object'])); $class_name = get_class($arrBacktrace[0]['object']); if ($class_name != $parent_class_name) { $objPlugin->doAction($class_name . '_action_' . $mode, array($this)); } } // url-path → URL 変換 if ($location[0] === '/') { $netUrl = new Net_URL($location); $location = $netUrl->getUrl(); } // URL の場合 if (preg_match('/^https?:/', $location)) { $url = $location; if (is_bool($useSsl)) { if ($useSsl) { $pattern = '/^' . preg_quote(HTTP_URL, '/') . '(.*)/'; $replacement = HTTPS_URL . '\\1'; $url = preg_replace($pattern, $replacement, $url); } else { $pattern = '/^' . preg_quote(HTTPS_URL, '/') . '(.*)/'; $replacement = HTTP_URL . '\\1'; $url = preg_replace($pattern, $replacement, $url); } } } else { if (!is_bool($useSsl)) { $useSsl = SC_Utils_Ex::sfIsHTTPS(); } $netUrl = new Net_URL($useSsl ? HTTPS_URL : HTTP_URL); $netUrl->path = dirname($_SERVER['SCRIPT_NAME']) . '/' . $location; $url = $netUrl->getUrl(); } $pattern = '/^(' . preg_quote(HTTP_URL, '/') . '|' . preg_quote(HTTPS_URL, '/') . ')/'; // アプリケーション外へのリダイレクトは扱わない if (preg_match($pattern, $url) === 0) { trigger_error('', E_USER_ERROR); } $netUrl = new Net_URL($url); if ($inheritQueryString && !empty($_SERVER['QUERY_STRING'])) { $arrQueryStringBackup = $netUrl->querystring; // XXX メソッド名は add で始まるが、実際には置換を行う $netUrl->addRawQueryString($_SERVER['QUERY_STRING']); $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryStringBackup); } $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryString); $session = SC_SessionFactory_Ex::getInstance(); if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE || $session->useCookie() == false) { $netUrl->addQueryString(session_name(), session_id()); } $netUrl->addQueryString(TRANSACTION_ID_NAME, SC_Helper_Session_Ex::getToken()); $url = $netUrl->getURL(); header("Location: {$url}"); exit; }
/** * パラメーターから有効なセッションIDを取得する。 * * @return string|false 取得した有効なセッションIDを返す。 * 取得できなかった場合は false を返す。 */ function getSessionId() { // パラメーターからセッションIDを取得する。 $sessionId = @$_POST[session_name()]; if (!isset($sessionId)) { $sessionId = @$_GET[session_name()]; } if (!isset($sessionId)) { $sessionId = $this->getExtSessionId(); } if (!isset($sessionId)) { return false; } // セッションIDの存在をチェックする。 $objSession = new SC_Helper_Session_Ex(); if ($objSession->sfSessRead($sessionId) === null) { GC_Utils_Ex::gfPrintLog("Non-existent session id : sid={$sessionId}"); return false; } return session_id($sessionId); }
function EndSession() { // セッション情報破棄の前にcustomer_idを保存 $customer_id = $_SESSION['customer']['customer_id']; // $_SESSION['customer']の解放 unset($_SESSION['customer']); // セッションの配送情報を全て破棄する SC_Helper_Purchase_Ex::unsetAllShippingTemp(true); // トランザクショントークンの破棄 SC_Helper_Session_Ex::destroyToken(); $objSiteSess = new SC_SiteSession_Ex(); $objSiteSess->unsetUniqId(); // ログに記録する $log = sprintf("logout : user=%d\tip=%s", $customer_id, $this->getRemoteHost()); GC_Utils_Ex::gfPrintLog($log, CUSTOMER_LOG_REALFILE, false); }
function EndSession() { // $_SESSION['customer']の解放 unset($_SESSION['customer']); // トランザクショントークンの破棄 SC_Helper_Session_Ex::destroyToken(); $objSiteSess = new SC_SiteSession_Ex(); $objSiteSess->unsetUniqId(); // ログに記録する GC_Utils_Ex::gfPrintLog("logout : user="******"\t" . "ip=" . $this->getRemoteHost(), CUSTOMER_LOG_REALFILE); }