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

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

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

Ejemplos de Uso

Uso Incorrecto:

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

En desarrollo y pruebas, esto resultará en:

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'

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