こんにちは。
今回は小ネタという感じなのですが、ransackを4.0.0にupdateしたときにハマったことを紹介します。
こまめなbundle updateは大事ですが、地味なハマりポイントがちょくちょくあるのが厄介ですよね…
ransack 4.0.0のBreaking Changeについて
(ransackのGitHubページ)[https://github.com/activerecord-hackery/ransack/releases/tag/v4.0.0]に書かれているのですが、4.0.0でBreaking Changeがあります。
[SECURITY] Require explict allowlisting of attributes and associations
明示的にattributesとassociationsの許可リストを作成する必要があるということです。
これがないと以下のようなエラーが発生します
Ransack needs User attributes explicitly allowlisted as
searchable. Define aransackable_attributes
class method in yourUser
model, watching out for items you DON'T want searchable (for
example,encrypted_password
,password_reset_token
,owner
or
other sensitive information). You can use the following as a base:
class User < ApplicationRecord
# ...
def self.ransackable_attributes(auth_object = nil)
["created_at", "id", "updated_at"]
end
# ...
end
エラー文で具体例まで示してくれており非常に優しいですが、検索したいモデルにransackable_attributesメソッドを作成して、許可するカラムを追加する必要があります。
これと似たようなパターンで、ransackable_associationsメソッドも作成する必要があります。
Ransack needs HogehogeModel associations explicitly allowlisted as
searchable. Define aransackable_associations
class method in yourUser
model, watching out for items you DON'T want searchable (for
example,encrypted_password
,password_reset_token
,owner
or
other sensitive information). You can use the following as a base:
class User < ApplicationRecord
has_many :books
# ...
def self.ransackable_associations(auth_object = nil)
["books"]
end
# ...
end
こちらも先ほど同様、検索したいモデルにransackable_associationsメソッドを作成して、許可する関連を追加する必要があります。
めちゃくちゃ時間がかかったというわけではないのですが、ransackで検索をかけているモデルとそのrelationを辿っていく必要があったので、手間が多い対応になりました。
ついつい全てを許可したくなりますが、エラー文に書かれている通りパスワード関連やトークン関連などの秘匿情報は検索に引っかかるとまずいので、許可リストに追加しないようにしておきましょう。
ransackを使っているURLだと悪意のあるユーザーに気づかれると想定していないURLを叩かれる可能性があるので、セキュリティ的には必要なBreaking Changeだなあと個人的には感じました。
今回はこのあたりで。