概要
Rails初学者は学習教材を見ていると、RailsアプリのController内に以下のようなメソッドを見かけると思います。
class SessionsController < ApplicationController
.
.
.
private
def user_params
params.require(:user).permit(:name, :email, :password)
end
end
privateだから情報が簡単に漏れないようにするためでしょ?って思った方、正解です🥳
publicである場合どのように情報が漏れるのか、privateをすることで何が実現できるのかについて話をしようと思います。
Strong Parameters
例えば、ユーザー登録画面があり、Railsが受け取る属性は以下の通りとします。
- name
- password
- password_confirmation(パス再確認)
- admin (管理者権限のカラム。Boolean型)
Controllerでは、下記のようにparams[:user]とすることで、上のリストの5項目全てが取得されます。それが、userへ代入、saveされることでDBへ保存する流れです。
def create
user = User.new(params[:user])
if user.save
.
.
end
しかしその際、悪意のあるユーザーがadminのboolean型をtrueにするコマンドをcurlコマンドで送りつけると、アプリ内の最強権限を持つユーザーになれるということが実現できるみたいです。(よくわかんないけど、実際に試しにやってみたいですね👀)
なので、この場合createアクションに送られるデーターの種類を必要な数だけ絞って、且つ他のアクションと分けるために、privateと呼ばれるメソッドの内部で定義することとします。
def create
user = User.new(user_params)
end
private
def user_params
params.require(:user).permit(:name, :email, :password)
end
end
こうすることで、curlコマンドで送信されるadminはそもそもparameterとして送られることはなく、管理者権限を悪用されるということはなくなるわけです。
この手法(privateメソッド内でデータ取得ロジックを書くこと)をStrong parametersといい、セキュリティの向上が見込まれます。
privateメソッド以下で:name, :email, :passwordを取得、user_paramsメソッドの戻り値としての処理を終え、User .newの引数として、渡されるわけです。
この弱々なセキュリティのことをマスアサインメント脆弱性とも言ったりするようで、対策術は他にもあるみたいです。👀
初学者はとりあえずここまで理解できてればいいかもしれません😭