- 2016年2月3日
- PHP & CakePHP
CakePHPで一括代入/Mass Assignmentに対策
CakePHP 3 で Mass Assignment 脆弱性に対応する方法です。Mass Assignment とは、モデルの属性をハッシュで一括して代入することで、一括して代入できる属性を適切に制限しておかないと脆弱性が生じてしまう場合があります。
— 環境 —
PHP 5.5.19
CakePHP 3.1.1
モデルの $_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 対策例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Model\Entity; use Cake\ORM\Entity; use Cake\Auth\DefaultPasswordHasher; class User extends Entity { protected $_accessible = [ 'id' => false, 'role' => false, 'created' => false, 'modified' => false, 'email' => true, 'password' => true, 'name' => true, ]; // ... } |
role 属性(一般ユーザー: normal/管理者ユーザー: admin などの役割を保存するカラム)を false に指定して、role 属性には代入による設定をできないようにしています。
これは、role(役割)が admin(管理者)のユーザーのみ、role 属性を変更できるように制限しておきたいためです。’role’ => true とすると、一般ユーザーによる Mass Assignment で role が変更されてしまう恐れがある。
他の属性、email, password, name は、一般ユーザーでも変更可能なので true を指定しています。
$user->accessible() で属性への代入を許可
上記の $_accessible の設定だけですと、管理者ユーザーであっても role 属性の変更ができなくて困ります。
管理画面の中などで、管理者ユーザーにのみ role 属性の変更を許可する場合は、以下のように書くと role への代入を許可できます。
|
1 2 3 4 |
if ( $user['role'] === 'admin' ) { $user->accessible('role', true); // ... } |
以上、CakePHP 3 で Mass Assignment への対策でした。
- - 関連記事 -
- CakePHPでAjaxのPOST送信
- CakePHPでDBテーブルのカラム名がMySQL予約語に被りエラー
- CakePHPでカラム追加のマイグレーション
- CakePHPでシェル/コマンドラインからタスク実行
- CakePHPのbakeコマンドでディレクトリにコントローラー・ビューを生成
- CakePHP3でログイン中ユーザーが本人のユーザー情報のみを編集・削除できるように制限
- CakePHP3をDocumentRoot以外に設置
- CakePHPデプロイでPHP extension intlエラー
- Composer should be invoked via the CLI version of PHP, not the cgi-fcgi SAPI
- SSHKit::Runner::ExecuteError/composer stdout: Nothing written
Leave Your Message!