$$hashKeyのせいでCakePHPのBlackHoleに引きずり込まれたよ

a1180_002982_mものすごーーーーーーーーーーーーーーっっっっく久しぶりにスタッフブログを書く龍司です。

最近、NetCommons3を触るようになってからCakePHPとAngularJSをよく使うようになりました。

この組み合わせでちょっとはまったのではまった点について。

CakePHPのセキュリティコンポーネントを使うとフォームからのPOSTに対して下記の様なガードが働くようになります。

  • CSRF対策のトークンが一致しなきゃダメ
  • フォームヘルパで作成したフィールド名から増えちゃダメ
  • hiddenで埋めた値が変更されてたらダメ

一見とても便利そうなんですが、そもそも自由にフォームをつくるためにCakePHPのFormヘルパつかってませんとかになると、引っかかりまくることになります。

今回ちょっと引っかかったのはAngularJSと組み合わせて複数レコードをまとめて更新するようなフォームをつくってたときです。

CakePHPのFormヘルパで出力するフォーム名とAngularJSの変数の形をあわせていったんですが、配列のポストするときに自分では全く指定してない $$hashKeyなんてキーの値がポストされてました。

これ、調べてみたらAngularJSが配列のユニークキーとして使ってる値らしいですね。いつ追加されるかわからないですが、ng-model と関連づけるためかな?

でこの値をもったたま配列をCakePHPにPOSTしちゃうとセキュリティコンポーネントがBlackHole反応しちゃうので、POSTする前に$$hashKeyを削ってやる必要があります。

やり方は下記の様な感じ。

angular.fromJson(angular.toJson($scope.params));

一旦Json文字列にシリアライズすると$$hashKeyは削除されたJson形式の文字列になるので、そうしてからもういちど配列にもどす感じですね。

セキュリティコンポーネントのBlackHoleに吸い込まれちゃったら$$hashKeyがくっついてないか確認してみてくださいね〜