Prevenire la serializzazione accidentale dei modelli ActiveRecord

Abbiamo introdotto una patch per impedire la serializzazione accidentale di modelli ActiveRecord senza specificare i campi da serializzare. Questa modifica garantisce che controlliamo quali campi sono inclusi, evitando potenziali problemi con dati incompleti o eccessivi che vengono esposti.

Per impostazione predefinita, la resa di un modello ActiveRecord come JSON include tutti gli attributi, il che potrebbe non essere desiderabile in molti casi. Per imporre migliori pratiche, è necessario specificare quali campi devono essere serializzati.

Esempi di utilizzo

Utilizzo errato:

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

In sviluppo e nei test, ciò comporterà:

ActiveRecordSerializationSafety::BlockedSerializationError:
La serializzazione di modelli ActiveRecord (User) senza specificare i campi non è consentita.
Utilizzare un Serializer o passare l'opzione :only a #serializable_hash. Maggiori informazioni: https://meta.discourse.org/t/-/314495
./lib/freedom_patches/active_record_disable_serialization.rb:15:in `serializable_hash'

Utilizzo corretto:

  1. Utilizzo di un Serializer
class UserSerializer < ApplicationSerializer
  attributes :id, :email
end

def show
  @user = User.first
  render json: @user, serializer: UserSerializer
end
  1. Utilizzo dell’opzione :only
def show
  @user = User.first
  render json: @user.as_json(only: [:id, :email])
end

Questo documento è controllato dalla versione - suggerisci modifiche su github.

6 Mi Piace

Solo per chiarire per coloro che potrebbero incontrare questo problema, ciò significa che tutti gli utilizzi dei metodi di serializzazione in ActiveModel::Serialization, ad esempio as_json, indipendentemente dal contesto (anche nelle specifiche), comporteranno un errore a meno che non si passi l’opzione only. Vedi ulteriormente

Per un esempio, vedi:

5 Mi Piace

Un post è stato diviso in un nuovo argomento: Aiuto con le nuove protezioni di serializzazione

Bene, ci sono voluti 21 giorni, ma finalmente ho capito cosa hai detto qui nel tuo codice collegato, almeno in un contesto, e spero anche nell’altro menzionato nell’argomento diviso sopra. Quest’ultimo sembra più difficile (almeno per quanto ricordo) dato che non so bene dove sia il problema.

Grazie per aver salvato la giornata (o almeno questa giornata). :beers:

L’altro problema era che il mio modello server includeva il modello user e avevo bisogno di chiamare il serializzatore utente (o limitare i campi) del modello utente nel mio serializzatore server.

Alla fine non avevo bisogno di nulla del modello utente nel mio modello server (l’user_id era già lì, e c’è una ragionevole possibilità che non mi serva nemmeno quello).

1 Mi Piace