LoginSignup
1
0

More than 1 year has passed since last update.

Railsのparamsとストロングパラメータ

Last updated at Posted at 2023-02-22

この記事の目的

現在学習中のRailsについての理解とアウトプット、振り返り用
Railsのparamsとストロングパラメータについて記載しています。

paramsとは

paramsとはRailsで送られてきた値を受け取るためのメソッドになります。
送られてくる情報(リクエストパラメータ)は主に、getのクエリパラメータとPostでformを使って送信されるデータの2つです。

基本的には下記の記載で値を受け取ることができます。

params[:カラム名]

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

Mass Assignment脆弱性の対策として、開発者が指定したキーを持つパラメーターのみを受け取れるように制限するもの。
簡単にいうとフォームから入力された情報を指定して、安全に受け取るための仕組みです。設定しておくことにより不正な情報を受け取ることを防ぎます。

Mass Assignment脆弱性とは

悪意あるユーザーにより、Webブラウザ上において手作業などでパラメータを書き換えられ、開発者の意図しないデータの登録・更新(例えば、管理者を識別するためのカラム内データの改竄など)が行われてしまう脆弱性です。

なぜ使う,何のために使う必要があるのか

投稿フォームに入力された情報はparamsによって取得できるのですが、
その際、不正に投稿された内容がparamsに含まれているとその情報まで保存されてしまいます。

簡単にいうと意図しない(安全では無い)データの登録・更新を防いでくれる。

例えば下記のようにQuestionを作成できるフォームがあったとしてquestion[name]の部分をquestion[like]に検証ツールで変更して、Create Questionボタンを押下しフォームを送ると本来は

"question"=>{"title"=>"タイトルです", "name"=>"99999", "content"=>"テキストです"}

と送られ"title", "name", "content"カラムが登録されるが、question[like]に変更されると

"question"=>{"title"=>"タイトルです", "like"=>"99999", "content"=>"テキストです"}

が送られlikeカラムがある場合、意図しないlikeが登録されてしまう。
質問にお気に入りみたいなカラムでlikeがあった場合、不正にお気に入りのカウントを追加できてしまう。
strongparams.png

どうやって防ぐか

メソッドにあらかじめ登録・更新を許可するカラム名を指定(ホワイトリスト形式)しておきます。
そうすることで、万が一、未許可のカラムデータが送られてきても、データの登録前に未許可であることを検出し、登録対象として無視することができます。

ストロングパラメータ実装

  • privateメソッド:配下に記述したメソッドは、クラス外からのアクセスができません。基本的に、クラス外からのアクセスをさせないようにprivateメソッド配下に書く。
  • メソッド名:基本的には[ モデル名_params ]とする
  • requireメソッド:params内の特定のキーに紐付く値だけを抽出する事ができる。引数には取り出したい値のキーを指定する
  • permitメソッド:許可された値のみを取得することができる。引数には登録を許可する全てのカラム名を指定しておく必要
questions_controller.rb
    def create
        # Questionモデルを初期化
        @question = Question.new(question_params)
        # QuestionモデルをDBへ保存
        @question.save
    end
    private
    def question_params
        # params.require(:キー(モデル名)).permit(:カラム名1,:カラム名2,・・・)
        params.require(:question).permit(:title, :name, :content)
    end

ストロングパラメータまとめ

  • ストロングパラメーター:データベースに保存するカラムを指定し、paramsで安全な情報を受け取らせる仕組みのこと。
  • パラメーター:リクエストに含まれて外部から渡されるデータ、情報のこと。
  • params:パラメーターをハッシュ構造で格納している箱のようなもの。
  • require:params内のモデルに特定のキーに紐付く値のみを取り出すメソッド。
  • permit:requireで取り出したキーの中から、さらに取得したいキーのみを指定するメソッド。
1
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
1
0