[Rails] ransackを4.0.0にupdateしたときにハマったこと

2023/05/14

Rails
ransack

こんにちは。

今回は小ネタという感じなのですが、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 a ransackable_attributes class method in your User
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 a ransackable_associations class method in your User
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だなあと個人的には感じました。

今回はこのあたりで。