🚫

Strong Parameters

Mass Assignment攻撃防止

Strong ParametersはMass Assignment攻撃を防止するRailsのセキュリティ機能です。

Mass Assignment攻撃とは?

# 悪意あるユーザーがadmin=trueをこっそり送信
POST /users { user: { name: "Hacker", email: "...", admin: true } }

防御:

def user_params
  params.require(:user).permit(:name, :email, :password)
  # adminフィールドはpermitにないため自動無視!
end

def create
  @user = User.new(user_params)  # 安全
  # @user = User.new(params[:user])  # 危険!(Rails 4以前の方式)
end

ネストパラメータ:

params.require(:post).permit(
  :title, :content,
  tags: [],                           # 配列
  comments_attributes: [:id, :body]   # ネストモデル
)

ロール別の異なる許可フィールド:

def user_params
  if current_user.admin?
    params.require(:user).permit(:name, :email, :role, :admin)
  else
    params.require(:user).permit(:name, :email)
  end
end

キーポイント

1

params.require(:model) — 必須パラメータキーの検証

2

.permit(:field1, :field2) — 許可フィールドのホワイトリスト

3

許可されないフィールドは自動フィルタリング(無視)

4

Model.create(permitted_params)で安全に生成

5

ネスト: permit(tags: [], address: [:city, :zip])

6

ロール別分岐でadmin/一般ユーザーに異なるフィールドを許可

メリット

  • Mass Assignment攻撃を根本的に遮断
  • 許可フィールドがコードに明示的
  • Controllerで管理 → Modelにセキュリティロジック不要
  • ネスト/配列パラメータもサポート

デメリット

  • 新フィールド追加時permitの更新を忘れやすい
  • 複雑なネスト構造で設定が面倒
  • 許可されないフィールド無視を知らないとデバッグが困難

ユースケース

全てのフォームデータ処理 APIリクエストパラメータフィルタリング ロール別権限区分 ネストフォームデータ処理