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】