Empêcher la sérialisation accidentelle des modèles ActiveRecord

Nous avons introduit un correctif pour empêcher la sérialisation accidentelle des modèles ActiveRecord sans spécifier les champs à sérialiser. Ce changement garantit que nous contrôlons les champs inclus, évitant ainsi les problèmes potentiels d’exposition de données incomplètes ou excessives.

Par défaut, le rendu d’un modèle ActiveRecord au format JSON inclut tous les attributs, ce qui peut ne pas être souhaitable dans de nombreux cas. Pour appliquer de meilleures pratiques, nous devons spécifier quels champs doivent être sérialisés.

Exemples d’utilisation

Utilisation incorrecte :

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

En développement et dans les tests, cela entraînera :

ActiveRecordSerializationSafety::BlockedSerializationError:
La sérialisation des modèles ActiveRecord (User) sans spécifier les champs n'est pas autorisée.
Utilisez un Serializer, ou passez l'option :only à #serializable_hash. Plus d'informations : https://meta.discourse.org/t/-/314495
./lib/freedom_patches/active_record_disable_serialization.rb:15:in `serializable_hash'

Utilisation correcte :

  1. Utilisation d’un Serializer
class UserSerializer < ApplicationSerializer
  attributes :id, :email
end

def show
  @user = User.first
  render json: @user, serializer: UserSerializer
end
  1. Utilisation de l’option :only
def show
  @user = User.first
  render json: @user.as_json(only: [:id, :email])
end

Ce document est sous contrôle de version - suggérez des modifications sur github.

6 « J'aime »

Pour clarifier pour ceux qui pourraient rencontrer cela, cela signifie que toutes les utilisations des méthodes de sérialisation dans ActiveModel::Serialization, par exemple as_json, quel que soit le contexte (y compris dans les specs), entraîneront une erreur à moins que vous ne passiez l’option only. Voir plus loin

Pour un exemple, voir :

5 « J'aime »

Un message a été divisé dans un nouveau sujet : Aide avec les nouvelles protections de sérialisationd

Eh bien, il m’a fallu 21 jours, mais j’ai finalement compris ce que vous avez dit ici dans votre code lié, dans au moins un contexte, et j’espère que l’autre mentionné dans le sujet divisé ci-dessus. Celui-ci semble plus difficile (de mémoire, en tout cas) car je ne sais pas exactement où se situe le problème.

Merci d’avoir sauvé la situation (ou du moins cette journée). :beers:

L’autre problème était que mon modèle server incluait le modèle user et j’avais besoin d’appeler le sérialiseur utilisateur (ou de limiter les champs) du modèle utilisateur dans mon sérialiseur serveur.

Il s’est avéré que je n’avais besoin d’aucun des modèles utilisateur dans mon modèle serveur (user_id_was était déjà là, et il y a une bonne chance que je n’en ai même pas vraiment besoin).

1 « J'aime »