LaravelのMass Assignmentとは

LaravelのMass Assignmentとは

Mass Assignment(マスアサインメント)とは

コンピュータ脆弱性の1つ。本来権限を持っていないユーザー(や悪意ある第三者)によってデータ項目を変更されること。

通常はWebサイトにあるフォームからデータをやりとりすることを想定しているが、(例えば開発者ツールなどを使って)そのフォームのname属性を改変し(例えばname=’password’などとし)それをフォームから送信するとする。もしバックエンドで属性をvalidateせずに保存するような処理が書かれているとすると、DBに同じ名前のカラムが存在したときにそれを予期せぬ方法で上書きできてしまう。

一行だけで新しいモデルを保存するには、createメソッドを利用できます。挿入されたモデルインスタンスが、メソッドから返されます。しかし、これを利用する前に、Eloquentモデルはデフォルトで複数代入から保護されているため、モデルへfillableguarded属性のどちらかを設定する必要があります。
複数代入の脆弱性はリクエストを通じて予期しないHTTPパラメーターが送られた時に起き、そのパラメーターはデータベースのカラムを予期しないように変更できてしまうでしょう。たとえば悪意あるユーザーがHTTPパラメーターでis_adminパラメーターを送り、それがモデルのcreateメソッドに対して渡されると、そのユーザーは自分自身を管理者(administrator)に昇格できるのです。

Laravel 7.x Eloquent:利用の開始 > 複数代入

DBやテーブルは一般に分かりやすい名前のものが多いので、攻撃者による攻撃に的になり得る。

Mass Assignmentはこの様な脆弱性、またはそれを利用した攻撃のことを指す。

Laravelでマスアサインメントを阻止する

Eloquentモデルを使ってcreateするとき、なにも設定しないとMassAssignmentExceptionというエラーに遭遇する。

それを解消する2つの方法

  • ブラックリスト
  • ホワイトリスト

ブラックリスト

以下の様に、指定した要素をguardすることでそれ以外の要素をcreateに渡すことができる。

上記の様に記述すればcreateからidとyear以外の要素を渡すことができる。

idとyearをguard(=保護)している。

ホワイトリスト

以下の様に、指定した要素をfillableにして許可を与えることで、その要素のみをcreateから渡すkとができる。

上記の様に書くことでcreateからnameとageの要素を変更可能(=fillable)にしている。