🚫
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リクエストパラメータフィルタリング
ロール別権限区分
ネストフォームデータ処理