kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

TOOL更新_63.クロスサイトリクエストフォージェリ・・・トークンチェックを行う。

TOOL更新_63.クロスサイトリクエストフォージェリ対策として、DB追加、更新、削除の画面でトークンチェックを行う。の調査。これをPHP自動作成◎自動生成お助けTOOLのDB追加、更新、削除のボタンに反映する予定。今日は調査のみ。

■config.php 修正
!!!これはCONFIGに持つまでもないという理由でボツにした。7月22日に作り変えた!!!

<<追加>>
// トークンチェックフラグ
define('TOKEN_CHECK_ADMIN_FLG', true);
define('TOKEN_CHECK_USER_FLG', true);
// トークンチェック対象モード
define('TOKEN_CHECK_MODE', 'ins_do,upd_do,del_do');
// 最終トークン保持時間(分)戻るボタンでも戻ってもこの時間内ならOK
// 管理者側は登録ボタン押下後、戻るボタンで戻って違う内容で登録することができるようになる。
define('TOKEN_OK_ADMIN_TIME', 180);  
define('TOKEN_OK_USER_TIME', 0);

■TokenHandle.php (トークンチェッククラス)
!!!これはロジックを変更したのでボツにした。7月22日に作り変えた!!!

<?php
//トークンチェッククラス
class TokenHandle {
    // トークンHidden取得
    function getTokenHtml() {
        // トークン作成
        $latest_token =  md5(uniqid(rand(),TRUE));
        $_SESSION['KAZ_TOOL_token'] = $token;
        $_SESSION['KAZ_TOOL_token_time'] = time();
        return '<input type="hidden" name="KAZ_TOOL_token" value="'. $latest_token .'" />' ;
    }

    // トークンチェック
    function isTokenValid($mode, $userFlg = true) {
        $modeMach = false;
        $mode_ary = explode(',', TOKEN_CHECK_MODE ); // トークンチェック対象モード配列
        for($i = 0; $i < count($mode_ary); $i++) {
            if (trim($mode_ary[$i]) == $mode) {
                $modeMach = true;
                break;
            }
        }

        if (((TOKEN_CHECK_ADMIN_FLG == true && $userFlg == false) || 
             (TOKEN_CHECK_USER_FLG == true && $userFlg == true)) && 
              $modeMach == true) {
            if (isset($_SESSION['KAZ_TOOL_token']) && 
                $_REQUEST['KAZ_TOOL_token'] == $_SESSION['KAZ_TOOL_token']) {
                $token_age = time() - $_SESSION['KAZ_TOOL_token_time'];
                if (($userFlg == false && 
                     $token_age > (TOKEN_OK_ADMIN_TIME * 60)) ||
                    ($userFlg == true && 
                     $token_age > (TOKEN_OK_USER_TIME * 60))) {
                    // OK:トークン削除
                    $_SESSION['KAZ_TOOL_token'] = '';
                    $_SESSION['KAZ_TOOL_token_time'] = '';
                }
            } else {
                return false;
            }
            return true;
        }
        // OK
        return true;
    }
}
?>

■プログラムに追加
!!!これロジックを変更したという理由でボツにした。7月22日に作り変えた!!!

require_once('TokenHandle.php');

if (TokenHandle::isTokenValid($mode, true) == false) {
    // トークンチェックエラー場合
    sendRedirectExit('/kaz01u/index.php');
    exit;
}

<%= TokenHandle::getTokenHtml(); %>

■2度押しした場合トークンチェックエラーになってしまうので、このJavaScriptで2度押しできないようにしておく。
!!!これは処理内容変更したという理由でボツにした。7月22日に作り変えた!!!

・htmlに追加、修正  例):itemUaddConfirmView.htm_
<script type="text/javascript" src="/js/kaz.js"></script>

<a href="javascript:;do_Submit_CLK2('ins_do');"><img src="/kaz01u/img/btn/btn_entry.gif" alt="登録" width="61" height="22" border="0" class="right5" /></a>

kaz.js を新規で作成する。
!!!これは変更なし。7月22日に同じものを再度記述した。!!!

    var doubleClick_flg = true;
    //Submit制御(DoubleClick制御あり)
    function do_Submit_Clk1() {
        if (doubleClick_flg == true) {
            window.setTimeout(function() { doubleClick_flg = false; }, 1);
            window.setTimeout(function() { doubleClick_flg = true; }, 1000);
            document.frm.submit();
        } else {
            return; false;
        }
    }

    //Submit制御(DoubleClick制御あり)
    function do_Submit_Clk2(mode) {
        if (doubleClick_flg == true) {
            window.setTimeout(function() { doubleClick_flg = false; }, 1);
            window.setTimeout(function() { doubleClick_flg = true; }, 1000);
            document.frm.mode.value = mode;
            document.frm.submit();
        } else {
            return; false;
        }
    }

 ■サイト:http://kazpgm.ddo.jp/

5/24 03:00 - 06:30
5/25 10:00 - 0:30