ما تفعله محولات بناء الجملة
JSON، YAML، XML، TOML و CSV لا تحمل نفس الأشياء. توضح هذه الصفحة بالضبط كيفية تعيين كل شكل، والتحويلات المفقودة، وما ترفض الأداة القيام به.
ما يحول
تسعة تحويلات موجهة: JSON إلى YAML، YAML إلى JSON، JSON إلى XML، XML إلى JSON، JSON إلى TOML، TOML إلى JSON، YAML إلى TOML، TOML إلى YAML، وJSON إلى CSV. يتم تشغيل كل واحد في علامة تبويب المتصفح الخاص بك؛ لم يتم تحميل أي شيء.
يعمل كل تحويل بنفس الطريقة داخليًا: تتم قراءة المستند المصدر إلى قيمة عادية JavaScript، ويتم كتابة هذه القيمة بالتنسيق الهدف. YAML إلى TOML ليست حالة خاصة، بل هو القارئ YAML متبوعًا بالكاتب TOML. ولهذا السبب تم ذكر التحذيرات أدناه لكل تنسيق وليس لكل زوج - ينطبق التحذير حول أوقات التاريخ TOML أينما يظهر TOML.
CSV للكتابة فقط، وذلك عن عمد. قراءة CSV تعني تخمين المحدد، ولهجة الاقتباس، وما إذا كان الصف الأول عبارة عن رأس، ونوع لكل خلية - أربعة تخمينات، كل منها يخطئ المحول بهدوء. هذه وظيفة الأداة التي تسأل.
XML: السمات والمصفوفات والقواعد التي اخترناها
لا يحتوي XML على تعيين JSON أساسي، لذا كان لا بد من اختيار الاصطلاحات. وتكون مرئية على الشاشة عندما يكون XML أحد التنسيقين، وهما هذان.
تصبح السمات مفاتيح كائنات مسبوقة بـ @. <user id="7"><name>Ada</name></user> يُقرأ كـ {"user":{"@id":":7"، "name": "Ada"}}. البادئة هي ما يمنع السمة والعنصر الفرعي الذي يحمل نفس الاسم من الانهيار في مفتاح واحد — <user id="7"><id>other</id></user> يحتفظ بكليهما.
يوجد النص الموجود داخل عنصر يحتوي أيضًا على سمات أو عناصر فرعية تحت المفتاح #text. ينهار العنصر الذي لا يحتوي على أي شيء سوى النص على هذا النص. يوجد قسم CDATA ضمن #cdata، لذا فإن محتوياته هي بيانات واضحة وليست ترميزية.
تصبح العناصر الشقيقة المتكررة مصفوفة. اسم العنصر الذي يظهر مرة واحدة لا يصبح مصفوفة — XML لا يمنح المحلل اللغوي أي طريقة لتمييز "قائمة تحتوي على عنصر واحد" من "قيمة واحدة"، ولا يمكن لأي محول اختراع تلك المعلومات. إذا كنت بحاجة إلى شكل ثابت، فهذه حجة لمخطط، وليس لمحول أكثر ذكاءً.
يتم الاحتفاظ ببادئات مساحة الاسم حرفيًا: <ns:item> هو المفتاح ns:item وxmlns:ns هي السمة @xmlns:ns. لم يتم حل أي شيء أو إعادة كتابته أو تجريده، لأن حل البادئة يؤدي إلى التخلص من النص الذي يحتوي عليه المستند بالفعل.
تتم قراءة علامة الإغلاق الذاتي كسلسلة فارغة. يتم إسقاط الإعلان XML وتعليمات المعالجة والتعليقات. وبالعكس، تكتب الأداة الإعلان الخاص بها ولا تكتب DOCTYPE أبدًا.
كتابة XML، مفتاح ليس اسمًا قانونيًا لعنصر XML - مفتاح به مسافة، ومفتاح يبدأ برقم، ومفتاح يبدأ بالأحرف xml - يتم رفضه بالاسم بدلاً من إعادة كتابته بصمت. ينتج عن العنصر الذي تمت إعادة تسميته بهدوء مستند لا يتم التحقق من صحته ضد أي شيء.
يتم رفض الكيانات الخارجية، وليس مجرد تعطيلها
قد تعلن وثيقة XML عن الكيانات في DOCTYPE. المحلل اللغوي الذي يوسعها هو ثغرة XXE: كيان تم الإعلان عنه SYSTEM "ملف:///etc/passwd" يقرأ ملفًا محليًا، ويشير أحد الملفات إلى URL ويقدم طلبًا يتحكم فيه المهاجم، وسلسلة من الكيانات الداخلية هي رفض الخدمة "مليار ضحكة" الذي يحول بضع مئات من البايتات إلى غيغابايت.
لا يقوم هذا المحول بتكوين محلل ليكون حذرًا بشأن DOCTYPEs. فهو يرفض أي مستند يحتوي على واحد، قبل أن يُعطى المحلل بايت واحد، مع عدم وجود خيار لإيقاف الرفض. وهذا يجعل الضمان خاصية للكود الخاص بنا وليس الإعداد الافتراضي للتبعية - والفرق مهم، لأن الإعدادات الافتراضية تتغير بين الإصدارات ورفضنا مشمول باختبارات تغذيه بكل حمولة قياسية XXE وتؤكد أنه لم يتم جلب أي شيء ولم يتم توسيع أي شيء.
التكلفة العملية: لن يتم تحويل المستند الذي يحتوي على DOCTYPE هنا حتى عندما يكون غير ضار. احذف DOCTYPE إذا كان المحتوى ملكًا لك.
TOML أوقات التاريخ ليس لها ما يعادلها في أي مكان آخر
TOML 1.0 له أربعة أنواع زمنية وJSON، YAML وXML لا تحتوي على أي منها: تاريخ ووقت الإزاحة (1979-05-27T07:32:00Z)، التاريخ والوقت المحلي (1979-05-27T07:32:00، بدون منطقة، عمدًا)، التاريخ المحلي (1979-05-27) والتوقيت المحلي (07:32:00).
يصبح كل منها السلسلة RFC 3339 تمامًا كما تمت كتابتها، ويخبرك التحويل بالقيم التي فعل بها ذلك وأي نوع من الأنواع الأربعة كان كل منها. البديل - إصدار لحظة واحدة UTC لجميع الأربعة - من شأنه نقل التوقيت المحلي إلى منطقة رفض المستند صراحة ذكرها، وهي إجابة خاطئة وليست إجابة خاسرة.
يؤدي التحويل إلى الخلف إلى إنتاج سلاسل مقتبسة، وليس أوقات التاريخ. رحلة ذهابًا وإيابًا من TOML إلى JSON إلى TOML تؤدي إلى تغيير أنواع تلك القيم. لا توجد طريقة للتغلب على هذه المشكلة دون اختراع اتفاقية يجب أن تتقاسمها أداة الاستقبال، واختراع واحدة بصمت سيكون أسوأ.
TOML تم توقيع الأعداد الصحيحة 64-بت؛ JSON الأرقام هي IEEE-754 مزدوجة. يصبح العدد الصحيح الماضي 2^53 - 1 سلسلة، مع تسمية المسار في تحذير، بدلاً من فقدان أرقامه الأخيرة لتقريب قد لا تلاحظه.
TOML لا يحتوي على قيمة خالية. يتم حذف المفتاح الفارغ من الإخراج ويتم تسميته في تحذير؛ تصبح القيمة الخالية داخل المصفوفة سلسلة فارغة، لأن إزالتها ستؤدي إلى إزاحة كل فهرس لاحق. جذر مستند TOML هو دائمًا جدول، لذلك يتم رفض مصفوفة أو قيمة مجردة في الجذر بجملة توضح السبب.
YAML: المراسي والجداول ومشكلة النرويج
تتم قراءة YAML باستخدام مخطط مقيد يمكنه فقط إنتاج سلاسل وأرقام وقيم منطقية وخالية وقوائم وخرائط. العلامات التي تنشئ كائنات عشوائية - !!js/function, !!python/object/apply, !!binary - يتم رفضها، وهذا هو السبب الرئيسي وراء وجود التقييد: المُحمل الذي يكرمها هو مُنشئ كائن عشوائي يرتدي ملابس ملف التكوين.
يتم تحويل المراسي والأسماء المستعارة إلى بيانات متكررة. يتم رفض المستند الذي يتجاوز مليون قيمة بمجرد اتباع الأسماء المستعارة الخاصة به بدلاً من السماح له بتجميد علامة التبويب؛ يتم رفض الاسم المستعار العودي تمامًا، لأنه لا يوجد تنسيق آخر هنا يمكنه التعبير عن دورة.
يصبح تدفق عدة مستندات مفصولة بـ --- مصفوفة من المستندات، والتحويل يقول ذلك. لا يوجد تنسيق آخر في هذه الأداة يحتوي على دفق، لذا فإن المصفوفة هي التعيين الصادق الوحيد.
YAML يمنع تكرار مفتاح التعيين، ويتعامل كل محلل مع مفتاح التعيين بشكل مختلف. تحتفظ هذه الأداة بالقيمة الأخيرة - القاعدة التي تستخدمها JSON.parse - وتخبرك بحدوث ذلك، مع موضع التكرار. سيكون تجاهل المستند بصمت أمرًا أسوأ؛ إن اختيار قيمة بصمت دون قول ذلك سيكون أسوأ من ذلك.
مشكلة النرويج: في YAML 1.1، يتم تحويل القيم القياسية غير المقتبسة y وyes وon وno وoff ورمز البلد NO إلى قيم منطقية، وهذه هي الطريقة التي تتحول بها قائمة رموز البلدان إلى قائمة من الصواب والخطأ. تقرأ هذه الأداة YAML 1.2، حيث تكون القيم المنطقية true وfalse فقط هي القيم المنطقية، لذلك تظل NO السلسلة NO. عندما يكتب YAML فإنه يقتبس كل سلسلة قد يخطئ المحلل اللغوي 1.1 في قراءتها - 'NO'، 'yes'، 'on'، '1.0'، '0755'، '2001-12-14' - لذا فإن الإخراج آمن للتغذية إلى أداة لم يتم نقلها إلى 1.2. وهذا يكلف عددًا قليلاً من أحرف الاقتباس ويشتري الصحة.
السلاسل التي تبدو كأرقام تحتفظ بعلامات الاقتباس الخاصة بها لنفس السبب: تظل "0755" سلسلة بدلاً من أن تصبح 755، وتظل "1.0" سلسلة بدلاً من أن تصبح 1.
تضيع التعليقات في كل اتجاه. JSON، CSV وليس لدى الآخرين مكان لوضعهم فيه، ولا توجد طريقة لتخمين المكان الذي يجب أن يعودوا إليه.
JSON إلى CSV: التسطيح والفاصلة العليا التي توقف الصيغة
تصبح المصفوفة عبارة عن صفوف، وسجل واحد لكل عنصر. الكائن الذي تحتوي خاصيته الفردية على مصفوفة يستخدم هذا المصفوفة كصفوف، لأن {"users": [ ... ]} هو في الغالب جدول ذو تسمية - والتحويل يقول بصوت عالٍ أنه فعل ذلك. أي كائن آخر هو صف واحد. تم رفض سلسلة أو رقم أو قيمة فارغة: يحتاج المستطيل إلى سجلات.
يتم دمج الكائنات والمصفوفات المتداخلة في أسماء الأعمدة المنقطة، مع نقطة لكل من مفاتيح الكائنات ومؤشرات المصفوفة: address.city، العلامات.0، العلامات.1. فاصل واحد، وقاعدة واحدة. المفتاح الذي يحتوي بالفعل على نقطة يجعل اسم العمود الخاص به غامضًا مع مسار متداخل؛ تحذر الأداة بدلاً من اختراع مخطط هروب لا يفهمه أي جدول بيانات.
يتم توحيد المفاتيح عبر كل صف، بترتيب المشاهدة لأول مرة. يحصل الصف الذي لا يحتوي على حقل على خلية فارغة بدلاً من عمود مُزاح، ويحذر التحويل من أن الصفوف ممزقة. يصبح الكائن الفارغ أو المصفوفة الفارغة خلية فارغة واحدة ضمن مسارها الخاص بدلاً من التلاشي.
يتبع الاقتباس RFC 4180: يتم وضع حقل يحتوي على المحدد أو علامة الاقتباس المزدوجة أو CR أو LF بين علامات اقتباس مزدوجة ويتم كتابة الاقتباس المضمن مرتين. يتم فصل السجلات بـ CRLF. يتم أيضًا اقتباس الحقول ذات المسافات البيضاء البادئة أو اللاحقة، لأن جداول البيانات تقطعها بصمت بخلاف ذلك. يمر Unicode دون تغيير، ويمكن وضع بادئة علامة ترتيب البايت لجداول البيانات التي تحتاج إلى علامة لقراءة UTF-8.
حقن الفورمولا هو الذي يعض. يتم تنفيذ الخلية التي تبدأ بـ =، +، -، @، أو علامة تبويب أو حرف إرجاع كصيغة بواسطة Excel وLibreOffice Calc وGoogle Sheets لحظة فتح الملف. =cmd|'/c calc'!A1 هو العرض التوضيحي الذي يقتبسه الجميع؛ =IMPORTXML(...) هو الذي يرسل الورقة بهدوء إلى مكان ما. لقد قام المحول الذي يكتب مثل هذه السلسلة حرفيًا بتحويل بياناتك إلى تنفيذ تعليمات برمجية لشخص آخر، في ملف يبدو خاملًا.
لذا فإن الخلية النصية التي تبدأ بأحد هذه الأحرف تكون مسبوقة بفاصلة عليا، والتي يقرأها كل جدول بيانات رئيسي على أنها "هذا نص" ولا تظهر في الخلية. يتم ترك الأرقام بمفردها: الرقم -5 هو رقم، وليس صيغة. يتم الإبلاغ عن عدد الخلايا التي تم الهروب منها، ويمكن إيقاف تشغيل الهروب - وفي هذه الحالة توضح الأداة بوضوح ما قمت بإيقاف تشغيله للتو.
لا يمكن لـ CSV التمييز بين سلسلة فارغة وقيمة خالية. يصبح كلاهما خلية فارغة، ويقوم التحويل بحساب القيم الخالية حتى تعلم بحدوث ذلك.
الحدود، وماذا يحدث عندما تصل إلى واحدة
يحتوي كل تنسيق على حد أقصى للأحرف، يتم فرضه قبل تنزيل المحلل اللغوي: 8 مليون لـ JSON، 4 مليون لـ XML ولمصدر CSV، 2 مليون لـ YAML و TOML. أبعد من ذلك، ترفض الأداة الرقم الدقيق، بدلاً من أن تصبح علامة تبويب غير مستجيبة وتفقد ما قمت بلصقه.
بالإضافة إلى ذلك، يتم تحديد الحد الأقصى للمخرجات CSV عند 100,000 من الصفوف و2,000 من الأعمدة، نظرًا لأن المصفوفة المتداخلة بعمق تتسطح في عمود واحد لكل عنصر ويمكن أن تصبح بضعة ميغابايت من JSON جدولًا ولن يتم فتح أي جدول بيانات.
يتم الإبلاغ عن الإدخال الفارغ والمسافات البيضاء فقط على أنه فارغ بدلاً من تحويله إلى مستند فارغ أو فارغ. يتم الإبلاغ عن بناء جملة غير صالح باستخدام سطر وعمود بجميع التنسيقات الأربعة القابلة للقراءة.
يتم تنزيل المحللين أنفسهم فقط عندما يحتاجهم التحويل. فتح مجموعة الأدوات لفك تشفير JWT لا يؤدي إلى جلب أي منها.
ماذا يحدث لما تلصقه
- يتم تشغيل كل تحويل وتجزئة وفك تشفير وفرق في علامة تبويب المتصفح الخاص بك. لا يتم تحميل أي مدخلات أو تسجيلها أو تخزينها على الخادم، لأنه لا يوجد خادم مشارك بمجرد تحميل الصفحة.
- تأتي التجزئة من تطبيق Web Crypto الخاص بالمتصفح، والمعرفات الفريدة الفريدة (UUID) من المولد العشوائي الآمن للتشفير. لا يتضمن أي منهما مكالمة شبكة.
- لا تتم كتابة أي شيء تكتبه على وحدة التخزين المحلية أو ملف تعريف الارتباط. تؤدي إعادة تحميل الصفحة إلى تجاهلها؛ إغلاق علامة التبويب يتجاهلها.
- يتم تشغيل التحليلات على مستوى الموقع فقط على مضيف الإنتاج الأساسي الذي تم تكوينه ويتم الكشف عنها في سياسة الخصوصية؛ المضيفون المحليون ومضيفو المعاينة يرفضون ذلك. يتم استبعاد القيم والرموز المميزة وعناوين URL ومحتويات الملفات التي تم لصقها من أحداث التحليلات الخاصة بـ ToolAcre. تم تعطيل الإعلان في التكوين الحالي.
- ومع ذلك: يعد المفتاح JWT أو المفتاح API بمثابة بيانات اعتماد مباشرة. العادة الآمنة هي عدم لصق أي شيء على صفحة ويب لم تكتبها، مهما كانت ادعاءاتها جديرة بالثقة - بما في ذلك هذه الصفحة.
أسئلة
لماذا يفشل مستند XML الخاص بي مع "الإعلان عن DOCTYPE"؟
لأنه يحتوي على إعلان نوع المستند، ويرفض هذا المحول كل واحد منهم بدلاً من الثقة في إعداد المحلل اللغوي للتعامل مع الكيانات بأمان. احذف DOCTYPE إذا كان المحتوى ملكًا لك. لا يوجد خيار للسماح بذلك.
لماذا عاد وقت التاريخ TOML كسلسلة مقتبسة؟
نظرًا لأن JSON وYAML وXML ليس لها نوع تاريخ. تم تحويل التاريخ والوقت إلى النص RFC 3339 الذي تمت كتابته به، وهو عبارة عن سلسلة في كل التنسيقات الأخرى. وبالتالي فإن التحويل مرة أخرى ينتج عنه سلسلة، وتحذرك الأداة في لحظة حدوث ذلك بدلاً من السماح لك بمعرفة ذلك لاحقًا.
لماذا تبدأ إحدى خلاياي CSV بفاصلة عليا؟
لأن نصه يبدأ بـ =، +، -، @، أو علامة تبويب أو حرف إرجاع، ويقوم جدول البيانات بتنفيذ خلية كصيغة عند فتح الملف. علامة الفاصلة العليا تشير إلى الخلية كنص؛ فهو ليس جزءًا من القيمة بمجرد قراءة الخلية. يمكنك إيقاف تشغيل ميزة الهروب، وستخبرك الأداة بما يعنيه ذلك.
لماذا لا يعد عنصر XML المتكرر مصفوفة؟
لأن XML لا يوفر طريقة للتمييز بين قائمة واحدة وقيمة واحدة. كلاهما مكتوب بشكل متطابق. سيكون التخمين في أي من الاتجاهين خاطئًا في نصف الوقت، لذا تقوم الأداة بالإبلاغ عما هو موجود بالفعل.
هل يمكنني تحويل CSV مرة أخرى إلى JSON هنا؟
لا. تتطلب قراءة CSV بشكل صحيح اتخاذ قرار بشأن المحدد، ولهجة الاقتباس، وما إذا كان الصف الأول عبارة عن رأس ونوع لكل خلية. المحول الذي يخمن الأربعة جميعًا يكون مخطئًا بهدوء، وهي أسوأ طريقة للخطأ. استخدم أداة CSV التي تسأل.
لماذا لا يتم تحويل "لا" إلى خطأ؟
لأن هذا السلوك ينتمي إلى YAML 1.1 وهذه الأداة تقرأ YAML 1.2، حيث يكون الصواب والخطأ فقط منطقيين. إن سلوك 1.1 هو السبب في أن رمز البلد الخاص بالنرويج يعتبر مزحة جارية في إدارة التكوين. عندما تكتب الأداة YAML، فإنها تقتبس مثل هذه السلاسل، لذلك لا يمكن لأي محلل 1.1 أن يخطئ في قراءتها أيضًا.
القيود
- CSV مكتوب، ولا يقرأ أبدًا. لا يوجد تحويل من CSV إلى JSON هنا، حسب الاختيار.
- تضيع التعليقات في كل اتجاه، وفي كل تنسيق بها.
- يصبح التاريخ والوقت TOML سلسلة بكل التنسيقات الأخرى، لذا فإن رحلة ذهابًا وإيابًا TOML تغير هذه الأنواع. لا يوجد طريق بلا خسائر.
- يتم رفض مستند XML الذي يحتوي على DOCTYPE تمامًا، بما في ذلك المستندات غير الضارة، ولا يمكن إيقاف تشغيل الرفض.
- لا يمكن تمييز عنصر XML واحد متكرر عن عنصر غير متكرر، لذا فإن XML إلى JSON إلى XML لا يُرجع الشكل الأصلي دائمًا.
- XML المحتوى المختلط — النص المتداخل مع عناصر فرعية — يفقد موضع النص بالنسبة إلى العناصر الفرعية، ولا يمكنه التنقل ذهابًا وإيابًا.
- قيم XML عبارة عن سلاسل ما لم يتم تشغيل استنتاج النوع، لأن XML لا يعلن عن أي أنواع؛ مع الاستدلال على أن "0755" و"NO" يخضعان للقراءة الخاطئة المعتادة.
- TOML لا يحتوي على قيمة خالية: يتم إسقاط المفاتيح الفارغة من إخراج TOML وتصبح القيم الخالية داخل المصفوفات سلاسل فارغة.
- يجب أن يكون جذر المستند TOML عبارة عن جدول، لذا لا يمكن تحويل المصفوفة أو الحجم العددي JSON إلى TOML على الإطلاق.
- JSON الأرقام هي IEEE-754 مزدوجة. يتم تحويل الأعداد الصحيحة السابقة 2^53 إلى سلاسل بدلاً من تقريبها بصمت، مما يغير نوعها.
- لا يمكن لـ CSV التمييز بين سلسلة فارغة وسلسلة فارغة؛ كلاهما مكتوب كخلية فارغة.
- CSV يستخدم التسوية نقطة لكل من مفاتيح الكائنات ومؤشرات المصفوفة، لذا فإن المفتاح الذي يحتوي بالفعل على نقطة ينتج عنه اسم عمود غامض يتم التحذير منه ولكن لا يتم الهروب منه.
- YAML يتم حل نقاط الارتساء والأسماء المستعارة بدلاً من الحفاظ عليها؛ لا يحتوي الإخراج على نقاط ارتساء، ويتم رفض الاسم المستعار العودي لأنه لا يوجد تنسيق مستهدف يمكنه التعبير عن دورة.
- يتم تحديد حد أقصى للإدخال لكل تنسيق - 8 مليون حرف لـ JSON، 4 مليون لـ XML، 2 مليون لـ YAML وTOML - ويتم رفض المستندات كبيرة الحجم بدلاً من معالجتها ببطء.
- لا شيء هنا يتحقق ضد المخطط. من الممكن أن يتم تحويل المستند بشكل نظيف ولكنه يظل خاطئًا في تحقيق الغرض منه.