IT-Q

マスアサインメント脆弱性は、具体的にどう起きますか。

フォームに無い項目、たとえば is_admin=1 を攻撃者が付け足して送信できるからです。画面に入力欄が無くても関係ありません。HTTPリクエストは自由に組み立てられます。

面接官が見ているのは名前だけでなく攻撃の流れを説明できるか。

これは「Laravel が標準で守ってくれるものと、自分で書く必要があるものの区別として正しいのはどれですか。」への追撃質問です。

よくある答えと、面談でどう見られるか

  • User::create($request->all()) のように、リクエストの中身をそのまま渡している
    その通りです。画面に入力欄が無くても、HTTPリクエストは自由に組み立てられます。
  • パスワードをハッシュ化せずに保存している
    それも問題ですが別の脆弱性です。
  • 大量のレコードを一括で insert している
    「マス」は件数ではなく「まとめて代入する」の意味です。
  • バリデーションを書いていない
    関連はします。validated() を渡せば防げるので、対策としては同じ方向です。ただし脆弱性の本体は一括代入の方です。

面接官は何を見ているか

  • リクエストの全項目をそのまま保存する形が原因だと言えた
  • 画面に無い項目(is_admin 等)を送り込まれる例を出せた
  • $fillable / $guarded による防御を説明できた

模範解答

User::create($request->all()) のように、リクエストの中身をそのまま渡す実装が原因です。攻撃者はフォームに無い項目、たとえば is_admin=1 を勝手に付け足して送信できます。画面上に入力欄が無くても、HTTPリクエストは自由に組み立てられるからです。防御は、モデルの $fillable に代入を許す列だけを列挙すること。あるいは $request->all() ではなく validated() を渡して、検証を通った項目だけに絞ります。

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。