addRawQueryString($_SERVER['QUERY_STRING']); } $netURL->addQueryString(TRANSACTION_ID_NAME, $this->getToken()); header("Location: " . $netURL->getURL()); } return false; } // }}} // {{{ protected functions /** * トランザクショントークンを生成し, 取得する. * * 悪意のある不正な画面遷移を防止するため, 予測困難な文字列を生成して返す. * 同時に, この文字列をセッションに保存する. * * この関数を使用するためには, 生成した文字列を次画面へ渡すパラメータとして * 出力する必要がある. * * 例) * * * 遷移先のページで, LC_Page::isValidToken() の返り値をチェックすることにより, * 画面遷移の妥当性が確認できる. * * @access protected * @return string トランザクショントークンの文字列 */ function getToken() { if (empty($_SESSION[TRANSACTION_ID_NAME])) { $_SESSION[TRANSACTION_ID_NAME] = $this->createToken(); } return $_SESSION[TRANSACTION_ID_NAME]; } /** * トランザクショントークンの妥当性をチェックする. * * 前画面で生成されたトランザクショントークンの妥当性をチェックする. * この関数を使用するためには, 前画面のページクラスで LC_Page::getToken() * を呼んでおく必要がある. * * @access protected * @return boolean トランザクショントークンが有効な場合 true */ function isValidToken() { $checkToken = ""; // $_POST の値を優先する if (isset($_POST[TRANSACTION_ID_NAME])) { $checkToken = $_POST[TRANSACTION_ID_NAME]; } elseif (isset($_GET[TRANSACTION_ID_NAME])) { $checkToken = $_GET[TRANSACTION_ID_NAME]; } $ret = false; // token の妥当性チェック if ($checkToken === $_SESSION[TRANSACTION_ID_NAME]) { $ret = true; } unset($_SESSION[TRANSACTION_ID_NAME]); return $ret; } /** * $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" 現在のスキーマを使用 * @param string $documentRoot DocumentRoot の文字列. 指定しない場合は, * $_SERVER['DOCUMENT_ROOT'] が付与される. * @return string $path の存在する http(s):// から始まる絶対パス * @see Net_URL */ function getLocation($path, $param = array(), $useSSL = "escape", $documentRoot = "") { // TODO $_SERVER['DOCUMENT_ROOT'] をインストーラでチェックする. if (empty($documentRoot)) { $documentRoot = $_SERVER['DOCUMENT_ROOT']; if (empty($documentRoot)) { die("[BUG] can't get DOCUMENT_ROOT"); } } // $path が / で始まっている場合 if (substr($path, 0, 1) == "/") { $realPath = realpath(HTML_PATH . substr_replace($path, "", 0, 1)); } else { // 相対パスの場合 $realPath = realpath($path); } // DocumentRoot を削除した文字列を取得. $root = str_replace($documentRoot, "", $realPath); // 先頭の / を削除 $root = substr_replace($root, "", 0, 1); // スキーマを定義 if ($useSSL === true) { $url = SSL_URL . $root; } elseif ($useSSL === false){ $url = SITE_URL . $root; } elseif ($useSSL == "escape") { if (SC_Utils_Ex::sfIsHTTPS()) { $url = SSL_URL . $root; } else { $url = SITE_URL . $root; } } 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(); } /** * ページをリロードする. * * 引数 $queryString に, $_SERVER['QUERY_STRING'] の値を使用してはならない. * この関数は, 内部で LC_Page::sendRedirect() を使用するため, * $_SERVER['QUERY_STRING'] の値は自動的に付与される. * * @param array $queryString QueryString の配列 * @return void * @see Net_URL */ function reload($queryString = array()) { // 現在の URL を取得 $netURL = new Net_URL(); // QueryString を付与 if (!empty($queryString)) { foreach ($queryString as $key => $val) { $netURL->addQueryString($key, $val); } } $this->sendRedirect($netURL->getURL()); } /** * クライアントのキャッシュを許可する. * * session_start時のno-cacheヘッダーを抑制することで * 「戻る」ボタン使用時の有効期限切れ表示を抑制する. * * @access protected * @return void */ function allowClientCache() { session_cache_limiter('private-no-expire'); } // }}} // {{{ private functions /** * トランザクショントークン用の予測困難な文字列を生成して返す. * * @access private * @return string トランザクショントークン用の文字列 */ function createToken() { return sha1(uniqid(rand(), true)); } } ?>