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> # こんなことするのかな?