概要
Strong Parametersについて、セキュリティに強い値の取り方というくらいの認識で
あまり意識せずに書いていたため、改めて必要性と書き方について纏めてみました。
Strong Parametersについて
Web上から入力された値をセキュリティ面で安全に受け取るための仕組みであり、値の正当性をチェックしてくれます。
そうして指定した値以外を受け取らないようにすることで、攻撃を防ぐというセキュリティ対策です。
1つのモデルに対して属性をまとめて取得するというRailsに元々搭載されているマスアサイメント機能の脆弱性を防ぐためにできた機能です。
例えば、UserコントローラーでCreateアクションを起こすとき、
渡すカラムが増えた場合、都度paramsを追加していくのは手間がかかります。
def create
User.create(name: params[:user][:name], email: params[:user][:emails], password: params[:user][:password])
end
上記のコードはこのように書き換えられ、値を纏めて渡すことができます。
def create
User.create(params[:user])
end
これがマスアサイメント機能です。
しかし、これはuserに紐付いた値であれば全ての値をcreateメソッドに渡すことになるため、セキュリティ面で問題があります。
例えば、悪意のあるユーザーがChromeの検証ツールからtrueの値を渡してadmin権限を変更したり、外部からシステムを自由に操作できてしまいます。
そこで登場したのが「Strong Parameters」です。
rails4以降に登場した機能です。
StrongParametersを使用すれば、渡す値を指定することができるので外部からの悪意のある攻撃を防ぐことができます。
書き方
def create
User.create(params.require(:user).permit(:name))
end
この場合、userキーのnameだけ受け取り許可するということになります。
Email,passwordも受け取る場合は
def create
User.create(params.require(:user).permit(:name, :email, :password))
end
最後に、Strong Parametersはupdate,destroyアクションなどでも利用でき、コードが重複するのでメソッドとして記述するのが一般的です。
private
def user_params
params.require(:user).permit(:name, :email, :password)
end
end
尚、そのクラス内でしか呼び出すことができなくするためにprivateメソッドとして記述します。
外部からuser_params
を呼び出したい場面はありませんので。
下記参考の通りですが、privateメソッドはレシーバをつけて呼び出すことができないので
例えばUserクラスで指定したprivateメソッドは、Userクラス以外のレシーバから呼び出すことができません。
参考:Ruby の private メソッドとは
http://secret-garden.hatenablog.com/entry/2015/07/02/000000