防止 ActiveRecord 模型的意外序列化

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

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

用法示例

错误用法:

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

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

ActiveRecordSerializationSafety::BlockedSerializationError:
不允许在未指定字段的情况下序列化 ActiveRecord 模型 (User)。
请使用 Serializer,或将 :only 选项传递给 #serializable_hash。更多信息: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 个赞