##はじめに
どうも、未経験からエンジニア転職を目指しているもきおです。
Railsでコントローラを記載する際に最後にストロングパラメータ書いてねって記載されてたりしますが、そもそも ストロングパラメータって何ぞや?って思いながらも当時はとりあえず動けばいっかみたいな感じであまり理解しないまま進めてしまってました。
ストロングパラメータの記載はこんな感じ
private
def user_params
params.require(:user).permit(:name,:email,:password)
end
今回はなんでこれが必要なのって話とparamsは使いようによってセキュリティの脆弱性があるよってお話をしていきたいと思います。
##ストロングパラメータを使わないとどうなる?
ストロングパラメータを使用しないとどのようなセキュリティ上の問題が起こるのでしょうか?
例えば以下の記載でuser_controllerのcreateを作成したとします。
private
def create
@user = User.new(params[:user])
end
一見前回のparamsの記事のようにparamsによってuserの値を全て取ってきてuserテーブルにユーザーの情報が情報が格納されるので問題ないように思えます。
※paramsに関しては前回書いた記事をご覧いただけますと幸いです。
しかし、ユーザー情報を全て格納されるというのは 極めて危険な状態です。
###セキュリティ上危険な例
実際の例を見てみましょう。User情報にadmin(管理者)属性を持たせたとしましょう。
admin=’1’という値をparams[:user]の一部に紛れ込ませて渡してしまえば、簡単に管理者属性を持たせる事ができてしまいます。これはcurlなどのコマンドを使えば簡単に実現できてしまいます。
※Railsチュートリアル7章ユーザー登録参照
https://railstutorial.jp/chapters/sign_up?version=6.0#code-first_create_action
悪意のあるユーザが自身に管理者権限を付与するなどシステムを自由に操作できてしまう危険性があるのです。
これを防ぐためにストロングパラメータによって特定の情報しか受け取らない設定を行い、意図しない登録、更新を防ぐ事ができるのです。
##実際にストロングパラメータを使用しよう
ストロングパラメータをの基本形は以下になります。
private
def create
@user = User.new(params[:user_params])
end
先程の[:user]→[:user_params]に変更しています。
これはストロングパラメータを使いやすくするために、user_paramsという外部メソッドを使うのが慣習になっています。このメソッドは適切に初期化したハッシュを返し、params[:user]の代わりとして使われます。
###ストロングパラメータ記述の仕方
private
def user_params
params.require(:キー(モデル名)).permit(:カラム名1,:カラム名2,・・・)
end
requireの後にモデル名、permitの後に受け取るカラム名を指定します。
これを元に最初に記述した
private
def user_params
params.require(:user).permit(:name,:email,:password)
end
これで受け取る情報を制限し、悪意のあるユーザーに余計な値(管理者権限等)を受け渡さないように セキュリティを強化できました。
##あとがき
今回はストロングパラメータについて理解を深めていきました。
この記事が少しでも良いと感じていただけましたらLGTMポチッといただけますと幸いです。