はじめに
Railsを学習していて、
なぜ、Strong Parametersが重要なのか、マスアサインメントではなぜダメなのかを
整理したくて記事にしてます。
この記事を読むと分かること
- Strong Parametersがどういうものか分かる
- なぜ、マスアサインメントがダメなのかが分かる
Strong Parametersとは?
Strong Parametersは、Action ControllerのパラメータをActive Modelに
「マスアサインメント」で渡すことを良しとしない。
開発者側はアップデートしたいパラメータを、
Active Controllerで明示的に指定する必要がある。
要は、Active Controllerのアクションで本当に使用したいパラメータだけを
厳密に指定してモデルに渡してあげる事でより安全だよねというお話。
マスアサインメントではなぜ、ダメか?
まず、「マスアサインメント」 とは、
チェックされていないパラメータをまるごとモデルに保存する行為の事を言います。
以下のコードでは「マスアサインメント」でActive Modelにパラメータを渡しています。
# UserModelが 'name'と'email'を定義していた場合
# 以下でActiveModelに渡しているコードは...
@user = User.new(params[:user])
# 以下のコードとほぼ同じ
@user = User.new(name: "フォームから入力されたName", email: "フォームから入力されたEmail")
ではなぜ、「マスアサインメント」ではダメなのか?
渡ってきたパラメータを自動的にモデルに渡せるのは開発者側としては楽です。
ですが、パラメータチェックされていない部分を攻撃者に悪用される場合があり、
意図していないフォームのパラメータを密かに追加されてアプリケーションの整合性が
損なわれる可能性があります。
Strong Parameters の実装方法
requireメソッドとpermitメソッドで、
paramsから 取得してくるオブジェクト名 と どのキーを取得するか を指定してあげます。
事前にパラメータをチェックし、不正なパラメータを防いでくれます。
def create
@article = Article.new(article_params)
@article.save
redirect_to @article
end
# 外部から不正に呼び出されることが内容にprivate修飾子でカプセル化
# updateアクションでも再度利用できる
private
def article_params
params.require(:article).permit(:title, :text)
end
おわりに
Strong Parametersの概要やどういったものなのか
理解することが出来ました。
また、マスアサインメントではなぜダメなのかも理解することが重要だと思ったので
整理できてよかったです。
参考資料