LoginSignup
23
20

More than 3 years have passed since last update.

[CakePHP3] もう毎回 h() なんて書きたくない!!

Last updated at Posted at 2015-12-08

Advent Calendar何か書こうかなーと思っていた時に、ふと思い立ちプラグインを作成しました。

セキュリティ対策としてViewで扱う文字列にはHTMLエスケープが必要です。

CakePHPにはh()というhtmlspecialchars()をサクッと使えるものがあります。
が、
大規模なシステムになってくるとどうしても抜けが派生しがち。

その抜けをなくすためのplugin for CakePHP3を作成してみました。
要はh()なんて書かずにすべてエスケープされてやればいいんだ!

リポジトリ

name : Altair
github : https://github.com/tutida/altair
composer : https://packagist.org/packages/tutida/altair

参考にしたPlugin

k1low/escape : https://github.com/k1LoW/escape

やってること

ControllerからViewクラスに渡される変数は全て「$viewVars」に格納されるので、それを無差別にHTMLエスケープしてます。

使い方

//AppController

    class AppController extends Controller
    {

        public function initialize()
        {
            $this->loadComponent('Altair.Altair');
        }

これだけで、viewのほうで毎回、<?= h($variable); ?>とか書かずに済みます。

//エスケープ済み
<td><?= $user->username ?></td>
<td><?= $user->password ?></td>
<td><?= $user->created ?></td>
<td><?= $user->modified ?></td>

CakePHP2との違い

find()の返り値がオブジェクト

CakePHP2の場合、paginate()やfind()の結果は配列でしたが、
CakePHP3よりそのあたりがオブジェクトとなったので、HTMLエスケープをするのか多少面倒。

formへ入力される値はデコードする必要あり

CakePHP2の場合、edit画面などでformへ入力される値は$viewVarsではなく$this->requst->dataを参照していました。
CakePHP3の場合は、$viewVarsに格納されているformに対応するEntityオブジェクとを参照するため、
すべての変数を無差別にHTMLエスケープしている実装だと、formに入る値もエスケープされてしまいます
2015-12-03_10h57_28.png
なので、FormHelperを継承したDecodeFromHelperをPluginに含めています。
inputに入力される値は再びデコードする仕様です。
※なので、FormHelperを別でオーバーライドする場合は意図通りの動きをしません...
何かいい案あったら是非ご意見を。

是非機会があれば使ってみてください。

穴だらけだと思うので、皆さんのフィードバックで育てていきたいと思います。

23
20
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
20