はじめに
今回は、ストロングパラメーターについて学習したことを備忘録として記事にした。
ストロングパラメーターとは
マスアサインメント攻撃を防ぐために使われている。
ストロングパラメーターを利用することで、パラメーターから値を取得する際に取得可能なデータを指定することができる。
マスアサインメント攻撃とは
設計者の意図に反してデータベースの複数の値を一度に更新させる攻撃のこと。
updateメソッドやnewメソッド、createメソッドなどでテーブルを更新する際にハッシュ形式のパラメータを受け取るが、これを悪用したもの。
例えば、Userモデルがname、email、adminという属性を持ち、adminは管理者フラグであり通常はユーザー自身が操作できない場合を想定する。
以下のパラメーターが送られてきたとする。
{
user: {
name: 'Alice',
email: 'alice@example.com',
admin: true
}
}
この場合に、以下のコードであれば、ユーザーに対して管理者権限を付与することが可能になってしまう。
User.create(params[:user]) # admin属性まで一緒に更新されてしまう
これを防ぐために、Railsではストロングパラメータという仕組みを用いて、更新を許可するデータを指定できるようになっている。
また、上記のコードを実行しても「ActiveModel::ForbiddenAttributesError」というエラーが起きるため実際に実行することはできない。
しかし、ブラウザの検証ツールを使うことで送信する値を変更することができてしまうため、ストロングパラメーターによって更新するデータを指定することはセキュリティ上重要である。
ストロングパラメーターの使い方
下記のデータが送信されるとする。
{
user: {
name: 'Alice',
email: 'alice@example.com',
admin: true
}
}
下記のようにストロングパラメーターを設定する
def create
@user = User.new(user_params)
if @user.save
# ...
else
# ...
end
end
private
def user_params
params.require(:user).permit(:name, :email)# ←ストロングパラメーター
end
privateメソッドとしてuser_paramsを作成。
requireメソッドでUserモデルを指定し、permitメソッドで許可するデータを指定している。
上記の設定によりnameとemailのみデータの更新が可能となる。
まとめ
POSTリクエストでデータを受け取る方法を調べたところ、どうやらすトロングパラメーターという仕組みを使う必要があるとわかったので、備忘録として記事にした。ストロングパラメーターが生まれた背景も理解しておく必要があると感じた。