Skip to content

Commit

Permalink
トランザクションチェックの関数追加
Browse files Browse the repository at this point in the history
git-svn-id: http://svn.ec-cube.net/open/branches/feature-module-update@15113 1e3b908f-19a9-db11-a64c-001125224ba8
  • Loading branch information
nanasess committed Jul 23, 2007
1 parent c2753fa commit 3a7af72
Showing 1 changed file with 83 additions and 4 deletions.
87 changes: 83 additions & 4 deletions data/class/pages/LC_Page.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,93 @@ function checkPreviousURI() {
/**
* 指定の URL へリダイレクトする.
*
* リダイレクト先 URL は自サイトである必要がある.
* リダイレクト先 URL に SITE_URL 及び SSL_URL を含むかチェックし,
* LC_Page::getToken() の値を URLパラメータで自動的に付与する.
*
* @param string $url リダイレクト先 URL
* @return void
* @return void|boolean $url に SITE_URL 及び, SSL_URL を含まない場合 false,
* 正常に遷移可能な場合は, $url の URL へ遷移する.
*/
function sendRedirect($url) {
$_SESSION['previousURI'] = $_SESSION['currentURI'];
Location($url);

if (preg_match("/(" . preg_quote(SITE_URL, '/')
. "|" . preg_quote(SSL_URL, '/') . ")/", $url)) {

header("Location: " . $url . "?" . TRANSACTION_ID_NAME . "=" . $this->getToken());
}
return false;
}

// }}}
// {{{ protected functions

/**
* トランザクショントークンを生成し, 取得する.
*
* 悪意のある不正な画面遷移を防止するため, 予測困難な文字列を生成して返す.
* 同時に, この文字列をセッションに保存する.
*
* この関数を使用するためには, 生成した文字列を次画面へ渡すパラメータとして
* 出力する必要がある.
*
* 例)
* <input type="hidden" name="transactionid" value="この関数の返り値" />
*
* 遷移先のページで, LC_Page::isValidToken() の返り値をチェックすることにより,
* 画面遷移の妥当性が確認できる.
*
* @return string トランザクショントークンの文字列
*/
function getToken() {
$token = $this->createToken();
$_SESSION[TRANSACTION_ID_NAME] = $token;
return $token;
}

/**
* トランザクショントークンの妥当性をチェックする.
*
* 前画面で生成されたトランザクショントークンの妥当性をチェックする.
* この関数を使用するためには, 前画面のページクラスで LC_Page::getToken()
* を呼んでおく必要がある.
*
* @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;
}

// }}}
// {{{ private functions

/**
* トランザクショントークン用の予測困難な文字列を生成して返す.
*
* @return string トランザクショントークン用の文字列
*/
function createToken() {
return sha1(uniqid(rand(), true));
}
}
?>

0 comments on commit 3a7af72

Please sign in to comment.