YamlBox

الويب والتشفير · 50دقيقة قراءة

URL الترميز: متى تهرب، ومتى تكسر الأشياء

يتم تجميع عناوين URL من أحرف تعني شيئًا ما للمحلل وأحرف هي مجرد بيانات، والترميز بالنسبة المئوية هو الطريقة التي يتم بها الفصل بين الاثنين. يقوم برنامج تشفير URL بتحويل الأخير إلى هروب `%XX` بحيث تظل القيمة التي تحتوي على `&`، `?` أو مسافة على قيد الحياة أثناء الرحلة. معظم أخطاء عناوين URL لا تؤدي إلى فشل الترميز على الإطلاق، بل إنها تقوم بترميز الجزء الخطأ، أو الترميز مرتين.

تم التحديث

ما يجب أن تكون مشفرة

تكون مجموعة صغيرة من الأحرف آمنة دائمًا - الأحرف والأرقام و`-` و`_` و`.` و`~`. كل شيء آخر إما محجوز أو يجب الهروب منه. الأحرف المحجوزة هي الأحرف المثيرة للاهتمام، لأنها قانونية في عنوان URL ولكن في مواضع محددة فقط: `?` يبدأ استعلامًا، `&` يفصل المعلمات، `=` يعين قيمة، `#` يبدأ جزءًا، `/` يفصل أجزاء المسار. ضع واحدًا منها داخل قيمة غير مشفرة وستكون قد قمت بإعادة كتابة بنية عنوان URL بصمت.

زائد أو %20

الفضاء هو المثال الكلاسيكي. في المسار، يجب أن تكون المسافة `%20`؛ `+` هناك علامة زائد حرفية. في نصوص `application/x-www-form-urlencoded` وسلاسل الاستعلام التي يقرأها محللو النماذج، يُفهم `+` على أنه مسافة. هذا الاختلاف هو السبب وراء إمكانية تشفير القيمة لشيء يعمل في سياق واحد وينكسر في سياق آخر، ولماذا تقدم أجهزة فك التشفير كلا التفسيرين.

قم بتشفير المكونات، وليس عناوين URL بأكملها. تشغيل عنوان URL كامل من خلال برنامج تشفير المكونات يفلت من `://` و`?`، مما يؤدي إلى إنتاج رابط لا يؤدي إلى أي شيء.

تمييز جافا سكريبت الذي يجذب الجميع

                encodeURI('https://x.com/a b?q=1')        // keeps :// ? = — for a whole URL
encodeURIComponent('a b?q=1')               // escapes ? and = — for one value
              

`encodeURI` يحافظ على بنية URL وهو مخصص للعنوان الكامل؛ `encodeURIComponent` يفلت من كل شيء مهم وهو مخصص لقيمة معلمة واحدة. يؤدي استخدام القيمة الخاطئة إلى إنتاج قيمة مكسورة 3 أو قيمة غير قابلة للإلغاء، والأعراض عكسية: رابط 404، أو سلسلة استعلام تفقد نصف معلماتها.

ترميز مزدوج وعناوين URL موقعة

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

فك التشفير لتصحيح الأخطاء

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

أداة تشفير / فك ترميز URL — الأسئلة المتداولة

هل يجب أن تكون المسافة %20 أم علامة زائد؟

استخدم `%20` في المسارات وفي أي عنوان URL تقوم بإنشائه بنفسك؛ كلاهما صالح في سلاسل الاستعلام، حيث يقرأ المحللون النموذجيون بشكل تقليدي `+` كمسافة. يحتاج فك التشفير إلى معرفة الاتفاقية التي أنتجت السلسلة.

لماذا يكسر الترميز URL مرتين؟

كل تمريرة تفلت من حرف الهروب: تصبح المسافة `%20`، ثم `%2520`. عند الوصول، يقوم الخادم بفك التشفير مرة واحدة ويتلقى تطبيقك نصًا حرفيًا `%20`. قم بالتشفير مرة واحدة، عند النقطة التي تصبح فيها القيمة الأولية جزءًا من عنوان URL.

ما الفرق بين encodeURI وencodeURIComponent؟

يترك `encodeURI` الأحرف الهيكلية مثل `://` و`?` و`&` و`=` سليمة، لذا فهو يناسب العنوان بالكامل. يتجنب `encodeURIComponent` هذه العناصر أيضًا، لذا فهو يناسب قيمة معلمة واحدة. إن الخلط بينها هو سبب معظم الروابط التي تم إنشاؤها معطلة.

الأدوات المذكورة في هذه التدوينة

تصفح القائمة الكاملة للأدوات 19

المزيد من المقالات للقراءة

جميع المشاركات 19 →