cakePHPにおけるXSS対策

cakePHPのModelは、どうやら

 

$this->Model->query($sql);

 

という風でなければ、つまり

 

$this->Model->find();

$this->Model->save();

 

のような、モデルがORMで提供しているデータアクセスメソッドを使用した場合であれば、SQLインジェクション対策を行なっているらしい。

cakePHP自体が海の物とも山の物ともつかぬ代物なので、こいつがどれくらいの耐久度を持っててどういう潜在的脆弱性があるかわからないが、僕は基本的にcakeに任せてデータアクセスを行なっている。もちろんそのバージョンの脆弱性は検索を行なってもらうとして。

 

問題は、XSS対策である。

 

cakePHPは現行2.1.3までだと特にXSS対策をおこなっていない。ここのサニタイズは基本的に自分で行わなければならない。

僕はVendorにhtmlspecialcharsを配列の要素に対しても行なってくれる関数をおいて、

 

App::import("Vendor","functions");

 

でインポートして使った。

が、現行のネット情報を見てるとサニタイズはコントローラで行なっているのが殆どだった。

もちろんbeforeFilterを使えばそれは可能だが、きちんとMVCのモデルに則ってやるとしたら、入力ソースをそのまま画面に反復的に出す場合はコントローラ、データソースに記録する場合はモデルで行った方が健全だ。

 

つまり、アプリケーションによって実装は当たり前のように変わるけれど、基本的に両方ともに実装した方が望ましいだろう。

 

コントローラであれば、AppControllerのbeforeFilter();、モデルであればAppModelのbeforeSave();に該当するデータをサニタイズするコードを両方書いた方が好ましい。

そうすれば何かしらの事情でhtmlspecialcharsを外さなきゃいけない時も簡単に更新が出来る。コントローラの更新を行なってもモデルの健全性は保たれるし、モデルの更新を行なってもコントローラの健全性は保たれる。

 

割を食うのは全て外す時で、その時一つの機能、メソッドを2つ実装している事に気づかずハマる可能性はなきにしもあらずだけれど、外部に公開するウェブアプリであればそんなことはまず無いと思うので、大丈夫だろう。

 

MVCアーキテクチャを守ってこそのフレームワーク開発なので、ここは面倒臭がらずにやっておこう。