LoginSignup
1
1

More than 3 years have passed since last update.

【Rails】Strong Parametersの書き方について

Posted at

概要

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

1
1
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
1
1