Versehentliche Serialisierung von ActiveRecord-Modellen verhindern

Wir haben einen Patch eingeführt, um die versehentliche Serialisierung von ActiveRecord-Modellen ohne Angabe der zu serialisierenden Felder zu verhindern. Diese Änderung stellt sicher, dass wir kontrollieren, welche Felder enthalten sind, und vermeidet potenzielle Probleme mit unvollständigen oder übermäßigen Daten, die preisgegeben werden.

Standardmäßig umfasst das Rendern eines ActiveRecord-Modells als JSON alle Attribute, was in vielen Fällen nicht wünschenswert ist. Um bessere Praktiken zu erzwingen, müssen wir angeben, welche Felder serialisiert werden sollen.

Anwendungsbeispiele

Falsche Verwendung:

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

In Entwicklung und Tests führt dies zu:

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'

Korrekte Verwendung:

  1. Verwendung eines Serializers
class UserSerializer < ApplicationSerializer
  attributes :id, :email
end

def show
  @user = User.first
  render json: @user, serializer: UserSerializer
end
  1. Verwendung der Option :only
def show
  @user = User.first
  render json: @user.as_json(only: [:id, :email])
end

Dieses Dokument wird versionskontrolliert – schlagen Sie Änderungen auf github vor.

6 „Gefällt mir“

Nur zur Klarstellung für diejenigen, die dies in der Praxis antreffen könnten: Dies bedeutet, dass alle Verwendungen der Serialisierungsmethoden in ActiveModel::Serialization, z. B. as_json, unabhängig vom Kontext (auch in Specs), zu einem Fehler führen, es sei denn, Sie übergeben die Option only. Weitere Informationen finden Sie unter

Ein Beispiel finden Sie unter:

5 „Gefällt mir“

Ein Beitrag wurde in ein neues Thema aufgeteilt: Hilfe bei neuen Serialisierungsschutzmaßnahmen

Nun, es hat 21 Tage gedauert, aber ich habe endlich verstanden, was Sie hier in Ihrem verlinkten Code gesagt haben, zumindest in einem Kontext, und hoffentlich auch in dem anderen, der im oben genannten geteilten Thema erwähnt wird. Dieser scheint schwieriger zu sein (zumindest nach meiner Erinnerung), da ich nicht genau weiß, wo das Problem liegt.

Danke, dass Sie den Tag (oder zumindest diesen Tag) gerettet haben. :beers:

Das andere Problem war, dass mein server-Modell das user-Modell enthielt und ich den User-Serializer (oder die Begrenzung von Feldern) des User-Modells in meinem Server-Serializer aufrufen musste.

Es stellte sich heraus, dass ich keines der User-Modelle in meinem Server-Modell benötigte (user_id_war bereits vorhanden, und es besteht eine gute Chance, dass ich das nicht einmal wirklich brauche).

1 „Gefällt mir“