インソースマーケティングデザイン
2012.07.12 システム
CakePHPのセキュリティ対策(XSS:クロスサイトスクリプティング)
前回は、CakePHPでライブラリを共通利用する方法を紹介しました。
Webアプリケーションを開発する際、セキュリティ対策を考慮した
セキュア・プログラミングが必須となっています。
CakePHPにてどのようにセキュリティ対策を行っているかを紹介します。
今回はクロスサイト・スクリプティング(XSS)についてです。
クロスサイト・スクリプティングについては、こちらを参照してください。
簡単に言うと、ユーザが入力したものがそのままHTMLに表示され、悪意のあるコードが入力されたとき、大変なことになるというものです。
色々方法はあると思いますが、私たちはこんなやりかたをしています。
コントローラーからビューへデータを渡すとき使用する「setメソッド」を
全てのコントローラーの親である「AppController」にてオーバーライドして、
そこで出力データをサニタイズしています。
ビューにて出力するデータは必ず「setメソッド」を通して渡します。
但し、HTMLにおける特殊文字はエンティティに変換されてしまうため、
何かの事情でどうしてもサニタイズかけたくない!という場合は、
「setメソッド」のパラメータ「サニタイズを行わない」を渡せばサニタイズをせずに、
出力することも可能です。
/**
* setメソッドのオーバーライド
* ※値のサニタイズ処理追加
* @see cake/libs/controller/Controller#set($one, $two)
* @param $var
* @param $val
* @param boolean $sanitize
* true:サニタイズする false:サニタイズを行わない
* @return
*/
public function set($var, $val = null, $sanitize = true) {
if ($sanitize) {
$val = $this->__sanitize($val);
}
return parent::set($var, $val);
}
/**
* サニタイズ処理
* @param $dat
* @return
*/
private function __sanitize($dat) {
if (is_array($dat)) {
foreach ($dat as $cnt => $val) {
$dat[$cnt] = $this->__sanitize($val);
}
return $dat;
} else {
return htmlspecialchars($dat);
}
}
}
サニタイズ処理にPHP関数「htmlspecialchars」を使用していますが、
CakePHPの「Sanitize」ライブラリを使用してもいいと思います。
この仕組みを作った当初あれこれ試してみたのですが、
なぜ「htmlspecialchars」を採用したのか今はもう忘れてしまいました。。。
「htmlspecialchars」を使用するとすべてのタグがサニタイズされるため、
「Sanitize」のほうが、サニタイズするタグを選択できるというメリットがあるのかもしれません。
以上です。ではまた。