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

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

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

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

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

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

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

```ruby
def user_params
  params.require(:user).permit(:name, :email)
end
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106668/06c4eb24-d138-b4a1-f270-8246e2592551.png)

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

```ruby
{
"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)```を使用します。

```ruby
params.require(:user)
{"name"=>"a", "email"=>"a"} # 受け取るデータ
```
上記でも必要なパラメーターは受け取れてはいますが、name、email以外は必要ないため```permit(:name, :email)```を用いてそれしか受け取らないようにします。

```ruby
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も受け入れてしまっている状態にします。

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

def user_params
  params.require(:user).permit(:name, :email, :admin)
end
```
以下画像のフォームがあった際に登録ボタンを押すと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106668/61ce7670-e1fc-44b7-9d0e-547f190ddb9f.png)
【結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106668/f2dcaf0f-8258-61c3-8546-79d9434f1e88.png)
adminは問題なくfalseとなっている。
#ユーザー登録フォームの改ざん

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106668/8976e8f8-8f6c-e732-d765-9fe690de31c2.png)
上記画面で右クリックし、”Edit as HTML”を選択すると、HTMLを挿入できるので、以下を挿入すると。。。

```html
<input type="checkbox" value="1" name="user[admin]" id="user_admin">
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106668/a897ff56-565b-3d14-dfe5-c7a1e8ae522c.png)

チェックボックスを画面上に表示することが可能となります。
実際にチェックし、送信ボタンを押すと。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106668/0f3ab53e-55f0-071e-d102-d184430f8ce0.png)
【結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106668/7863de86-a89b-4654-e547-a6f8a10b979f.png)
adminが```true```の状態で保存が可能！！！

# 適切にpermitを記載していた場合
ストロングパラメータからadminを消し同様の動作を行ってみます

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106668/f555e1f4-f8e5-3e10-d21b-d14bc945ee9e.png)
【結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106668/585ba199-e3d2-6a4d-1bd8-d2768af71831.png)

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

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

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