/** * Page を初期化する. * * @return void */ function init() { $this->template = MAIN_FRAME; //IP制限チェック $allow_hosts = unserialize(ADMIN_ALLOW_HOSTS); if (is_array($allow_hosts) && count($allow_hosts) > 0) { if (array_search($_SERVER["REMOTE_ADDR"], $allow_hosts) === FALSE) { SC_Utils_Ex::sfDispError(AUTH_ERROR); } } //SSL制限チェック if (ADMIN_FORCE_SSL == TRUE) { if (SC_Utils_Ex::sfIsHTTPS() === false) { SC_Response_Ex::sendRedirect($_SERVER["REQUEST_URI"], $_GET, FALSE, TRUE); } } $this->tpl_authority = $_SESSION['authority']; // ディスプレイクラス生成 $this->objDisplay = new SC_Display_Ex(); // プラグインクラス生成 $this->objPlagin = new SC_Helper_Plugin_Ex(); $this->objPlagin->preProcess($this); // トランザクショントークンの検証と生成 $this->doValidToken(true); $this->setTokenTo(); }
/** * Page を初期化する. * * @return void */ function init() { $this->template = MAIN_FRAME; //IP制限チェック $allow_hosts = unserialize(ADMIN_ALLOW_HOSTS); if (is_array($allow_hosts) && count($allow_hosts) > 0) { if (array_search($_SERVER['REMOTE_ADDR'], $allow_hosts) === FALSE) { SC_Utils_Ex::sfDispError(AUTH_ERROR); } } //SSL制限チェック if (ADMIN_FORCE_SSL == TRUE) { if (SC_Utils_Ex::sfIsHTTPS() === false) { SC_Response_Ex::sendRedirect($_SERVER['REQUEST_URI'], $_GET, FALSE, TRUE); } } $this->tpl_authority = $_SESSION['authority']; // ディスプレイクラス生成 $this->objDisplay = new SC_Display_Ex(); // スーパーフックポイントを実行. $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg); $objPlugin->doAction('LC_Page_preProcess', array($this)); // トランザクショントークンの検証と生成 $this->doValidToken(true); $this->setTokenTo(); // ローカルフックポイントを実行 $parent_class_name = get_parent_class($this); $objPlugin->doAction($parent_class_name . '_action_before', array($this)); $class_name = get_class($this); if ($class_name != $parent_class_name) { $objPlugin->doAction($class_name . '_action_before', array($this)); } }
/** * * {@inheritDoc} * * @see LC_Page::process() */ function process() { if (ADMIN_FORCE_SSL && SC_Utils_Ex::sfIsHTTPS() === false) { SC_Response_Ex::reloadSSL(); SC_Response_Ex::actionExit(); } GC_Utils_Ex::gfPrintLog(print_r($_SESSION, true), DEBUG_LOG_REALFILE); GC_Utils_Ex::gfPrintLog(print_r($_COOKIE, true), DEBUG_LOG_REALFILE); GC_Utils_Ex::gfPrintLog(print_r($_SERVER, true), DEBUG_LOG_REALFILE); GC_Utils_Ex::gfPrintLog(print_r($_ENV, true), DEBUG_LOG_REALFILE); parent::process(); $this->action(); $this->sendResponse(); }
function sfIsSuccess($objSess, $disp_error = true) { $ret = $objSess->IsSuccess(); if ($ret != SUCCESS) { if ($disp_error) { // エラーページの表示 SC_Utils_Ex::sfDispError($ret); } return false; } // リファラーチェック(CSRFの暫定的な対策) // 「リファラ無」 の場合はスルー // 「リファラ有」 かつ 「管理画面からの遷移でない」 場合にエラー画面を表示する if (empty($_SERVER['HTTP_REFERER'])) { // TODO 警告表示させる? // sfErrorHeader('>> referrerが無効になっています。'); } else { $domain = SC_Utils_Ex::sfIsHTTPS() ? HTTPS_URL : HTTP_URL; $pattern = sprintf('|^%s.*|', $domain); $referer = $_SERVER['HTTP_REFERER']; // 管理画面から以外の遷移の場合はエラー画面を表示 if (!preg_match($pattern, $referer)) { if ($disp_error) { SC_Utils_Ex::sfDispError(INVALID_MOVE_ERRORR); } return false; } } 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 */ 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; }
* as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * 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. */ $require_php_dir = realpath(dirname(__FILE__)); require_once $require_php_dir . "/define.php"; require_once $require_php_dir . HTML2DATA_DIR . "require_base.php"; // 携帯端末の場合は mobile 以下へリダイレクトする。 if (SC_MobileUserAgent::isMobile()) { $url = ""; if (SC_Utils_Ex::sfIsHTTPS()) { $url = MOBILE_SSL_URL; } else { $url = MOBILE_SITE_URL; } if (preg_match('|^' . URL_DIR . '(.*)$|', $_SERVER['REQUEST_URI'], $matches)) { $path = $matches[1]; } else { $path = ''; } header("Location: " . SC_Utils_Ex::sfRmDupSlash($url . $path)); 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) { // 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; }
/** * $path から URL を取得する. * * 以下の順序で 引数 $path から URL を取得する. * 1. realpath($path) で $path の 絶対パスを取得 * 2. $_SERVER['DOCUMENT_ROOT'] と一致する文字列を削除 * 3. $useSSL の値に応じて, SITE_URL 又は, SSL_URL を付与する. * * 返り値に, QUERY_STRING を含めたい場合は, key => value 形式 * の配列を $param へ渡す. * * @access protected * @param string $path 結果を取得するためのパス * @param array $param URL に付与するパラメータの配列 * @param mixed $useSSL 結果に SSL_URL を使用する場合 true, * SITE_URL を使用する場合 false, * デフォルト "escape" 現在のスキーマを使用 * @return string $path の存在する http(s):// から始まる絶対パス * @see Net_URL */ function getLocation($path, $param = array(), $useSSL = "escape") { $rootPath = $this->getRootPath($path); // スキーマを定義 if ($useSSL === true) { $url = SSL_URL . $rootPath; } elseif ($useSSL === false) { $url = SITE_URL . $rootPath; } elseif ($useSSL == "escape") { if (SC_Utils_Ex::sfIsHTTPS()) { $url = SSL_URL . $rootPath; } else { $url = SITE_URL . $rootPath; } } else { die("[BUG] Illegal Parametor of \$useSSL "); } $netURL = new Net_URL($url); // QUERY_STRING 生成 foreach ($param as $key => $val) { $netURL->addQueryString($key, $val); } return $netURL->getURL(); }
/** * 現在の URL を取得する * * @return string 現在のURL */ function sfGetUrl() { $url = ''; if (SC_Utils_Ex::sfIsHTTPS()) { $url = "https://"; } else { $url = "http://"; } $url .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '?' . $_SERVER['QUERY_STRING']; return $url; }
function send_err_mail($result, $sql) { $url = ''; $errmsg = ''; if (SC_Utils_Ex::sfIsHTTPS()) { $url = "https://"; } else { $url = "http://"; } $url .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $errmsg = $url . "\n\n"; $errmsg .= "SERVER_ADDR:" . $_SERVER['SERVER_ADDR'] . "\n"; $errmsg .= "REMOTE_ADDR:" . $_SERVER['REMOTE_ADDR'] . "\n"; $errmsg .= "USER_AGENT:" . $_SERVER['HTTP_USER_AGENT'] . "\n\n"; $errmsg .= $sql . "\n"; $errmsg .= $result->message . "\n\n"; $errmsg .= $result->userinfo . "\n\n"; $arrRbacktrace = array_reverse($result->backtrace); foreach ($arrRbacktrace as $backtrace) { if ($backtrace['class'] != "") { $func = $backtrace['class'] . "->" . $backtrace['function']; } else { $func = $backtrace['function']; } $errmsg .= $backtrace['file'] . " " . $backtrace['line'] . ":" . $func . "\n"; } require_once CLASS_EX_PATH . "page_extends/error/LC_Page_Error_SystemError_Ex.php"; $objPage = new LC_Page_Error_SystemError_Ex(); register_shutdown_function(array($objPage, "destroy")); $objPage->init(); $objPage->process(); if (DEBUG_MODE == true) { print '<pre>'; print_r(htmlspecialchars($errmsg, ENT_QUOTES, CHAR_CODE)); print '</pre>'; } GC_Utils_Ex::gfPrintLog($errmsg); exit; }
/** * ホスト名を正規化する * * @return void */ public function normalizeHostname() { if (!USE_NORMALIZE_HOSTNAME || !isset($_SERVER['REQUEST_URI']) || $_SERVER['REQUEST_METHOD'] === 'POST') { // 処理せず戻る return; } $netUrlRequest = new Net_URL($_SERVER['REQUEST_URI']); // 要求を受けたホスト名 $request_hostname = $netUrlRequest->host; $netUrlCorrect = new Net_URL(SC_Utils_Ex::sfIsHTTPS() ? HTTPS_URL : HTTP_URL); // 設定上のホスト名 $correct_hostname = $netUrlCorrect->host; // ホスト名が不一致の場合 if ($request_hostname !== $correct_hostname) { // ホスト名を書き換え $netUrlRequest->host = $correct_hostname; // 正しい URL $correct_url = $netUrlRequest->getUrl(); // 警告 $msg = 'ホスト名不一致を検出。リダイレクト実行。'; $msg .= '要求値=' . var_export($request_hostname, true) . ' '; $msg .= '設定値=' . var_export($correct_hostname, true) . ' '; $msg .= 'リダイレクト先=' . var_export($correct_url, true) . ' '; trigger_error($msg, E_USER_WARNING); // リダイレクト(恒久的) SC_Response_Ex::sendHttpStatus(301); SC_Response_Ex::sendRedirect($correct_url); } }
/** * アプリケーション内でリダイレクトする * * 内部で生成する 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; }