LoginSignup
0
0

(rails)Strong Parametersについて

Last updated at Posted at 2023-07-06

Strong Parametersとは

trong Parametersは、コントローラ内で使用されるパラメータを安全に扱うための機能です。
この機能は、アプリケーションに対するユーザーのリクエストからのパラメータ(※1)が、指定された許可リストに従ってフィルタリングされることを保証します。つまり、開発者が許可したフィールドのみがMass Assignment(※2)できるようになり、意図しないフィールドへの不正な代入を防ぎます。

(※1)パラメータは、関数やメソッド、プロシージャに渡される変数のことを指します。
(※2)Mass Assignmentは、Ruby on RailsなどのWebフレームワークで使われる機能の一つで、一度に複数のモデルの属性を設定できる機能を指します。

なぜ、Strong Parametersが必要なのか?

Strong Parametersがなければ、悪意のあるユーザーはフォームに直接パラメータを注入し、予期しないフィールドを変更する可能性があります。これはデータの破壊や、セキュリティの侵害に繋がる可能性があります。
例えば、google chromeの開発者ツールよりHTMLを操作して、名前やメアドなどを簡単に書き換えてしまうことができます。
なので、Strong Parametersを適切に設定することで、Railsはリクエストされたパラメータをチェックし、許可されたフィールドのみを更新します。これにより、上記のような管理者フラグを含む重要なデータを不正に操作されるリスクを防ぐことができます。
strong-parameter-1024x576.png

具体的なコードとその解説について

スクリーンショット 2023-07-06 20.31.06.png

・まず上記のコードはRailsのStrong Parametersを使用してユーザーデータの更新を制御しているコードです。

では順に解説にしていきます。

1.User.find(params[:id]).update(user_params):ここでは、まずparams[:id]を使って特定のユーザーをデータベースから見つけ出します。

2.update(user_params)を呼び出すことで、このユーザーの情報を更新します。
(※)user_paramsは次に説明するStrong Parametersによるフィルタリングメソッドです。

3.params.require(:user).permit(:name, :email):この行がStrong Parametersの本質的な部分です。require(:user)は送られてきたパラメータの中に:userというキーが存在することを確認します。存在しない場合はエラーが発生します。

4.permit(:name, :email)は:userの下のパラメータの中で、:nameと:emailのみを許可します。これにより、これら以外のパラメータ(例えば:adminフラグなど(※1))が送られてきた場合でも、それらは無視されます。
(※1)adminフラグとはユーザーが管理者(admin)かどうかを示すフィールドのことです。もし、誤って操作されると、ユーザーが不正に管理者権限を得るリスクがあるため、更新は厳重に制御される必要があります。

このように、Strong Parametersを使用することで、許可されたパラメータのみを安全に受け取ることができ、意図しないデータの更新を防ぐことができます。

コード中にあるprivateはメソッドがそのクラス内からのみ呼び出せるようにする指定子です。つまり、そのクラスの外部からはアクセスできません。
例えば、privateキーワードの下で定義したメソッドは、そのクラス自身やサブクラスから呼び出すことができますが、クラスの外部から直接呼び出すことはできません。これにより、メソッドの利用範囲を制限して、コードの安全性と整理を保つことができます。
Railsのコントローラーでは、内部でのみ使用するメソッド(たとえば、パラメータの処理など)をprivateとして定義するのが一般的です。

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