今回はbreakmanで「Potentially dangerous key allowed for mass assignment」という警告が出た際の原因とその解決方法についてまとめたいと思います。セキュリティ的に危険なキーの名称が存在するため、DB設計の際は注意した方が良さそうです。
breakmanはSQLインジェクションといった脆弱性を検知してくれるgemになります。
↓ ↓ ↓
警告内容
== Warnings ==
Confidence: Medium
Category: Mass Assignment
Check: PermitAttributes
Message: Potentially dangerous key allowed for mass assignment
Code: params.require(:register).permit(:role)
File: app/controllers/registers_controller.rb
Line: 14
どうやら以下のストロングパラメーターのコードに対して警告が出ているようです。
params.require(:register).permit(:role)
原因
この警告はroleというキーをpermitしていることが原因になります。
roleの他には「admin/account_id/banned」も警告対象のようです。
require 'brakeman/checks/base_check'
class Brakeman::CheckPermitAttributes < Brakeman::BaseCheck
Brakeman::Checks.add self
@description = "Warn on potentially dangerous attributes allowed via permit"
SUSPICIOUS_KEYS = {
admin: :high,
account_id: :high,
role: :medium,
banned: :medium,
}
# 省略
解決方法
解決方法としては以下の2つです。
- 警告対象のカラムを別名に変更する
- config/brakeman.ignoreに設定を追加する
1. 警告対象のカラムを別名に変更する
基本的にはカラム名を別名に変更することで警告を回避します。
roleがダメであればabilityやduty等に変更しましょう。
2. config/brakeman.ignoreに設定を追加する
カラム名の変更が一番の方法ですが、やむを得ず警告対象のカラム名を使用しなければならない場合は、config/brakeman.ignoreに警告を無視する設定を追加しましょう。
設定の追加は「% bundle exec breakman -I」で行うことができます。
% bundle exec brakeman -I
Checks finished, collecting results...
Filtering warnings...
Input file: |config/brakeman.ignore| Enterキーを押下
No such file. Continue with empty config? yを入力しEnterキーを押下
1. Inspect all warnings
2. Hide previously ignored warnings
3. Prune obsolete ignored warnings
4. Skip - use current ignore configuration
? 1を入力しEnterキーを押下
Confidence: Medium
Category: Mass Assignment
Check: PermitAttributes
Message: Potentially dangerous key allowed for mass assignment
Code: params.require(:register).permit(:role)
File: app/controllers/registers_controller.rb
Line: 14
Action: (i, n, k, u, a, s, q, ?)
iを入力しEnterキーを押下
Actionの内容は以下になります。
i - Add warning to ignore list
n - Add warning to ignore list and add note
s - Skip this warning (will remain ignored or shown)
u - Remove this warning from ignore list
a - Ignore this warning and all remaining warnings
k - Skip this warning and all remaining warnings
q - Quit, do not update ignored warnings
? - Display this help
まとめ
- breakmanはSQLインジェクションといった脆弱性を検知してくれるgem
- Potentially dangerous key allowed for mass assignmentは、role/admin/account_id/bannedという名前のキーをpermitすることで発生する
- 警告対象のカラムを別名に変更する、もしくはconfig/brakeman.ignoreに設定を追加することで解決できる
参考
今回はbreakmanで「Potentially dangerous key allowed for mass assignment」という警告が出た際の原因とその解決方法についてまとめました。breakmanは脆弱性を検知してくれるgemのため、警告を無視するのではなく基本的には従うようにするべきですね。