0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rails入門: ストロングパラメーターでセキュリティを強化する

Last updated at Posted at 2023-06-17

はじめに

今回は、ストロングパラメーターについて学習したことを備忘録として記事にした。

ストロングパラメーターとは

マスアサインメント攻撃を防ぐために使われている。
ストロングパラメーターを利用することで、パラメーターから値を取得する際に取得可能なデータを指定することができる。

マスアサインメント攻撃とは

設計者の意図に反してデータベースの複数の値を一度に更新させる攻撃のこと。
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リクエストでデータを受け取る方法を調べたところ、どうやらすトロングパラメーターという仕組みを使う必要があるとわかったので、備忘録として記事にした。ストロングパラメーターが生まれた背景も理解しておく必要があると感じた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?