Verhinderung der unbeabsichtigten Serialisierung von ActiveRecord-Modellen

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

Standardmäßig enthält 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 der Entwicklung und in Tests führt dies zu:

ActiveRecordSerializationSafety::BlockedSerializationError:
Das Serialisieren von ActiveRecord-Modellen (User) ohne Angabe von Feldern ist nicht erlaubt.
Verwenden Sie einen Serializer oder übergeben Sie die Option :only an #serializable_hash. Weitere Informationen: 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 ist 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“