kazpgmの日記

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

TOOL更新_viewをsmartyで。の続き。サニタイズを確実にする。

TOOL更新_viewをsmartyで。の続き。サニタイズを確実にする。
☆お助けTOOL次バージョンのhtmlのsmartyはデフォルトでサニタイズ『$smarty->default_modifiers = 'escape:"html"';』する。
  さらに、サニタイズ忘れを防ぐため、html上から『|smarty:nodefaults』を削除する。ということを行った。サンプルとしているhtmlから使用箇所を洗い出し検討した。結果として以下の2点のみ『|smarty:nodefaults』を書くことになった。
   1.$result:実際の値を表示するときサニタイズされる。 2.$o.pager:ページング。すでにhtmlタグが書かれている。

===以降、具体的な修正点===
1.現在$errはfunctions.phpのencloseErrorTag($errorMessages)を使ってsmartyに渡す前に『'<div class="font-s-red-form">' . htmlspecialchars_r($val) . '</div>'』している。これため『|smarty:nodefaults』が必要だった。これを『AppSmartyPlugin.php』に『smarty_modifier_kaz_encErrTag($string)』modifier pluginを作って『{{$err.srch_topErrMessage|kaz_encErrTag}}』とする。ここで『<div ・・・</div>』する。これにより以下を行う。

 ・{{if $err.srch_topErrMessage|smarty:nodefaults != ""}}などの$errのif文は『|smarty:nodefaults』を削除する。(もともと『==''』で判定しているのでサニタイズしてあってもなくても同じだった。$err_flgはtrue、false。サニタイズしても変化しないということがわかったので。)

  ターゲット <=これらの『|smarty:nodefaults』を削除する。

        ■logininfoListView.html
            {{if $err.srch_topErrMessage|smarty:nodefaults != ""}}
            <td class="{{if $err.srch_yuko_flg|smarty:nodefaults ==''}}none{{else}}error{{/if}}">
            <td class="{{if $err.srch_login_type|smarty:nodefaults ==''}}none{{else}}error{{/if}}">
            <td class="{{if $err.srch_login_id|smarty:nodefaults ==''}}none{{else}}error{{/if}}">
            {{kaz_chk_error_assign var='err_flg' err=$err|smarty:nodefaults}}
            {{if $err_flg|smarty:nodefaults == false }}
        ■logininfoDetailView.html
            なし
        ■logininfoRegisterView.html
            なし
        ■logininfoAmendView.html
            なし
        ■logininfoAmendRegisterViewInc.html
            <td class="{{if $err.login_id|smarty:nodefaults == ''}}none{{else}}error{{/if}}">
            <td class="{{if $err.login_type|smarty:nodefaults == ''}}none{{else}}error{{/if}}">
            <td class="{{if $err.pwd1|smarty:nodefaults == ''}}none{{else}}error{{/if}}">
            <td class="{{if $err.yuko_flg|smarty:nodefaults == ''}}none{{else}}error{{/if}}">

 ・{{$err.srch_topErrMessage|smarty:nodefaults}}などの$errの値は『AppSmartyPlugin.php』に『smarty_modifier_kaz_encErrTag($string)』modifier pluginを作って『{{$err.srch_topErrMessage|kaz_encErrTag}}』にする。

     ■AppSmartyPlugin.php
        /**
         * Smarty kaz_encErrTag modifier plugin
         *
         * Type:     modifier<br>
         * Name:     kaz_encErrTag<br>
         * Purpose:  エラーメッセージを赤にして戻す。
         *           $stringはサニタイズ済みであること。
         * @param string
         * @return string
         */
        function smarty_modifier_kaz_encErrTag($string)
        {
            return '<div class="font-s-red-form">' . $string . '</div>';
        }

  ターゲット <=これらの『|smarty:nodefaults』を|kaz_encErrTag』にする。

        ■logininfoListView.html
            {{$err.srch_topErrMessage|smarty:nodefaults}}
            {{$err.srch_login_type|smarty:nodefaults}}
            {{$err.srch_login_id|smarty:nodefaults}}
            {{$o.del_do_chk_msg|smarty:nodefaults}}
        ■logininfoDetailView.html
            なし
        ■logininfoRegisterView.html
            なし
        ■logininfoAmendView.html
            なし
        ■logininfoAmendRegisterViewInc.html
            {{$err.login_id|smarty:nodefaults}}
            {{$err.login_type|smarty:nodefaults}}
            {{$err.pwd1|smarty:nodefaults}}
            {{$err.yuko_flg|smarty:nodefaults}}

2.『kaz_element、kaz_html_radio、kaz_html_select』function pluginのvaueやindataに『|smarty:nodefaults』を付けるのはやめる。valueやindataはAppElementsのコード一覧を検索するために使うもの。だからサニタイズしないものがいいと考えていた。しかし、今回サニタイズを基本にする。という意思を通すため。AppElementsのキーをサニタイズして比較するというように変更する。かつ、htmlへ表示する値もサニタイズする。

     ■AppHtmlUtil.php 修正 getHTMLSelectのみ抜粋。
    getHTMLRadio、getHTMLCheckBox、getHTMLCheckBoxDispStrも同様な修正を行った。

