Changeset 15113


Ignore:
Timestamp:
2007/07/23 19:22:28 (17 years ago)
Author:
nanasess
Message:

トランザクションチェックの関数追加

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/feature-module-update/data/class/pages/LC_Page.php

    r15090 r15113  
    8585     * 指定の URL へリダイレクトする. 
    8686     * 
    87      * リダイレクト先 URL は自サイトである必要がある. 
     87     * リダイレクト先 URL に SITE_URL 及び SSL_URL を含むかチェックし, 
     88     * LC_Page::getToken() の値を URLパラメータで自動的に付与する. 
    8889     * 
    8990     * @param string $url リダイレクト先 URL 
    90      * @return void 
     91     * @return void|boolean $url に SITE_URL 及び, SSL_URL を含まない場合 false, 
     92     *                       正常に遷移可能な場合は, $url の URL へ遷移する. 
    9193     */ 
    9294    function sendRedirect($url) { 
    93         $_SESSION['previousURI'] = $_SESSION['currentURI']; 
    94         Location($url); 
     95 
     96        if (preg_match("/(" . preg_quote(SITE_URL, '/') 
     97                          . "|" . preg_quote(SSL_URL, '/') . ")/", $url)) { 
     98 
     99            header("Location: " . $url . "?" . TRANSACTION_ID_NAME . "=" . $this->getToken()); 
     100        } 
     101        return false; 
     102    } 
     103 
     104    // }}} 
     105    // {{{ protected functions 
     106 
     107    /** 
     108     * トランザクショントークンを生成し, 取得する. 
     109     * 
     110     * 悪意のある不正な画面遷移を防止するため, 予測困難な文字列を生成して返す. 
     111     * 同時に, この文字列をセッションに保存する. 
     112     * 
     113     * この関数を使用するためには, 生成した文字列を次画面へ渡すパラメータとして 
     114     * 出力する必要がある. 
     115     * 
     116     * 例) 
     117     * <input type="hidden" name="transactionid" value="この関数の返り値" /> 
     118     * 
     119     * 遷移先のページで, LC_Page::isValidToken() の返り値をチェックすることにより, 
     120     * 画面遷移の妥当性が確認できる. 
     121     * 
     122     * @return string トランザクショントークンの文字列 
     123     */ 
     124    function getToken() { 
     125        $token = $this->createToken(); 
     126        $_SESSION[TRANSACTION_ID_NAME] = $token; 
     127        return $token; 
     128    } 
     129 
     130    /** 
     131     * トランザクショントークンの妥当性をチェックする. 
     132     * 
     133     * 前画面で生成されたトランザクショントークンの妥当性をチェックする. 
     134     * この関数を使用するためには, 前画面のページクラスで LC_Page::getToken() 
     135     * を呼んでおく必要がある. 
     136     * 
     137     * @return boolean トランザクショントークンが有効な場合 true 
     138     */ 
     139    function isValidToken() { 
     140 
     141        $checkToken = ""; 
     142 
     143        // $_POST の値を優先する 
     144        if (isset($_POST[TRANSACTION_ID_NAME])) { 
     145 
     146            $checkToken = $_POST[TRANSACTION_ID_NAME]; 
     147        } elseif (isset($_GET[TRANSACTION_ID_NAME])) { 
     148 
     149            $checkToken = $_GET[TRANSACTION_ID_NAME]; 
     150        } 
     151 
     152        $ret = false; 
     153        // token の妥当性チェック 
     154        if ($checkToken === $_SESSION[TRANSACTION_ID_NAME]) { 
     155 
     156            $ret = true; 
     157        } 
     158 
     159        unset($_SESSION[TRANSACTION_ID_NAME]); 
     160 
     161        return $ret; 
     162    } 
     163 
     164    // }}} 
     165    // {{{ private functions 
     166 
     167    /** 
     168     * トランザクショントークン用の予測困難な文字列を生成して返す. 
     169     * 
     170     * @return string トランザクショントークン用の文字列 
     171     */ 
     172    function createToken() { 
     173        return sha1(uniqid(rand(), true)); 
    95174    } 
    96175} 
Note: See TracChangeset for help on using the changeset viewer.