0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RailsのPrivateメソッドとは?Strong Parametersの実体

Posted at

概要

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が受け取る属性は以下の通りとします。

  1. name
  2. email
  3. password
  4. password_confirmation(パス再確認)
  5. 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の引数として、渡されるわけです。
この弱々なセキュリティのことをマスアサインメント脆弱性とも言ったりするようで、対策術は他にもあるみたいです。👀

初学者はとりあえずここまで理解できてればいいかもしれません😭

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?