ストロングパラメーターとは何者なのか


初めまして、Sayu_2021と申します。
本日より不定期ですが投稿をしていきたいと思います。
最初なので、冒頭で自己紹介をさせてください。

経歴

項目 詳細
年齢 もうすぐ30歳
学歴  私立大学 法学部卒業
経歴 塾講師 → 情報システム部 → プログラミングスクール → SESに転職
学習した言語 HTML, CSS, Ruby, Ruby on Rails, javascript
学習したクラウドサービス AWS, heroku

目標

過去の仕事において、自信を持って仕事をするということが出来なかったので、目に見える成果を出すためにも何らかの資格を取得したいと思います。
Qiitaの目標は、自身の経験・学習した内容を元に、同じ年代の未経験からプログラミングを始める人の助けになる記事を1つでも多く投稿をすることです。

さてここからは本題になります。

ストロングパラメーターとは何者なのか

自身のストロングパラメーターに対しての認識があやふやだなと感じたので、改めてアウトプットをすることで整理をしたいと思います。

ストロングパラメーターとは?

端的に言うとpermitメソッドを使用して変更の許可を得たデータのことです。
permitメソッドがホワイトリストのような役割をしていて、それを通過したデータをストロングパラメーターと呼んでいると私は捉えています。

railsガイドでは以下の説明がなされています。

【Railsガイド(一部引用)】
https://railsguides.jp/action_controller_overview.html#strong-parameters

strong parametersを用いることで、Action Controllerのパラメータが許可されるまでActive Modelの「マスアサインメント」に利用されることを禁止できます。つまり、多くの属性を一度に更新したい場合は、どの属性のマスアップデートを許可するかを開発者が明示的に指定しなければなりません。大雑把にすべての属性の更新を一括で許可してしまうと、外部に公開する必要のない属性まで誤って公開してしまう可能性が生じるため、そのような事態を防ぐための機能です。

4.5.1 許可済みスカラー値
以下の例で説明します。

params.permit(:id)
:idキーがparamsにあり、それに対応する許可済みスカラー値に:idキーがあれば、ホワイトリストチェックをパスします。この条件を満たさない場合は、:idキーはフィルタで除外されます。これにより、外部からハッシュなどのオブジェクトを不正に注入できなくなります。

ただ、初心者には理解が厳しかったので、少しずつ読み解いてみます。

まず前提として、Ruby on Railsでは「マスアサインメント」という機能が用意されています。
この機能はDBに変更を加える際に複数のカラムを一括で指定をすることが出来ます。
一回の指示で複数のカラムを書き換えることができるのはとても便利なように思えます。

ですが、この便利な機能を利用して、不正に混入したデータまで一括指定してしまい、変更を加えられてしまうという脆弱性が発見されてしまったのです。
自分の作成したアプリが全く知らない人から大切なデータが書き換えられたり、場合によっては管理者権限で勝手にログインをされてしまったりするかもしれないと考えると、とても怖いことですよね。

実際にどんなふうに書き換えられてしまうのか、わかりやすく試してくださった方の記事がありますのでリンクを掲載させて戴きます。

【pikawaka ストロングパラメーターとは】
https://pikawaka.com/rails/permit#%E3%82%B9%E3%83%88%E3%83%AD%E3%83%B3%E3%82%B0%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%A8%E3%81%AF

この脆弱性を回避するために生み出されたものが、「ストロングパラメーター」と言うものなのです。
ストロングパラメーターはRuby on Railsのバージョン4から追加された機能になります。

通常、フォームなどからデータが送られる際にはparamsと言うハッシュの中に格納されて送られてきます。
このparamsと言うハッシュの中身に対して、「permitメソッド」で特定のデータにだけ変更の許可を与えます。
変更の許可を与えられたデータのことをストロングパラメーターと呼んでいます。

permitメソッドの使い方

permitメソッドで許可をしないとDBにデータを保存・変更ができません。

binding.pryで挙動を止めてparamsの中身を見てみると、一番最後にpermitted: falseの文字が見えます。

この部分がtrueにならないと保存ができないような仕様となっています。
なので、permitメソッドを使ってこれをtrueに変更しなければなりません。

設定方法は簡単でデータが送られてくるcontrollerに許可設定をしてあげるためのメソッドを記載してあげます。
例えばItemsコントローラーのcreateアクションに送られてくるデータを保存したい時には以下の通りになります。

class ItemsController < ApplicationController

  def create
    @item.create(items_params)
  end

  private

  def items_params
    params.permit(:保存したいカラム名)
  end

end

privateの下に設定をしたitem_paramsと言う処理が完了したときに、permitted: trueとなり、初めてDBに保存ができるようになります。

ここから更にrequireやmergeと言うメソッドも登場するのですが、本日はストロングパラメーターとは何かと言う点にだけ焦点を当てたかったので、ここまでにしたいと思います。
記事を読んでくださってありがとうございました。

・ここの解釈違うよ!
・初心者ならこの本を読むと理解が深まるよ!
といったことがございましたらコメントでいただけると励みになります。
(専門用語が苦手なため、コメントを頂いて読み解くまでにお時間が掛かると思いますが、温かい目で見ていただけるとありがたいです…)

新参者ですが、何卒よろしくお願い致します。