LoginSignup
4
2

More than 1 year has passed since last update.

Rails なんでストロングパラメータって必要なの?

Posted at

はじめに

Railsを学習し始めた際に、ストロングパラメータに出会ったが、解説記事などを読んでも、何故これが必要なのかが当時分からなかったが自分と今現在でいまいち重要性がわからない人向けの記事です。

def user_params
  params.require(:user).permit(:name, :email)
end

結論

ストロングパラメータは不正な情報の受け取り防止のために使用!!

と簡単に言えば上記になりますが、当時の自分にはこの説明ではピンとこなかったことを覚えています。。。

当時の自分が何故理解できなかったのか

この意味を理解できなかった最大の理由は、
そもそも入力フォームに記載しなければ受け取れないじゃん??
と思ったからだと思います。
しかし、そんなことは無いことを実際に誰でもできる方法にて解説いたします。

簡単にストロングパラメータのコードを説明

ストロングパラメータのコード詳しい解説は、他の記事にたくさんのっているため、ここでは簡単に説明します。

def user_params
  params.require(:user).permit(:name, :email)
end

image.png

ここで、ユーザー登録のケースで考えます。
上記フォームの入力にて送られてくるデータは以下になります。

{
"authenticity_token"=>"NQxL18oxz9ePkLv5VS_1a5b8-WEO1aFtEUDtDIAuxvlY_gD_w_2pPmWBjM0YLrwh7Q4-Os1Yv_aaNbYVMUUsaA", 
"user"=>{"name"=>"a", "email"=>"a"}, 
"commit"=>"Create User", 
"controller"=>"users", 
"action"=>"create"
}

上記はrailsではparamsと記載することで受け取ることが可能です。
しかし、userの登録には"user"=>{"name"=>"a", "email"=>"a"}のみで良いため、必要な部分だけを取り出すために、require(:user)を使用します。

params.require(:user)
{"name"=>"a", "email"=>"a"} # 受け取るデータ

上記でも必要なパラメーターは受け取れてはいますが、name、email以外は必要ないためpermit(:name, :email)を用いてそれしか受け取らないようにします。

params.require(:user).permit(:name, :email)}
{"name"=>"a", "email"=>"a"} # 受け取るデータ

params.require(:user).permit(:name)}
{"name"=>"a"} # nameのみにするとnameの値のみ抽出される

では何故permitが必要なのかを次以降で具体的に説明します。

ユーザー登録フォーム

下記テーブル構成にてデータが管理されていると仮定します。
下記adminは管理者権限を表しているものとします。
ここがtrueのユーザーは編集・削除権限などが与えられると仮定し、基本的にはfalseになるように設定している状況で新規ユーザー登録を行ってみます。

カラム名 デフォルト
name string -
email string -
admin boolean false

ここで、コントローラに記載しているストロングパラメータはadminも受け入れてしまっている状態にします。

def create
    @user = User.new(user_params)
    # 以下省略
end

def user_params
  params.require(:user).permit(:name, :email, :admin)
end

以下画像のフォームがあった際に登録ボタンを押すと

image.png
【結果】
image.png
adminは問題なくfalseとなっている。

ユーザー登録フォームの改ざん

ここでそもそも入力フォームに記載しなければ受け取れないじゃん??の当時の自分の疑問を解決します。
実はChromeの開発者ツールより、新たなフォームを作成することが可能のため、admin用のフォームを作成し送信することが可能となります。

image.png
上記画面で右クリックし、”Edit as HTML”を選択すると、HTMLを挿入できるので、以下を挿入すると。。。

<input type="checkbox" value="1" name="user[admin]" id="user_admin">

image.png

チェックボックスを画面上に表示することが可能となります。
実際にチェックし、送信ボタンを押すと。。。
image.png
【結果】
image.png
adminがtrueの状態で保存が可能!!!

適切にpermitを記載していた場合

ストロングパラメータからadminを消し同様の動作を行ってみます

def user_params
  params.require(:user).permit(:name, :email)
end

image.png
【結果】
image.png

想定外のデータは受け取れない設定になっているため、adminはfalseにて設定されます。

結論

ストロングパラメータは不正な情報の受け取り防止のために使用!!

上記の意味がこの記事で少しでも分かりやすくなっていれば幸いです!

4
2
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
4
2