cakephp2.doc_002
R e i - D r e a m
for Laravel
TOP > CakePHP2 > 環境関連(不正コード対策)
Guest
login

最終投稿日:2019年11月20日

環境関連(不正コード対策)
CakePHP1.3 CakePHP2.x
【クロスサイトスクリプティング(XSS)対策】
サーバーサイドから値をブラウザにそのまま表示させるとjavascriptなど不正なコードを実行してしまう危険性があるため、前もって値をサーバー側でサニタイズする必要があります。
そこでコントロール側のプログラムでset時に毎回サニタイズするのはアホらしいのでsetメソッドをオーバーライドして、意識しなくても自動的にサニタイズされるようにしました
AppController.php に set メソッドをオーバーライドし、渡される値をサニタイズする。
    <?php
        App::uses('Controller', 'Controller');
        class AppController extends Controller {

            //クロスサイトスクリプティング(XSS)対策
            public function set($var, $val = null, $sanitize = true){
                if ($sanitize) {
                    $val = $this->__sanitize($val);
                }
                return parent::set($var, $val);
            }

            private function __sanitize($dat){
                if (is_array($dat)) {
                    foreach ($dat as $cnt=>$val) {
                        $dat[$cnt] = $this->__sanitize($val);
                    }
                    return $dat;
                }else {
                    return htmlspecialchars($dat,ENT_QUOTES);           //サニタイズする
                }
            }
        }
    ?>
            
逆にset時にサニタイズしたくない場合は3番目の引数にfalseを指定すればそのまま出力してくれます。

$this->set('auth',$this->Auth->user(),false);

~htmlspecialchars メモ~

string htmlspecialchars( string string [, int quote_style [, string charset ]] )

    & &amp; 常に変換される 
    < &lt; 〃 
    > &gt; 〃 
    " &quot; quote_styleの設定による。デフォルトでは変換される。 
    ' &#039; quote_styleの設定による。デフォルトでは変換されない。 

"(ダブルクォート)または'(シングルクォート)を変換するかどうか。
デフォルトにはENT_COMPACTという値が設定されていますので、
ダブルクォートは変換されますが、シングルクォートは変換されません。

quote_styleの指定には以下の定数を使用します。

    ENT_COMPAT         2     "は変換するが、'は変換しない(デフォルト) 
    ENT_QUOTES         3     両方変換する 
    ENT_NOQUOTES       0     両方変換しない 
            
ログインしてコメントを残そう!!


きっぷる