ActiveRecordモデルの意図しないシリアライズを防ぐ

パッチを適用し、フィールドを指定せずにActiveRecordモデルを誤ってシリアライズすることを防止しました。この変更により、どのフィールドを含めるかを制御し、不完全または過剰なデータが公開される潜在的な問題を回避できます。

デフォルトでは、ActiveRecordモデルをJSONとしてレンダリングすると、すべての属性が含まれますが、これは多くの場合望ましくありません。より良いプラクティスを強制するために、シリアライズする必要があるフィールドを指定する必要があります。

使用例

誤った使用法:

def show
  @user = User.first
  render json: @user
end

開発環境およびテストでは、これは次のようになります。

ActiveRecordSerializationSafety::BlockedSerializationError:
フィールドを指定せずにActiveRecordモデル(User)をシリアライズすることは許可されていません。
Serializerを使用するか、#serializable_hashに:onlyオプションを渡してください。詳細:https://meta.discourse.org/t/-/314495
./lib/freedom_patches/active_record_disable_serialization.rb:15:in `serializable_hash'

正しい使用法:

  1. Serializerを使用する
class UserSerializer < ApplicationSerializer
  attributes :id, :email
end

def show
  @user = User.first
  render json: @user, serializer: UserSerializer
end
  1. :onlyオプションを使用する
def show
  @user = User.first
  render json: @user.as_json(only: [:id, :email])
end

このドキュメントはバージョン管理されています - githubで変更を提案してください。

「いいね!」 6

念のため、この状況に遭遇する可能性のある方のために明確にしておきます。これは、ActiveModel::Serialization のすべてのシリアライゼーションメソッド、例えば as_json が、コンテキスト(スペック内を含む)に関わらず、only オプションを渡さない限りエラーになることを意味します。詳細は以下をご覧ください。

例については、以下をご覧ください。

「いいね!」 5

投稿が新しいトピックに分割されました: 新しいシリアライゼーション保護に関するヘルプ

21日かかりましたが、ようやくここでリンクされたコードで、少なくとも1つのコンテキストで、そして上記で言及された分割トピックで言及されているもう1つのコンテキストでも、あなたの言ったことを理解できました。後者はより難しいようです(少なくとも私の記憶では)、問題がどこにあるのかよくわからないからです。

一日(少なくともこの日)を救ってくれてありがとう。:beers:

もう1つの問題は、私のserverモデルにuserモデルが含まれており、サーバーシリアライザーでユーザーシリアライザーを呼び出すか、ユーザーモデルのフィールドを制限する必要があったことでした。

結局、サーバーモデルにユーザーモデルのどれも必要ないことがわかりました(user_id_はすでにそこにあり、それさえも実際には必要ない可能性が高いです)。

「いいね!」 1