<<修正前>>
    function getHTMLSelect($emts, $indata, $name, $dflt, $elementsIdx = '0') {
        $result = "<select name=\"" . $name . "\" id=\"" . $name .  "\" ";
        $result .= " >\n";
        if ($dflt != '') {
            $result .= "<option value=\"\">" . $dflt  . "</option>\n";
        }
        foreach ($emts  as $key => $val) {
            $selected = ((String)$indata == (String)$key ? "selected" : "");
            $result .= "<option value='" . $key . "' " . $selected . ">" . $val[$elementsIdx] . "</option>\n";
        }
        $result .= "</select>\n";
        return $result;
    }
<<修正後>>
    function getHTMLSelect($emts, $indata, $name, $dflt, $elementsIdx = '0') {
        $result = "<select name=\"" . $name . "\" id=\"" . $name .  "\" ";
        $result .= " >\n";
        if ($dflt != '') {
            $result .= "<option value=\"\">" . htmlspecialchars($dflt)  . "</option>\n";
        }
        foreach ($emts  as $key => $val) {
            $selected = ((String)$indata == htmlspecialchars((String)$key) ? "selected" : "");
            $result .= "<option value='" .  htmlspecialchars($key) . "' " . $selected . ">" . htmlspecialchars($val[$elementsIdx]) . "</option>\n";
        }
        $result .= "</select>\n";
        return $result;
    }

  ターゲット <=これらの『|smarty:nodefaults』を削除する。

        ■logininfoListView.html
            {{kaz_html_radio elename='YUKO_FLG' indata=$o.srch_yuko_flg|smarty:nodefaults 
                name="srch_yuko_flg" dflt="全て" idx=$o.c_elements_idx su=10}}
            {{kaz_html_select elename='LOGIN_TYPE' indata=$o.srch_login_type|smarty:nodefaults 
                name="srch_login_type" dflt="全て" idx=$o.c_elements_idx}}
            {{kaz_element elename='LOGIN_TYPE' value=$vals.login_type|smarty:nodefaults idx=$o.c_elements_idx tdKbn='TD'}}
            {{kaz_element elename='YUKO_FLG' value=$vals.yuko_flg|smarty:nodefaults idx=$o.c_elements_idx tdKbn='TD'}}
        ■logininfoDetailView.html
            {{kaz_element elename='LOGIN_TYPE' value=$o.login_type|smarty:nodefaults idx=$o.c_elements_idx tdKbn='TD'}}
            {{kaz_element elename='YUKO_FLG' value=$o.yuko_flg|smarty:nodefaults idx=$o.c_elements_idx tdKbn='TD'}}
        ■logininfoRegisterView.html
            なし
        ■logininfoAmendView.html
            なし
        ■logininfoAmendRegisterViewInc.html
            {{kaz_html_select elename='LOGIN_TYPE' indata=$o.login_type|smarty:nodefaults name="login_type" dfltval='' 
                dflt=" --- 以下から選択して下さい。--- " idx=$o.c_elements_idx}}
            {{kaz_html_radio elename='YUKO_FLG' indata=$o.yuko_flg|smarty:nodefaults name="yuko_flg"  dfltval='2' 
                dflt="" idx=$o.c_elements_idx su=10}}

3.そのた。
   $resultは実際の値を表示するときサニタイズされる。$o.pagerはページング。すでにhtmlタグが書かれている。

  ターゲット <=これらはこのまま『|smarty:nodefaults』を記述する。

        ■logininfoListView.html
            {{foreach from=$result|smarty:nodefaults item="vals" name="lineCount"}}
            {{$o.pager|smarty:nodefaults}}
        ■logininfoDetailView.html
            なし
        ■logininfoRegisterView.html
            なし
        ■logininfoAmendView.html
            なし
        ■logininfoAmendRegisterViewInc.html
            なし

6/2 20:30-3:00 今日はアイデアのみ、プログラム修正は明日。viewはこれを最終系にする。DbManagerも修正途中なのだが、こっちのアイディアを忘れないうちにということで、、、、。$err_flgも何とかして『|smarty:nodefaults』はずすようにしよう。
6/3 21:00-23:00 $err_flgは『|smarty:nodefaults』はずしてもOKだということがわかったので、このページを直接書きかえた。true、falseはサニタイズしても変化しないということがわかったので。以下のテスト参照。

■smartyのコンパイル後php『%%42^420^42085E26%%logininfoListView.html.php』に
 直接以下を書き入れて確認した。
<?php $this->_tpl_vars['err_flg']=false; echo "err_flg=【" .
 $this->_tpl_vars['err_flg'] . "】【" . 
smarty_modifier_escape($this->_tpl_vars['err_flg'], 'html') . "】"; ?>
の結果は以下であった。
err_flg=【】【】

<?php $this->_tpl_vars['err_flg']=true; echo "err_flg=【" . 
$this->_tpl_vars['err_flg'] . "】【" . 
smarty_modifier_escape($this->_tpl_vars['err_flg'], 'html') . "】"; ?>
の結果は以下であった。
err_flg=【1】【1】

6/9 1:30-1:30 smarty_modifier_kaz_encErrTagメソッドのロジックを修正した。