العربية

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

ترميز URL المزدوج: كيف يحدث %2520 وكيفية اكتشافه والتراجع عنه

· كيف يعمل

ترميز URL جافا سكريبت سير عمل المطور تصحيح الأخطاء

معلمة URL تعرض %2520 يتم فك تشفيرها تدريجيًا إلى %20 ثم إلى مسافة
الرسم التوضيحي المتجه الأصلي ToolAcre

%2520 في URL يعني أنه تم ترميز المسافة مرتين. يشرح هذا المنشور أخطاء خط الأنابيب التي تسبب ذلك، وكيفية التعرف على التوقيع، وعدد مرات فك التشفير الآمنة.

ترميز URL مزدوج: عندما يعني %2520 أن هناك مسافة مرت عبر جهازي تشفير

يشير اسم الملف الذي يصل كـ "my%20file.pdf" بدلاً من "my file.pdf" إلى تشفير مزدوج: تم تشفير مسافة إلى %20، ثم تم تشفير علامة النسبة المئوية نفسها إلى %25، مما أدى إلى إنتاج %2520 في URL النهائي. قد يتم تشفير كل طبقة من النظام مثل رمز العميل أو إطار عمل الويب أو الوكيل العكسي مرة واحدة. عندما يتم تشفير طبقتين منفصلتين، يصبح حرف واحد مشوهًا.

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

لماذا %25 هو الإخبار - يتم تشفير علامة النسبة المئوية نفسها، لذا يصبح %20 %2520 ويصبح %C3%A9 %25C3%25A9

العلامة الواضحة للتشفير المزدوج هي %25 حيث تظهر حيث تتوقع عادةً رؤية علامة مئوية واحدة في URL أو البيانات. في URL المشفر بشكل عادي، لن ترى أبدًا %25 ما لم يتم إرسال "%25" حرفيًا. إذا تم ترميز المساحة التي تم ترميزها كـ %20 مرة أخرى، فإنها تصبح %2520.

الحرف المميز مثل é، والذي يتم ترميزه بشكل طبيعي إلى %C3%A9، يصبح %25C3%25A9 عند ترميزه مرتين بواسطة نظامين مختلفين بالتسلسل. يؤدي تعلم اكتشاف النمط %25 في URL من الأشرطة والسجلات ورسائل الخطأ إلى توفير ساعات لا حصر لها من أعمال تصحيح الأخطاء المحبطة في بيئات الإنتاج حيث تتدفق البيانات عبر خدمات متعددة.

حيث يتم تقديم التشفير المزدوج - كود العميل بالإضافة إلى إطار العمل وعمليات إعادة التوجيه والوكلاء ومساعدي القوالب

يؤدي التشفير المزدوج إلى تدمير كل من سهولة القراءة وقدرة الأنظمة من جانب الخادم على تحليل URL بشكل صحيح. الملف المسمى "my file.pdf" يصبح "my%20file.pdf" عند ترميزه بشكل صحيح. إذا تمت إعادة تشفير السلسلة المشفرة — ربما عن طريق نموذج — فستصبح "my%2520file.pdf".

عندما يتلقى الخادم هذا ويفك تشفيره مرة واحدة، فإنه يرى "my%20file.pdf" كاسم ملف حرفي بدلاً من التعرف عليه على أنه "my file.pdf". أي تطبيقات تتوقع تلقي مرور فك تشفير واحد فقط ستتلقى نتيجة مشوهة. والأسوأ من ذلك هو أن المطور الذي يقوم بفك التشفير مرتين لإصلاح المشكلات المتعلقة بالقيم التي تم تشفيرها مرة واحدة فقط سوف يفسد البيانات الشرعية من خلال تمرير فك التشفير الإضافي.

مثال عملي: فك تشفير URL تمريرة واحدة مشفرة بشكل مزدوج - ما يكشفه كل تمرير ومتى يتوقف

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

يمكن لعملية إعادة التوجيه URL التي تم إنشاؤها عن طريق تسلسل المدخلات المقدمة من المستخدم مع وظيفة مساعد إطار العمل التشفير في كلا الخطوتين في وقت واحد. مثال عملي: يرسل المستخدم "اختبار&قيمة" من خلال نموذج HTML، ويقوم المتصفح بتشفيرها على أنها "اختبار%26قيمة". يرى إطار العمل النسبة المئوية للنص الحرفي ويقوم بترميزه، مما ينتج عنه "قيمة الاختبار%2526". فك ترميز واحد يعطي "قيمة الاختبار 26%"، ولا يزال خطأ.

عندما يكون التشفير المزدوج متعمدًا - يتم نقل URL داخل معلمة استعلام URL أخرى

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

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

الأخطاء الشائعة - فك التشفير حتى لا يتغير شيء، مما يفسد القيم التي تحتوي بشكل شرعي على %25

الخطأ الكلاسيكي والخطير هو فك التشفير بشكل متكرر حتى لا يتغير شيء، مما يؤدي إلى إفساد القيم التي تحتوي بشكل شرعي على علامات النسبة المئوية في البيانات الفعلية. تعتبر المعلمة مثل "discount%2525" (التي تمثل "%25" حرفيًا والتي تم ترميزها كقيمة معلمة، ثم يتم ترميزها مرة أخرى للنقل) صحيحة تمامًا حسب التصميم. يؤدي فك تشفيرها مرة واحدة إلى الحصول على "discount%25"، والذي لا يزال صحيحًا. يؤدي فك تشفيرها مرة ثانية إلى الحصول على "خصم%"، وهو أمر خاطئ ويؤدي إلى فقدان المعلومات.

قد يفترض أحد المطورين أن "%25" خطأ ويقوم بفك التشفير بشكل متكرر، مما يؤدي إلى فقدان علامة النسبة المئوية. بدلاً من ذلك، قم بفك التشفير بالضبط عدة مرات التي تتطلبها بنيتك: مرة واحدة للمعلمة، ومرتين متداخلتين. قم بعد الطبقات لمعرفة عمليات فك التشفير الصحيحة.

ما لا يغطيه هذا — ترميز الكيان HTML الموجود أعلى عناوين URL، والذي يعالجه HTML كيان الهروب

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

إذا لامس التشفير المئوي "my+file" أولاً، فسيصبح "my%2Bfile". إذا تبع ذلك فك تشفير النموذج، مع توقع وجود مسافة زائدة، فسيظل الأمر خاطئًا. الاتساق عبر الطبقات أمر ضروري. يجب أن يستخدم كل نظام نفس معيار التشفير، أو يجب توثيق كل طبقة بشكل واضح.

الخلاصة: قم بالتشفير مرة واحدة بالضبط لكل طبقة - كيف يتيح لك برنامج التشفير ووحدة فك التشفير URL فك تشفير مرور واحد في كل مرة ورؤية كل نتيجة وسيطة

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

اختبر الإصلاح بدقة عن طريق تمرير بيانات العينة عبر المسار الكامل من طرف إلى طرف وتأكد من وصول البيانات دون تغيير تمامًا إلى الوجهة. قم بتوثيق افتراض التشفير عند كل حد بوضوح: "ترجع نقطة النهاية هذه معلمات مشفرة بنسبة مئوية" أو "تتوقع هذه البرامج الوسيطة UTF-8 الأولية وتطبق التشفير عليها". قم بتضمين عدد مرات فك التشفير المتوقعة في تلك الوثائق للمطورين المستقبليين.