العربية

أدوات المطور · URL التشفير وفك التشفير

WHATWG URL المعيار مقابل RFC 3986: لماذا تختلف المتصفحات والمكتبات

· خلفية

ترميز URL المعايير أدوات المطور

يختلف المتصفح والمكتبة عند تحليل URL
الرسم التوضيحي المتجه الأصلي ToolAcre

هناك تعريفان حيان لـ URL، ويختلفان عن قصد. يشرح هذا المنشور سبب قيام WHATWG بكتابة معياره الخاص، حيث يختلف الاثنان في التشفير والتحليل، وأيهما يتبعه الكود الخاص بك.

URL الذي ترفضه مكتبة صارمة ويقوم المتصفح بتحميله بسعادة - سلسلة واحدة، حكمان

قد يتم تفسير السلسلة التي تحتوي على شرطة مائلة عكسية في JavaScript بسلاسة بواسطة متصفحك كجزء من المسار URL. تصل نفس السلسلة إلى الواجهة الخلفية لمكتبة بايثون، وترفض تحليلها لأن الخطوط المائلة العكسية غير مسموح بها. واحدة URL، نتيجتان مختلفتان. وكلاهما ليس خطأ، فهما يتبعان معايير مختلفة. يصف معيار WHATWG ما تفعله المتصفحات فعليًا بعناوين URL الحقيقية، بما في ذلك كيفية تعاملها مع المدخلات المشوهة. RFC 3986 يحدد القواعد النحوية الرسمية التي يجب أن تتوافق معها عناوين URL بشكل مثالي. العديد من المكتبات الخلفية المبنية على RFC 3986 تطبق هذه القواعد بصرامة وترفض أي شيء خارجها.

هذا الاختلاف مهم عند نقل البيانات بين البيئات. قد تفشل المتصفحات التي تقبلها URL في التحقق من الصحة في أداة الواجهة الخلفية. إن فهم المعيار الذي تطبقه التعليمات البرمجية الخاصة بك يمنع تصحيح الأخطاء الوهمية - تعمل عناوين URL بشكل جيد في مكان واحد ولكنها تفشل بشكل غامض في مكان آخر دون سبب واضح.

لماذا بدأ WHATWG من جديد - وصف ما تفعله المتصفحات بالفعل بالإدخالات غير الصحيحة بدلاً من ما هو صالح

تم تشكيل مجموعة عمل WHATWG في 2004 لتوحيد كيفية تعامل المتصفحات فعليًا مع عناوين URL عمليًا، بدلاً من تحديد قواعد رسمية أكثر صرامة لا تتبعها المتصفحات. RFC 2396 وصف مواصفات نحوية رسمية، لكن المتصفحات في الواقع لم تتبعها بشكل صحيح تمامًا. طورت المتصفحات الواقعية قواعد عملية لتحمل المسافات، والتعامل مع الأحرف التي تم تجاوزها، والتعافي من المدخلات المشوهة التي لم يتوقعها RFC أو يتوقعها.

وصل RFC 3986 إلى 2005 مع قواعد نحوية رسمية لعناوين URL جيدة الصياغة ومتطلبات صارمة. تنفذ المتصفحات WHATWG؛ غالبًا ما تنفذ مكتبات الواجهة الخلفية RFC 3986.

تشفير المجموعات مقابل الأحرف المحجوزة - كيفية ارتباط قوائم URL القياسية لكل مكون بفئات RFC 3986

RFC 3986 يقسم الأحرف إلى ثلاث فئات: محجوزة وغير محجوزة وكل شيء آخر يجب تشفيره. الأحرف المحجوزة مثل النقطتين والشرطة المائلة وعلامة الاستفهام والتجزئة لها معنى هيكلي في عناوين URL. الأحرف غير المحفوظة هي الأحرف والأرقام والواصلة والشرطة السفلية والنقطة والتيلدا؛ هذه آمنة دائمًا. يتم ترميز كل شيء آخر بنسبة مئوية على هيئة بايت. يوفر المعيار قاعدة واحدة واضحة: تعرف على الفئة التي تنتمي إليها شخصيتك.

يتبع معيار WHATWG URL أسلوبًا قائمًا على المكونات. وهو يحدد قواعد ترميز مختلفة للمخطط والسلطة والمسار والاستعلام والجزء بشكل منفصل بدلاً من استخدام الفئات العامة. قد يتم ترميز علامة الضم في مسار ولكن يتم تركها بمفردها في سلسلة استعلام. يتم دائمًا ترميز المساحة، لكن التمثيل الدقيق يختلف حسب السياق. يتطابق هذا التصميم لكل مكون مع سلوك المتصفح بشكل أفضل ولكنه يتطلب معرفة أي جزء من URL الذي تقوم بتشفيره.

التسامح مع الأخطاء: المسافات والخطوط المائلة العكسية وعلامات التبويب - يتم رفض أحد المعايير ويتم إصلاح الآخر

يجب أن تصبح المسافات %20 بموجب كلا المعيارين، لكن المتصفحات تقوم بتحويل المسافات الحرفية بصمت. الخطوط المائلة العكسية محظورة بموجب كلا المعيارين، إلا أن بعض المتصفحات تتعامل معها كفواصل للمسار. علامات التبويب والأسطر الجديدة وأحرف التحكم محظورة. WHATWG يحدد سلوك المحلل اللغوي المتساهل: قم بتحويله أو تجاهله.

