🐷

ストロングパラメータの重要性

に公開

ストロングパラメータって実はよく分かってない人多いかも?

ストロングパラメータってなんとなく使ってたり、「とりあえずpermit書いとけ」みたいなノリでやってる人、実は結構多いんじゃないでしょうか。

正直、僕も最初は「チュートリアルに出てきたから真似してるだけ」って感じでした。

今回は、なんでストロングパラメータが必要なのか?
もしなかったらどう困るのか?
Rails初心者の僕なりに、分かりやすくまとめてみます。


そもそもストロングパラメータって何?

Railsでform作ってて、controllerにこんなやつ↓

params.require(:user).permit(:name, :email)

これ、とりあえず書いてる人、絶対多いはず。
でも、本当の意味とか、何が守られてるのか
わかってないと大変なことになります


実はF12で値を好き放題いじれる

ブラウザのF12キー(開発者ツール)で
inputの値とか、hidden項目とか、なんでも書き換えられちゃいます。
例えば、本来フォームに出してないはずの
is_admin ってカラムがもし送信できちゃうと

<input type="hidden" name="user[is_admin]" value="false" />

これを

<input type="hidden" name="user[is_admin]" value="true" />

にしちゃって送信したら、そのまま管理者アカウントになっちゃうとか普通に起きます。

ストロングパラメータがないと、どうなるか?

もしストロングパラメータを書かずに

@user.update(params[:user])

みたいに paramsを全部丸ごとモデルに渡してたら
hiddenや書き換えた値もそのままDBに保存される。
= つまり 「誰でも管理者化できるし、全部やりたい放題」 ってことなんです

ストロングパラメータで守る

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

みたいに書くことで、
nameemailだけしか通さない!
他は全部捨てる!
という「サーバー側の門番」になってるんです

まとめ

  • Railsで受け取るパラメータは、絶対に信用しちゃダメ
  • F12(開発者ツール)で、なんでも書き換え放題だから
  • ストロングパラメータで「通していい値だけ」許可するのが超大事
  • なんとなくpermitしてるだけだと、普通に事故る

Discussion