أدوات المطور · URL التشفير وفك التشفير
خطأ URIE: URI مشوه - سبب ظهور decodeURIComponent وكيفية إصلاحه
· كيف يعمل
ترميز URL جافا سكريبت معالجة الأخطاء
يتم طرح decodeURIComponent عندما لا تكون علامة النسبة المئوية متبوعة برقمين سداسي عشري، أو عندما تكون وحدات البايت التي تم فك تشفيرها غير صالحة UTF-8. يوضح هذا المنشور المدخلات التي تؤدي إلى تشغيله وكيفية فك التشفير بشكل دفاعي.
علامة النسبة المئوية التي تعطلت - لماذا "100% off" يكسر فك تشفير URIComponent
يقوم النموذج بتجميع رمز الخصم "خصم 100%". يقوم JavaScript بتمرير هذا إلى فك تشفير URIComponent في وحدة فك ترميز URL. تعرض الدالة خطأ URIE: URI بشكل غير صحيح. علامة النسبة المئوية غير متبوعة برقمين سداسيين عشريين. وهذا ينتهك قواعد ترميز النسبة المئوية تمامًا. يتوقع decodeURIComponent أن يبدأ كل % ثلاثة توائم مثل %20 أو %C3. % الوحيد هو خطأ في بناء الجملة يؤدي إلى إيقاف التنفيذ على الفور ويؤدي إلى حدوث خطأ.
يؤدي اكتشاف هذا الخطأ بأمان إلى منع تعطل التطبيق تمامًا. تصل عناوين URL من إدخال المستخدم وعمليات إعادة التوجيه ورموز QR ورسائل البريد الإلكتروني. الأخطاء المطبعية تحدث بشكل متكرر. يخبرك تقرير الأعطال باستخدام URIError بمكان التحقيق بسرعة. يؤدي فك التشفير الدفاعي إلى استمرار تشغيل التطبيقات وتصبح سجلات الأخطاء مفيدة لتصحيح الأخطاء.
هناك نوعان من الفشل — عمليات الهروب السداسية المشوهة وتسلسلات البايت UTF-8 غير الصالحة
يتم طرح decodeURIComponent في حالتين بالضبط. أولاً: تسلسل الهروب المشوه. نسبة مئوية لا يتبعها رقمان سداسي عشري (0-9، A-F، a-f). أمثلة: %ZZ، %2, %2g. ثانيًا: ثلاثي صالح مثل %E9 فك التشفير إلى UTF-8 بايت غير صالح. الأول هو خطأ في التنسيق. والثاني هو الخطأ الدلالي. كلاهما يرمي ويوقف التنفيذ على الفور.
UTF-8 لديه قواعد صارمة بشأن تسلسلات البايت. تظهر وحدات البايت 0x80–0xFF فقط في تسلسلات متعددة البايت. لا يمكن أن تكون %E9 واحدة صالحة UTF-8 وحدها. يؤدي هذا البايت المعزول إلى حدوث خطأ. أخطاء التنسيق واضحة. الأخطاء الدلالية دقيقة ولكنها حقيقية بنفس القدر. تتطلب كلتا الحالتين معالجة محاولة/catch في كود الإنتاج.
ترميز قديم أحادي البايت — عندما يتم طرح %E9 بمفرده ولكن يظل %C3%A9 على قيد الحياة
ينبع الارتباك من تاريخ معايير الويب. استخدمت الصفحات القديمة اللغة اللاتينية-1 بدلاً من UTF-8. في اللاتينية-1, %E9 يمثل é. تستخدم المتصفحات الحديثة UTF-8 حصريًا. UTF-8 يشفر é كـ %C3%A9. تتوقع أجهزة فك التشفير الحديثة UTF-8 وترفض %E9 باعتبارها مشوهة. هذا هو السلوك الصحيح. يشير الخطأ إلى وجود مشكلة في البيانات المصدر.
الإجماع الحديث: UTF-8 في كل مكان. يحدد المعيار URL UTF-8. تستخدم كافة المتصفحات الحالية UTF-8. إذا واجهت %E9 من الأنظمة القديمة، فاكتشف الخطأ وارجع إلى السلسلة الأولية. لا تقم بفك التشفير كـ Latin-1 في الكود الحديث. التحقيق من أين نشأت البيانات.
ثلاثة مدخلات وثلاث رسائل خطأ - كيف تختلف المحركات على نفس السلسلة المقطوعة
ترفض محركات المتصفح الإدخالات المشوهة باستمرار، لكن أخطاء الكلمات تختلف بشكل مختلف. أبلغ Chrome عن "URI بشكل غير صحيح". أبلغ Firefox عن "تسلسل URI مشوه". تقارير Safari "لا يمكن تحويل غير محدد إلى كائن". جميع المحركات الثلاثة ترفض مدخلات متطابقة. لا يتم توحيد الصياغة الدقيقة للرسالة عبر محركات أو إصدارات مختلفة. لا تعتمد أبدًا على نص الخطأ لتوجيه منطق التعليمات البرمجية.
لا تقم مطلقًا بمطابقة أي رسالة خطأ لاتخاذ قرارات البرنامج. اكتشف دائمًا خطأ URIEr حسب النوع. تقوم الدالة decodeUrl بتغليف decodeURIComponent وتوفر رمزًا ثابتًا INVALID_PERCENT_ENCODING. هذا يسمي موضع المشكلة بالضبط. إنه يعمل عبر أوقات التشغيل لأنه لا يعتمد على اختلافات صياغة المحرك. هذا النهج أكثر موثوقية وقابلة للصيانة.
قراءة الاستثناء بأمان - حاول/catch, التحقق من الصحة والأنماط الاحتياطية
أبسط نمط دفاعي: قم بلف decodeURIComponent في محاولة/catch. إذا تم الرمي، استخدم سلسلة أولية أو حرفًا بديلاً. وهذا يمنع الإدخال المشوه من التعطل. بالنسبة لقيم الاستعلام، قم بإظهار النموذج المشفر URL. بالنسبة للنص الذي يواجه المستخدم، أدخل حرفًا بديلاً. وهذا يمنع المدخلات السيئة من كسر التطبيقات ويحافظ على الاستقرار.
التحقق المسبق باستخدام التعبيرات العادية للسرعة والأمان. تأكد من أن الإدخال يحتوي فقط على %XX ثلاثية صالحة قبل فك التشفير. يلتقط النمط /%[0-9A-Fa-f]{2}/g عمليات الهروب الصالحة؛ أي شيء لا مثيل له فهو باطل. تفشل أخطاء التنسيق بسرعة في القمامة الواضحة. UTF-8 الأخطاء لا تزال بحاجة إلى المحاولة/catch. يوفر هذا معًا حماية دفاعية شاملة ضد الأخطاء.
تؤدي حالات الفشل الصامتة إلى إخفاء الأخطاء - لماذا يكون فك التشفير الأعمى محفوفًا بالمخاطر مثل التشفير المعطل
خطر خفي: لا يقوم جهاز فك التشفير بإلقاء نص خاطئ ولكنه ينتج بصمت نصًا خاطئًا. الكود القديم الذي يستخدم unescape المهمل يترك UTF-8 غير صالح في الذاكرة. يبدو النص جيدًا على الشاشة حتى يصل إلى الأنظمة التي تتحقق من صحة UTF-8 بدقة. يلقي القانون الحديث بدلا من الفاسد بصمت. الاستثناء أكثر وضوحًا وأمانًا من انتشار تلف البيانات الصامت في اتجاه مجرى النهر.
افترض أن إدخال المستخدم غير صحيح. قم دائمًا بإنهاء المكالمات. سجل الأخطاء بالإدخال الأصلي لتصحيح الأخطاء. لا تفترض أبدًا أن كل % صالح. تؤدي الأخطاء المطبعية والاقتطاع إلى عمليات هروب غير كاملة. تعامل مع أخطاء البيانات، وليس الأخطاء المنطقية. ينجو الكود الدفاعي من المدخلات السيئة بأمان ويحافظ على موثوقية الأنظمة.
ما هي الأدوات الحقيقية التي تتخطاها — سلوك إطار العمل من جانب الخادم واسترداد الأخطاء
تتعامل أطر عمل الخادم مع الترميز التالف بشكل أكثر تساهلاً من المتصفحات. تقدم Ruby وPython وPHP تكوينًا للتعامل مع عمليات الهروب غير الصالحة في عناوين URL. تقوم بعض الأحرف البديلة تلقائيًا. يقوم الآخرون بإسقاط البايتات بصمت. يرمي البعض استثناءات مثل JavaScript. يختلف السلوك الفعلي حسب إطار العمل وإعدادات التكوين التي يختارها المطورون.
تتناول هذه المقالة سلوك المتصفح JavaScript فقط. إذا وصلت القيم من واجهات برمجة تطبيقات الخادم، فهذا يعني أن الخادم قد قام بالفعل بفك تشفير الأخطاء أو تخطيها قبل الإرسال. يمكن أن تكون الخوادم أكثر تسامحًا من العملاء. عند كتابة عقود API، حدد ما إذا كانت القيم أولية أم تم فك تشفيرها مسبقًا. URL يجب أن تصل سلاسل الاستعلام بنسبة مئوية مشفرة؛ يمكن أن يصل JSON مفكك التشفير مسبقًا.
التحقق مبكرًا — باستخدام برنامج التشفير ووحدة فك التشفير URL للتحقق من السلاسل المشبوهة أولاً
قبل تمرير عناوين URL المشبوهة إلى decodeURIComponent، الصقها في برنامج التشفير ووحدة فك التشفير URL. تعرض الأداة التشفير الدقيق، وتكشف عن حالات الهروب المشوهة، وتشرح الأخطاء دون تعطل تطبيقك. اختبر باستخدام %ZZ و%E9 و100% لمعرفة حالات الفشل المختلفة ورسائل الخطأ الدقيقة الخاصة بها. يستغرق هذا ثوانٍ ويبني الثقة.
تحقق من صحة البيانات مبكرًا، واكتشف الأخطاء بأمان وسجل الأخطاء. تعمل وحدة فك التشفير الدفاعية بالإضافة إلى أداة الاختبار على إبقاء التطبيقات قيد التشغيل وقابلة للتصحيح. URL يقوم برنامج التشفير ووحدة فك التشفير بتحويل "URI المشوهة" إلى معلومات قابلة للتنفيذ يمكنك استخدامها على الفور. قم بتطبيق هذا النمط على أجهزة فك التشفير الخاصة بك للحصول على المرونة وقابلية الصيانة في بيئات الإنتاج.