يجب أن تكون الأحرف غير ASCII مثل é أو 中 مشفرة بنسبة مئوية باستخدام ترميز UTF-8. RFC 3986 لا يحدد في الواقع خطوة ترميز الأحرف نفسها؛ فهو يفترض وجود وحدات البايت ولكنه لا يوضح كيفية الحصول عليها من النص. يتطلب معيار WHATWG بشكل صريح UTF-8: تحويل السلسلة إلى UTF-8 بايت أولاً، ثم تشفيرها بنسبة مئوية. يصل كلا المعيارين إلى نفس نتيجة التشفير، لكنهما يبدأان من افتراضات أساسية مختلفة وليسا صريحين بشأن نفس الأشياء.

مثال عملي: تحليل URL بشرطة مائلة عكسية ومسافة في كلا النموذجين - مقارنة المخرجات

خذ مثال السلسلة "https://example.com/café\ بحث". يواجه المتصفح الشرطة المائلة العكسية ويرى أنها حرف مسار؛ يرى المساحة ويشفرها إلى %20، وينتج شيئًا مثل https://example.com/café%5C%20search. يرفض المحلل اللغوي RFC 3986 كامل URL على الفور لأن الخطوط المائلة العكسية محظورة والمسافات محظورة. يستمر المتصفح في التحليل؛ يتوقف المحلل اللغوي الصارم تمامًا. جرب مثالاً آخر: "https://user@example.com:80/path?q=a&b=c". يحدد كلا المعيارين معلومات المستخدم والمضيف والمنفذ والمسار والاستعلام بوضوح. ويتفقان تمامًا على هذا URL المنظم. ويحدث الخلاف فقط عند المدخلات غير العادية أو المشوهة.

افتح برنامج التشفير ووحدة فك التشفير URL وقارن وضع RFC 3986 بسلوك المتصفح. قم بلصق سلسلة بمسافات أو خطوط مائلة عكسية أو حالات حافة أخرى. توضح لك الأداة بالضبط كيف يقوم كل معيار بتحويل نفس المدخلات بشكل مختلف. ترى على الفور أيهما أكثر صرامة وماذا يفعل كل منهما.

أي واحد تستخدمه بيئتك — تتبع المتصفحات والعقدة معيار URL؛ تتبع العديد من مكتبات الخوادم RFC، الموصوفة بشكل عام

في المتصفحات، يستخدم JavaScript معيار WHATWG URL بشكل افتراضي. يقوم URL API بتنفيذه تمامًا. Node.js يستخدم أيضًا WHATWG. تميل مكتبات بايثون إلى تنفيذ RFC 3986؛ urllib يتبعه عن كثب. تختلف مكتبات جافا؛ java.net.URL يميل نحو RFC 3986. يتبع صندوق عنوان url الخاص بـ Rust WHATWG. تتأثر شبكة Go /url بـ WHATWG. وهذا نمط عام، وليس قاعدة مطلقة.

عندما تقوم بإنشاء عناوين URL برمجيًا وتنتقل بين المتصفح والواجهة الخلفية، اختر معيارًا واحدًا والتزم به. استخدم URL API الخاص بالمتصفح لـ WHATWG. إذا كانت مكتبة الواجهة الخلفية الخاصة بك أكثر صرامة، فهذا ليس تناقضًا بل اختيارًا للتصميم.

ما لا يغطيه هذا — تحليل اسم المضيف، والقيم الحرفية لـ IPv6، ومعالجة IDNA

يتضمن تحليل اسم المضيف IDNA، وpunycode وقواعد المسجل التي تتجاوز URL تحليل نفسها بالكامل. عناوين IPv6، والأنظمة الخاصة مثل mailto: أو data:، والمكونات الفارغة هي موضوعات منفصلة تختلف عن الترميز المئوي تمامًا. تختلف حدود طول النطاق وصلاحية اسم المضيف حسب المسجل وليست ذات صلة بهذه المناقشة. مستبعد أيضًا: المراجع النسبية وقواعد التحليل الخاصة بالمخطط. يركز هذا المنشور فقط على ترميز وتحليل الاختلافات.

تركز هذه المناقشة على اختلافات التشفير والتحليل التي تميز هذه المعايير. باستثناء قواعد اسم المضيف، تمنع قواعد DNS والسلوك الخاص بالنظام حدوث ارتباك حول قواعد ترميز النسبة المئوية.

الوجبات الجاهزة: نفس URL صالح في عالم واحد وخطأ في عالم آخر - كيف يمنحك برنامج التشفير ووحدة فك التشفير URL التشفير العادي RFC 3986 حتى تتمكن من رؤية ما تم تطبيعه بواسطة المتصفح

يمكن أن تكون نفس السلسلة URL صالحة بموجب معيار واحد وغير صالحة بموجب الآخر. كلاهما صحيح ضمن أهداف التصميم الخاصة بهما. عند تشفير مكونات URL برمجيًا، استخدم الأداة المناسبة لبيئتك. WHATWG يصف ما تفعله المتصفحات فعليًا؛ RFC 3986 يحدد القواعد النحوية. يعرض برنامج التشفير ووحدة فك التشفير URL قواعد RFC 3986 جنبًا إلى جنب مع سلوك المتصفح حتى تتمكن من رؤية الاختلافات الدقيقة واختيار ما يناسب موقفك.

تظهر المشاكل في أغلب الأحيان عندما تعبر عناوين URL حدود المتصفح إلى الواجهة الخلفية. إن فهم هذا الاختلاف يعني التعامل مع هذا المعبر عن قصد وليس عن طريق الخطأ أو عن طريق الخطأ.