أدوات المطور · JSON المنسق والمدقق
المفاتيح المكررة في JSON: ما الذي يسمح به RFC 8259 وما يفعله المحللون
· خلفية
json المعايير تصديق
تسمح القواعد النحوية لـ JSON بنفس المفتاح مرتين، وتقول المواصفات فقط إن الأسماء "ينبغي" أن تكون فريدة، ويختلف المحللون حول القيمة التي ستفوز. يشرح هذا المنشور سبب أهمية ذلك بالنسبة للصحة والأمان.
ما هو "الدور" الذي قرأه الخادم؟
خذ بعين الاعتبار `{"role":"viewer","role":"editor"}`. كلا العضوين مكتملان نحويًا، لذا فإن ToolAcre التقارير صالحة JSON. عندما يصل النص إلى `JSON.parse`، يكون للكائن الناتج خاصية `role` واحدة قيمتها `"editor"`. لا يتم الاحتفاظ بالعضو السابق كمحفوظات مخفية. وبالتالي، فإن التحقق من بناء الجملة بنجاح لا يجيب على أي شيء حول ما إذا كانت أسماء الكائنات قد ظهرت أكثر من مرة.
يجعل التنسيق الخسارة مرئية فقط بعد حدوثها: يحتوي الإخراج على `{"role":"editor"}` في التخطيط المختار. لا يمكن إعادة إنتاج العضو `viewer` المهمل لأن التسلسل يستقبل الكائن الذي تم تحليله، وليس تسلسل العضو الأصلي. إذا كانت الأسماء المتكررة مهمة للمراجعة، فاحتفظ بالنص المصدر وافحصه قبل الضغط على "تنسيق" بدلاً من الاعتماد على النتيجة التي تمت تسويتها.
النحو يسمح بذلك، والمواصفات لا تشجعه
RFC 8259 يقول أن الأسماء الموجودة داخل الكائن يجب أن تكون فريدة. تعمل كلمة "ينبغي" على تعزيز المخرجات القابلة للتشغيل البيني دون جعل التفرد جزءًا من القواعد النحوية الأساسية للكائن. لا يزال الاسم المتكرر يتكون من سلسلة صالحة ونقطتين وقيمة في الموضع الصحيح المفصول بفواصل. وبالتالي، يمكن للمدقق النحوي قبول المستند بينما ترفضه سياسة التطبيق.
من السهل تفويت هذا التمييز لأن العديد من الأخطاء هي فشل إلزامي في بناء الجملة: لا يمكن للنقطتين المفقودتين أو الفاصلة الزائدة أن تشكل كائن JSON على الإطلاق. التكرارات مختلفة. يقومون بإنشاء سؤال قابلية التشغيل البيني بعد أن يتعرف المحلل اللغوي على كل رمز مميز. ToolAcre يتوقف عمدًا عند بناء الجملة ولا يضيف قاعدة اسم مكررة، لذلك لا يجب قراءة النتيجة الصالحة كضمان للتفرد.
ما يفعله JSON.parse وToolAcre
يستخدم `JSON.parse` التكرار الأحدث عند تكرار أسماء الكائنات. ToolAcre يرث هذا السلوك لأنه يقوم بالتحليل قبل التنسيق. بالنسبة إلى `{"limit":10,"limit":25,"unit":"items"}`، تنجح عملية التحقق من الصحة، ويكون الحد الذي تم تحليله هو 25، ويحتوي الإخراج المنسق على `limit` واحد. يمكن لفرز المفاتيح الاختياري تغيير موضع تلك الخاصية الباقية ولكن لا يمكنه الكشف عن حدوث الكتابة فوقه.
لا تقم بتعميم هذه النتيجة على كل محلل أو تكوين. يمكن لبعض الأنظمة رفض التكرارات، وقد تطبق مجموعات المعالجة الأخرى سياسة مختلفة أو تفحص الرموز المميزة قبل إنشاء كائن. بيان النظام الآمن ضيق: الأسماء المتكررة غير قابلة للتشغيل المتبادل بشكل موثوق. تحقق من أوضاع المحلل اللغوي الفعلية المستخدمة عند كل حد عندما يكون التمييز مهمًا، بدلاً من الاعتماد على مطالبة على مستوى اللغة.
عندما يصبح الخلاف المحلل خطرا
تصبح التكرارات مصدر قلق أمني فقط في مسار ملموس متعدد المراحل حيث تفسر المكونات نفس النص بشكل مختلف. على سبيل المثال، قد يقوم عامل تصفية الطلب بفحص حدث واحد بينما يستهلك التطبيق حدثًا آخر. تعتمد إمكانية حدوث ذلك على المحلل الدقيق والخيارات وسلوك إعادة التوجيه والاستخدام الميداني. بناء الجملة المكرر وحده لا يثبت تجاوزًا قابلاً للاستغلال.
التحكم الذي يمكن الدفاع عنه هو إنشاء سياسة واحدة عند حدود الثقة واختبار المكدس الحقيقي. ارفض الأسماء المكررة قبل إنشاء كائن مع فقدان البيانات عندما يكون الغموض غير مقبول، أو تأكد من أن كل مكون يتلقى نفس التمثيل الذي تم تحليله بالفعل. يمكن لـ ToolAcre أن يوضح سلوك تنسيق المكاسب الأخيرة الخاص به، لكن لا يمكنه تدقيق البوابات أو أطر العمل أو الخدمات التي لا تشكل جزءًا من أداة المتصفح.
مثال عملي: مستند بمفتاح متكرر
الصق `{"theme":"light","prefs":{"density":"roomy","density":"compact"},"theme":"dark"}`. ToolAcre يقبل النص لأن كل عضو صالح من الناحية النحوية. يؤدي التحليل إلى ترك السمة الجذرية كـ `dark` والكثافة المتداخلة كـ `compact`. يؤدي التنسيق إلى إصدار نسخة واحدة من كل اسم، لذا تختفي القيمتان السابقتان من المستند المعروض.
يوضح هذا المثال أيضًا سبب تأخر البحث عن النتيجة المنسقة. يجب أن يلاحظ الكشف المكرر أسماء الأعضاء أثناء قراءة دفق الرمز المميز الأصلي، في كل عمق كائن. لا تحتاج المصفوفات إلى قاعدة أسماء مكررة، على الرغم من أن قواعد التطبيق المنفصلة قد تهتم بقيم العناصر المتكررة. احتفظ بالمصدر دون تغيير، وقم بتشغيل محلل أو أداة تحليل للتكرارات ضده، وحدد ما إذا كانت السياسة بمثابة تحذير أو رفض.
كشف التكرارات عن قصد
استخدم الأدوات التي تعد صراحةً بالكشف عن الأسماء المكررة في المصدر JSON. تتضمن الأساليب المناسبة وضع المحلل اللغوي الذي يفشل عند التكرار، أو معالج الرمز المميز المتدفق الذي يتتبع أسماء كل كائن مفتوح، أو أداة تحليل مع قاعدة مفتاح مكررة موثقة. تحقق من الكائنات المتداخلة والأسماء التي تم تجاوزها: `"name"` و`"name"` يتم فك ترميزهما إلى نفس اسم العضو على الرغم من اختلاف هجاء مصدرهما.
JSON لا يعد المخطط بديلاً بمجرد أن يتجاهل التحليل العادي الأحداث السابقة. عادةً ما يتلقى مدقق المخطط القيمة التي تم إنشاؤها ويرى خاصية واحدة، وليس سجل الرمز المميز المكرر. قم بتشغيل التحقق من التفرد قبل التحليل أو أثناءه، ثم قم بتطبيق عمليات التحقق من المخطط على القيمة التي لا لبس فيها. ToolAcre لا يقوم باكتشاف التكرارات أو التحقق من صحة المخطط، لذا يتطلب كلاهما خطوة منفصلة مخصصة لهذا الغرض.
ما لا يغطيه هذا
أسماء الكائنات المتكررة ليست هي نفس القيم المتكررة عبر السجلات. يحتوي `[ {"id":7}, {"id":7} ]` على كائنين منفصلين، يحتوي كل منهما على `id`؛ اكتشاف معرف مكرر هناك قاعدة مجموعة البيانات. وبالمثل، يظل عنصرا المصفوفة اللذان لهما نفس السلسلة في موضعين متعمدين ما لم ينص عقد التطبيق على أن المصفوفة تمثل مجموعة.
لا تدعي هذه المقالة سياسة المكاسب الأولى أو المكاسب الأخيرة أو سياسة الرفض العالمية للأنظمة البيئية اللغوية الواسعة. فهو يسجل سلوك ToolAcre الملحوظ `JSON.parse` ويشرح سبب ضرورة فحص مكون آخر مباشرة. كما أنه لا يحدد قابلية الاستغلال من التكرار وحده. يتطلب التأثير الأمني دليلاً على أن التفسيرات المختلفة تعبر حدود التفويض أو التوجيه أو التحقق ذات الصلة.
الوجبات الجاهزة: صالح JSON ليس دائمًا لا لبس فيه JSON
النتيجة ToolAcre الصالحة تعني أن تسلسل الرمز المميز صارم JSON؛ هذا لا يعني أن كل اسم كائن فريد. `JSON.parse` يحتفظ بالقيمة الأخيرة لاسم متكرر، ويقوم التنسيق بإجراء تسلسل لذلك الناجي فقط. نظرًا لأنه تم مسح التكرار السابق، فإن الإخراج المنسق يعد دليلاً غير مناسب لتحديد ما إذا كان المصدر الأصلي يحتوي على نسخ مكررة.
عندما يكون التفرد مهمًا، قم بفحص النص الأصلي باستخدام أدوات تتعرف على التكرارات قبل التحليل أو التنسيق العادي. قم بتطبيق التحقق من صحة المخطط والمجال بعد ذلك على القيمة الواضحة الناتجة. لمراجعة الأمان، تتبع مسار الطلب الفعلي وإعدادات المحلل اللغوي بدلاً من افتراض عدم الاتفاق. القاعدة العملية بسيطة: قبول بناء الجملة، وسياسة الاسم المكرر، والمعنى النهائي هي عمليات فحص منفصلة بأدلة منفصلة.