防止 ActiveRecord 模型意外序列化

我们引入了一个补丁,以防止在未指定要序列化的字段的情况下意外序列化ActiveRecord模型。此更改确保我们控制包含哪些字段,避免了暴露不完整或过多数据的潜在问题。

默认情况下,将ActiveRecord模型渲染为JSON会包含所有属性,这在许多情况下可能不理想。为了强制执行更好的实践,我们需要指定应序列化的字段。

用法示例

错误用法:

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

在开发和测试中,这将导致:

ActiveRecordSerializationSafety::BlockedSerializationError:
Serializing ActiveRecord models (User) without specifying fields is not allowed.
Use a Serializer, or pass the :only option to #serializable_hash. More info: 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 天,我终于明白了你在链接代码中的意思,至少在一个上下文中是这样,而且希望也能在上面提到的拆分主题中提到的另一个上下文中。那个似乎更难(至少据我记忆所及),因为我不太清楚问题出在哪里。

感谢你拯救了这一天(或者至少是今天)。:beers:

另一个问题是我的 server 模型包含了 user 模型,而我需要在我的 server 序列化器中调用 user 序列化器(或限制 user 模型的字段)。

结果是我在 server 模型中不需要任何 user 模型(user_id 已经存在了,而且很有可能我甚至不需要它)。

1 个赞