この記事の目的
現在学習中の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
があった場合、不正にお気に入りのカウントを追加できてしまう。
どうやって防ぐか
メソッドにあらかじめ登録・更新を許可するカラム名を指定(ホワイトリスト形式)しておきます。
そうすることで、万が一、未許可のカラムデータが送られてきても、データの登録前に未許可であることを検出し、登録対象として無視することができます。
ストロングパラメータ実装
- privateメソッド:配下に記述したメソッドは、クラス外からのアクセスができません。基本的に、クラス外からのアクセスをさせないようにprivateメソッド配下に書く。
- メソッド名:基本的には[ モデル名_params ]とする
- requireメソッド:params内の特定のキーに紐付く値だけを抽出する事ができる。引数には取り出したい値のキーを指定する
- permitメソッド:許可された値のみを取得することができる。引数には登録を許可する全てのカラム名を指定しておく必要
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で取り出したキーの中から、さらに取得したいキーのみを指定するメソッド。