LoginSignup
1
0

More than 3 years have passed since last update.

Strong Parametersについて調べてみた

Posted at

Strong Parametersとは…

ざっくりいうとWeb上から、取得したパラメータ(外部から入ってくる値)
DB(データベース)にはいる前に安全なデータかを検証した上で、
取得する仕組み
のこと!Rails4から実装されている

想定どおりのパラメータかどうかをホワイトリスト方式
チェックする機能のこと

Strong Parametersの効果

strong parametersを用いることで、

Action Controllerのパラメータが許可されるまで
Active Modelの「マスアサインメント」に利用されることを禁止できます。

多くの属性を一度に更新したい場合は、
どの属性のマスアップデートを許可するかを開発者が明示的に指定しなければならない

大雑把にすべての属性の更新を一括で許可してしまうと、
外部に公開する必要のない属性まで誤って公開してしまう可能性が生じるため、
そのような事態を防ぐための機能

Strong Parametersが実装される前…

実際に意図しないデータの登録・更新が発生していた事例が
多数あったよう

例)パラメーターに「admin」属性を付与してあげれば
管理者権限を取得することが簡単にできてしまい
なりすましが可能となったりした

Strong parametersを用いることで…
パラメータが許可されるまでモデルの「マスアサインメント」に

利用されることを禁止できる。

マスアサインメントとは、

フォームから送信されたデータを、
そのままチェックせずにデータベースに登録することをいう

例)
rb
Person.new(name: 'test', age: 20)
person.update(name: 'test name', age: 21)

DBの更新系処理で複数のカラムを一括で指定できる

不適切なデータを判断せずに、登録ができてしまっては、まずい

Strong parametersの使い方

def user_params
  params.require(:キー(モデル名)).permit(:カラム名1).merge(カラム名: 入力データ)
end

例) Userモデルのname, ageカラムのみを受け取る場合

def user_params
  params.require(:user).permit(:name, :age)
end

カラム名は複数入力することも可能

「require」メソッド

「require」メソッドを使用することで、

受け取る入力必須のパラメータ群を指定することができる
params内の特定のキーに紐付く値だけをとる事が可能となる
そのため、引数には取り出したい値のキーを指定する必要があります

「permit」メソッド

「permit」メソッドを使用することで、

利用可能な許可された値のパラメータ名を指定することができる

permitメソッドの引数には、登録を許可する全てのカラム名を指定しておく
必要がある。もし、許可されいないカラムがparams内に存在したとき、
そのデータは取得されず無視されてしまうので注意が必要

まとめ

  • ストロングパラメータは、マスアサインメント機能の脆弱性問題を回避するために作られた機能である
  • 「require」メソッドで受け取るカラム名を、「permit」メソッドで許可するパラメーター名を指定することができる

参考リンク

1
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
1
0