はじめに
Railsで開発をする際に、セキュリティを高める方法のひとつとしてStrong Patamertersがあります。今回はStrong Patamertersの使い方について調べてみました。間違っている部分ありましたらご指摘いただければと思います。
Strong Patamertersとは
モデルの便利な機能に、複数の属性を一括代入できる機能があります。例えば次のようなコードではUserオブジェクトを生成する際に、nameとemailという2つの属性値を一括で代入しています。
> user = User.new(name: '田中太郎', email: 'taroutanaka@gmail.com')
もしこの機能がなければ、
> user = User.new
> user.name = '田中太郎'
> user.email = 'taroutanaka@gmail.com'
と書く必要があるので少々面倒ですね。
またコントローラーで受け取ったパラメーターの一部を次のように直接モデルに渡して複数の属性を一括で取り出すこともできます。
> user = User.new(params[:user])
しかしここにセキュリティ上の危険が潜んでいます。パラメーターに意図せぬ属性が紛れ込んでいるときに、想定外の属性についても登録・更新が行えてしまう問題が生じます。
例えば、Userには有料ユーザーか無料ユーザーを判別するpremiumフラグを持っているとします。このような場合、有料ユーザーでなくてもサーバーに送るリクエスト・パラメーターを加工して、premiumフラグが無課金になるようなリクエストを送ることが技術的には可能です。
これを防ぐためにはパラメーターのどの属性を許可してどの属性を許可しないのかを制御する必要があります。この時に利用できるのがStrong Parametersという機能です。
user_params = if user.premium
#specialは有料ユーザーのみ使える
params.require(:user).permit(:name, :email, :special)
else
params.require(:user).permit(:name, :email)
User.new(user_parmas)
これで許可しない属性情報を無視することができます。
おわりに
Raislには様々なセキュリティを高める機能が用意されています。開発者側がセキュリティを高める方法を理解し、安心して使えるサービスを作る必要がると思います。今後も勉強を続けて行きたいと思います。