Prevenindo serialização acidental de modelos ActiveRecord

Introduzimos um patch para evitar a serialização acidental de modelos ActiveRecord sem especificar os campos a serem serializados. Essa alteração garante que controlamos quais campos são incluídos, evitando problemas potenciais com a exposição de dados incompletos ou excessivos.

Por padrão, renderizar um modelo ActiveRecord como JSON inclui todos os atributos, o que pode não ser desejável em muitos casos. Para impor melhores práticas, precisamos especificar quais campos devem ser serializados.

Exemplos de Uso

Uso Incorreto:

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

Em desenvolvimento e testes, isso resultará em:

ActiveRecordSerializationSafety::BlockedSerializationError:
Serializar modelos ActiveRecord (User) sem especificar campos não é permitido.
Use um Serializador ou passe a opção :only para #serializable_hash. Mais informações: https://meta.discourse.org/t/-/314495
./lib/freedom_patches/active_record_disable_serialization.rb:15:in `serializable_hash'

Uso Correto:

  1. Usando um Serializador
class UserSerializer < ApplicationSerializer
  attributes :id, :email
end

def show
  @user = User.first
  render json: @user, serializer: UserSerializer
end
  1. Usando a opção :only
def show
  @user = User.first
  render json: @user.as_json(only: [:id, :email])
end

Este documento é controlado por versão - sugira alterações no github.

6 curtidas

Apenas para esclarecer para aqueles que possam encontrar isso, isso significa que todos os usos dos métodos de serialização em ActiveModel::Serialization, por exemplo, as_json, independentemente do contexto (incluindo em testes), resultarão em um erro, a menos que você passe a opção only. Veja mais em

Para um exemplo, veja:

5 curtidas

Uma postagem foi dividida em um novo tópico: Ajuda com novas proteções de serialização

Bem, levou 21 dias, mas finalmente entendi o que você disse aqui no seu código vinculado, em pelo menos um contexto, e espero que o outro mencionado no tópico dividido acima. Este último parece mais difícil (pelo menos na minha memória), já que não sei exatamente onde está o problema.

Obrigado por salvar o dia (ou pelo menos este dia). :beers:

O outro problema foi que meu modelo server incluía o modelo user e eu precisava chamar o serializador do usuário (ou limitar os campos) do modelo do usuário no meu serializador do servidor.

Aconteceu que eu não precisava de nenhum modelo de usuário no meu modelo de servidor (o user_id já estava lá, e há uma chance razoável de que eu nem precise disso).

1 curtida