最終投稿日:2019年11月20日
環境関連(不正コード対策)
CakePHP1.3 CakePHP2.x
【クロスサイトスクリプティング(XSS)対策】
サーバーサイドから値をブラウザにそのまま表示させるとjavascriptなど不正なコードを実行してしまう危険性があるため、前もって値をサーバー側でサニタイズする必要があります。
そこでコントロール側のプログラムでset時に毎回サニタイズするのはアホらしいのでsetメソッドをオーバーライドして、意識しなくても自動的にサニタイズされるようにしました AppController.php に set メソッドをオーバーライドし、渡される値をサニタイズする。
そこでコントロール側のプログラムで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 両方変換しない




