CakePHPで一括代入/Mass Assignmentに対策

スポンサーリンク

CakePHP 3 で Mass Assignment 脆弱性に対応する方法です。Mass Assignment とは、モデルの属性をハッシュで一括して代入することで、一括して代入できる属性を適切に制限しておかないと脆弱性が生じてしまう場合があります。

— 環境 —
PHP 5.5.19
CakePHP 3.1.1

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

モデルの $_accessible で代入可能な属性を制限する

Rails 4 の Strong Parameters より以前の、Rails 3 までの attr_accessible と同じようなやり方で、モデル側で accessible(代入可能)なプロパティを指定してやる。

CakePHP 3 や Rails 3 の attr_accessible はモデル側での対策となるのに対し、Rails 4 の Strong Parameters はコントローラー側での対策となる。なので、将来的には CakePHP のバージョンアップで、Rails 4 の Strong Parameters と同じようになるかもですね。

ちょっと話が脱線しましたが… 以下 CakePHP3 で、User モデルでの Mass Assignment 対策例です。

role 属性(一般ユーザー: normal/管理者ユーザー: admin などの役割を保存するカラム)を false に指定して、role 属性には代入による設定をできないようにしています。

これは、role(役割)が admin(管理者)のユーザーのみ、role 属性を変更できるように制限しておきたいためです。’role’ => true とすると、一般ユーザーによる Mass Assignment で role が変更されてしまう恐れがある。

他の属性、email, password, name は、一般ユーザーでも変更可能なので true を指定しています。

$user->accessible() で属性への代入を許可

上記の $_accessible の設定だけですと、管理者ユーザーであっても role 属性の変更ができなくて困ります。

管理画面の中などで、管理者ユーザーにのみ role 属性の変更を許可する場合は、以下のように書くと role への代入を許可できます。

以上、CakePHP 3 で Mass Assignment への対策でした。

スポンサーリンク
私は Ruby on Rails の前は、PHP & CakePHP を使っていました(今も使いますけど)。PHP についてはオライリーの本を中心に軽く10冊以上は読み込みました。
 
スポンサーリンク

Leave Your Message!