Strong Parameter について

Strong Parameterとは?

Mass Assignmentの脆弱性を利用して行われるDBへの攻撃を防ぐ為の機構です。
(Rails4で実装されました。)

Mass Assignmentの脆弱性とは?

def create
# params[:user] => {name: 'hoge', email: 'foo@bar.com'}
  user = User.new(params[:user])
  user.save
end

上記のようなアクションがあったとしたら、今のままでは極めて危険です。
なぜなら、ユーザーから送信されたデータが全て渡される状態だからです。
具体的な例としては、Userテーブルにadmin属性(管理者権限)がある場合、
curlコマンドを用いて「admin = true」というパラメータが渡せます。
結果、管理者権限を奪われるという結果に繋がるからです。
結論としては以下のように書きます.

def create
  user = User.new(user_params)
  user.save
end

private

def user_params
  params.require(:user).permit(:name, :email)
end

require,permit...何?

require

単一のkeyとkeyの配列の両方を受け取ることができます。
単一のkeyを受け取った場合、それが存在し、尚且つ関連付けされた値があれば、その値を返します。
補足:
エイリアスは「required」

params = ActionController::Parameters.new({
  father:  { name: 'Kenji',  age: 40 },
  mother:  { name: 'Tomoko', age: 35 },
  brother: {}
  })

params.require(:father)
# => <ActionController::Parameters {"name"=>"Kenji", "age"=>40} permitted: false>
#値を返します。

params.require([:father, :mother])
# => [<ActionController::Parameters {"name"=>"Kenji", "age"=>40} permitted: false>, <ActionController::Parameters {"name"=>"Tomoko", "age"=>35} permitted: false>]
#配列で複数のkeyを指定することもできます。

params.require(:brother)
#=> param is missing or the value is empty: brother
#=> 関連付けされた値が存在しない場合、例外が発生します。
permit

このメソッドがStrong Parameterを意味しています!!
任意のkeyを指定することで、パラメータに制限をかけた新しいActionController::Parameters インスタンス(=params)を返します。

params,requireの例文での出力結果を見ると、「permitted: false」となっています。
これが「true」になることで、Mass Assignmentが初めて使用可能になります。

params = ActionController::Parameters.new({
  father:  { name: 'Kenji',  age: 40 },
  mother:  { name: 'Tomoko', age: 35 },
  })

params.reqiure(:father).permit(:name)
# => <ActionController::Parameters {"name"=>"Kenji"} permitted: true>
# 指定したname属性のみ返しているのが分かります。
# permitted:false -> permitted:true になってるのがわかります。

params.require([:father,:mother])[1].permit(:age)
# => <ActionController::Parameters {"age"=>35} permitted: true>
# こんなことするのかな?

参考

api.rubyonrails.org