お疲れ様です。プログラミング学習中のくろちゃんです。
今回は当たり前のように使ってるんだけど、とても重要であるストロングパラメーターについて簡単にまとめてみようと思います。
ストロングパラメーターとは
Railsガイドより
Action ControllerのStrongParametersは、明示的に許可されていないパラメータをActive Modelの「マスアサインメント(mass-assignment: 一括代入)」で利用することを禁止します。したがって、開発者は、どの属性でマスアップデート(mass-update: 一括更新)を許可するかをコントローラで必ず明示的に宣言しなければなりません。strong parametersは、ユーザーがモデルの重要な属性を誤って更新してしまうことを防止するためのセキュリティ対策です。
私には難しいと感じる言葉も使われていますが、セキュリティ対策ということはしっかりと分かりました。
これをもう少しわかりやすく言い換えてみます。
ストロングパラメーターはフォームなどから送られてきたデータを勝手にまとめて保存することを禁止している。
そのため、開発者はどのカラムだけ更新するかを指定しておかなければならない。
ユーザーがモデルの重要なカラムを誤って更新してしまうことを防止するためのセキュリティ対策
のようになるでしょうか。
私の作成中のアプリのコードで説明します。
送信されるデータ
次のようなフォームがあったとします。
<%= form_with model: @praise, local: true, html: { multipart: true, id: "praiseForm" } do |f| %>
<%= f.file_field :audio, id: "audioInput", class: "hidden-audio" %>
<% end %>
このフォームはユーザーが録音した音声ファイルをaudioにアップロードしています。
そうすると、サーバーに送られるパラメーターはこんな形になります。(chat GPT)
params = {
praise: {
audio: <アップロードしたファイル>
}
}
ストロングパラメーター
def praise_params
params.require(:praise).permit(:audio)
end
・require(:praise)
paramsの中にpraiseというキーがあるかチェック。
→もしなければエラーになる。
・permit(:audio)
praiseの中で許可されたカラムだけ取り出す。(今回は:audio)
→つまり、ユーザーがaudio以外の値(user_idなど)を送っても無視される。
user_idは誰が投稿したかを示すカラムです。
もしストロングパラメーターを使わずにparams[:praise]をそのまま保存すると、ユーザーが開発者ツールなどで自分以外のuser_idを送信して、他人のアカウントに紐づけて投稿できてしまう可能性があります。
現在私が作成しているアプリはログイン機能はなく、ニックネームのみでアプリの使用ができ、好きなニックネームを登録できるようになっているため、このパターンは当てはまりませんが、掲示板アプリ等では重大な問題となります。
まとめ
・フォームから送られたデータはparams[:praise]に入る
・ストロングパラメーターで安全な値だけ取り出す
・取り出した値を保存する
最後に
セキュリティに関わる大変重要なポイントです。
アプリ開発をする上で曖昧な理解で進むわけにはいかないポイントだと改めて認識しました。
今回のストロングパラメーターに関わらず、1行1行のコードの意味をしっかりと理解しておかなければ、自分の気づかないところでセキュリティやユーザー体験に不備が起こることも分かりました。
気をつけていきましょう!!!