- 更新日: 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 への対策でした。
- PHP & CakePHP の関連記事
- PHP+MySQLでNo such file or directoryエラー
- bin/cakeコマンドでintlエラーが出る場合の対処(CakePHP)
- CakePHPアプリケーションをCapistranoでデプロイ
- Integrity constraint violation:Column ‘created’ in order clause is ambiguousエラー/CakePHP
- CakePHPでDB関連テーブルのレコード・データを取得
- CakePHPでカラム属性に別名/エイリアスを付ける仮想フィールド
- CakePHPで日付選択フォームのカスタマイズ
- CakePHP3で現在のコントローラー名・アクション名を取得
- PHPインストールでconfigure: error: freetype.h not foundエラー
- CakePHPでログイン後に元のページにリダイレクトさせる
Leave Your Message!