منع التسلسل العرضي لنماذج ActiveRecord

لقد قدمنا تصحيحًا لمنع التسلسل العرضي لنماذج ActiveRecord دون تحديد الحقول المراد تسلسلها. يضمن هذا التغيير أننا نتحكم في الحقول التي يتم تضمينها، مما يتجنب المشكلات المحتملة مع البيانات غير المكتملة أو المفرطة التي يتم كشفها.

بشكل افتراضي، يتضمن عرض نموذج ActiveRecord بتنسيق JSON جميع السمات، وهو ما قد لا يكون مرغوبًا فيه في العديد من الحالات. لفرض ممارسات أفضل، نحتاج إلى تحديد الحقول التي يجب تسلسلها.

أمثلة الاستخدام

الاستخدام غير الصحيح:

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

في بيئة التطوير والاختبارات، سيؤدي هذا إلى:

ActiveRecordSerializationSafety::BlockedSerializationError:
لا يُسمح بتسلسل نماذج ActiveRecord (User) دون تحديد الحقول.
استخدم Serializer، أو مرر الخيار :only إلى #serializable_hash. مزيد من المعلومات: https://meta.discourse.org/t/-/314495
./lib/freedom_patches/active_record_disable_serialization.rb:15:in `serializable_hash'

الاستخدام الصحيح:

  1. استخدام Serializer
class UserSerializer < ApplicationSerializer
  attributes :id, :email
end

def show
  @user = User.first
  render json: @user, serializer: UserSerializer
end
  1. استخدام الخيار :only
def show
  @user = User.first
  render json: @user.as_json(only: [:id, :email])
end

هذه الوثيقة تخضع للتحكم في الإصدار - اقترح تغييرات على github.

6 إعجابات

لتوضيح الأمر لمن قد يصادفه في الواقع، هذا يعني أن جميع استخدامات طرق التسلسل في ActiveModel::Serialization، على سبيل المثال as_json، بغض النظر عن السياق (بما في ذلك في المواصفات)، ستؤدي إلى خطأ ما لم تقم بتمرير الخيار only. انظر المزيد

للاطلاع على مثال انظر:

5 إعجابات

تم تقسيم مشاركة إلى موضوع جديد: المساعدة في حماية التسلسل الجديدة

حسنًا، استغرق الأمر 21 يومًا، لكنني أخيرًا فهمت ما قلته هنا في الكود المرتبط الخاص بك، في سياق واحد على الأقل، ونأمل أن يكون السياق الآخر المذكور في الموضوع المنفصل المذكور أعلاه. يبدو أن هذا الأخير أصعب (حسب ذاكرتي على أي حال) نظرًا لأنني لا أعرف بالضبط أين تكمن المشكلة.

شكرًا لإنقاذ اليوم (أو على الأقل هذا اليوم). :beers:

كانت المشكلة الأخرى هي أن نموذج server الخاص بي تضمن نموذج user وكنت بحاجة إلى استدعاء مُسلسل المستخدم (أو تحديد الحقول) لنموذج المستخدم في مُسلسل الخادم الخاص بي.

اتضح أنني لم أكن بحاجة إلى أي من نموذج المستخدم في نموذج الخادم الخاص بي (كان user_id موجودًا بالفعل، وهناك احتمال معقول بأنني لست بحاجة إليه حقًا).

إعجاب واحد (1)