Prevención de la serialización accidental de modelos ActiveRecord

Hemos introducido un parche para evitar la serialización accidental de modelos ActiveRecord sin especificar los campos a serializar. Este cambio asegura que controlamos qué campos se incluyen, evitando problemas potenciales con la exposición de datos incompletos o excesivos.

Por defecto, renderizar un modelo ActiveRecord como JSON incluye todos los atributos, lo cual puede no ser deseable en muchos casos. Para aplicar mejores prácticas, necesitamos especificar qué campos deben ser serializados.

Ejemplos de Uso

Uso Incorrecto:

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

En desarrollo y pruebas, esto resultará en:

ActiveRecordSerializationSafety::BlockedSerializationError:
No se permite la serialización de modelos ActiveRecord (User) sin especificar campos.
Utiliza un Serializador o pasa la opción :only a #serializable_hash. Más información: https://meta.discourse.org/t/-/314495
./lib/freedom_patches/active_record_disable_serialization.rb:15:in `serializable_hash'

Uso Correcto:

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

def show
  @user = User.first
  render json: @user, serializer: UserSerializer
end
  1. Usando la opción :only
def show
  @user = User.first
  render json: @user.as_json(only: [:id, :email])
end

Este documento está controlado por versiones - sugiere cambios en github.

6 Me gusta

Solo para aclarar para aquellos que puedan encontrar esto en la práctica, esto significa que todos los usos de los métodos de serialización en ActiveModel::Serialization, por ejemplo, as_json, independientemente del contexto (incluso en especificaciones), resultarán en un error a menos que pase la opción only. Ver más\n\n| (Array) - APIdock un ejemplo, ver:\n\nDEV: use of as_json without `only` no longer allowed · paviliondev/discourse-custom-wizard@247a3d5 · GitHub

5 Me gusta

Una publicación se dividió en un nuevo tema: Ayuda con nuevas protecciones de serializaciónd

Bueno, me tomó 21 días, pero finalmente entendí lo que dijiste aquí en tu código enlazado, al menos en un contexto, y espero que en el otro mencionado en el tema dividido anteriormente. Ese parece más difícil (al menos por mi memoria) ya que no sé exactamente dónde está el problema.

Gracias por salvar el día (o al menos este día). :beers:

El otro problema fue que mi modelo server incluía el modelo user y necesitaba llamar al serializador de usuario (o limitar los campos) del modelo de usuario en mi serializador de servidor.

Resultó que no necesitaba nada del modelo de usuario en mi modelo de servidor (el user_id ya estaba allí, y existe una posibilidad razonable de que ni siquiera lo necesite).

1 me gusta