الخطأ الذي علمني احترام نسبة الترميز كان عبارة عن إعادة توجيه OAuth التي فشلت لعميل واحد بالضبط. كان لدى WP Adminify تكامل Google Fonts تمت مصادقته من خلال OAuth، وكان أحد المستخدمين - وهو موزع استضافة يقوم بتشغيل بعض إعدادات الوكيل العكسي التي ما زلت لا أفعلها '؛ أفهمها تمامًا - استمر في الحصول عليها redirect_uri_mismatch أخطاء. الجميع كان بخير. قضيت الجزء الأكبر من يومين في إلقاء اللوم على تكوين الخادم الخاص به. ثم نظرت أخيرًا إلى عنوان URL الفعلي الذي كان يرسله متصفحه، حرفًا بحرف، وكان هناك: %2520 حيث كان ينبغي أن تكون المساحة. كان وكيله يقوم بتشفير redirect_uri. كان البرنامج المساعد الخاص بي أيضاً ترميزه. تلقت Google عنوان URL حيث تم تشفير المساحة مرتين - %20 أصبح %2520- ورفض المصافحة بأكملها. سطرين من التعليمات البرمجية أصلحها. يومين للعثور عليه.
كان ذلك '؛ وحتى كارثة التشفير الأولى. قبل سنوات، قام I'؛d بإنشاء رابط حملة لتشغيل مكون إضافي باستخدام معلمة UTM التي تحتوي على علامة الضم الأولية - شيء من هذا القبيل utm_campaign=black&friday. أظهرت لوحة معلومات التحليلات حملة غامضة تسمى black ومعلمة وهمية تسمى friday هذا لا يطابق شيئا. قامت علامة العطف بتقسيم المعلمة الخاصة بي بصمت إلى قسمين. لا خطأ. لا تحذير. فقط بيانات خاطئة بهدوء لمدة أحد عشر يومًا قبل أن ألاحظ الأرقام '؛t إضافة.
هنا'؛s الشيء المتعلق بتشفير URL: it'؛s إحدى تلك المشكلات التي تبدو تافهة حتى تصبح '؛t. القواعد موجودة في مواصفات 2005 (RFC 3986)، واقع المتصفح يعيش في مواصفات مختلفة (ال WHATWG يمنحك URL Standard)، ويمنحك JavaScript ثلاث وظائف مختلفة تقوم جميعها بأشياء مختلفة قليلاً، ويمنحك PHP وظيفتين أخريين. أخطئ في الأمر ولا تفعل '؛ تتعرض لعطل - تحصل على معلمات مبتورة وتدفقات OAuth مكسورة وروابط تعمل في Chrome ولكنها تموت في عميل بريد إلكتروني.
لذلك قمت ببناء جهاز التشفير/وحدة فك التشفير الذي كنت أرغب دائمًا في الانضمام إليه تولز.ديف. يغطي هذا الدليل كيفية استخدامه، والأهم من ذلك، كيفية عمل ترميز النسبة المئوية فعليًا، وبالتالي فإن الدليل التالي %2520 في سجلاتك يستغرق دقيقتين بدلا من يومين.
ليرة تركية؛DR: لتشفير عنوان URL أو فك تشفيره عبر الإنترنت، الصق سلسلتك في Toolz.dev URL Encoder/Decoder، اختر الوضع، واضغط على تشفير أو فك تشفير. فهو يتعامل مع UTF-8 والرموز التعبيرية بشكل صحيح، ويقوم زر المبادلة بتغذية الإخراج مرة أخرى إلى الإدخال حتى تتمكن من تقشير القيم المشفرة المزدوجة (
%2520) فصل طبقة واحدة في كل مرة. كل شيء يعمل من جانب العميل، لذا فإن الرموز المميزة ومعرفات الجلسة في عناوين URL الخاصة بك لا تلمس الخادم أبدًا. تشفير المعلمة قيم مع وضع المكون؛ قم بتشفير عناوين URL الكاملة فقط عندما تعرف السبب.
الميزات الرئيسية
التشفير وفك التشفير في أداة واحدة
نصف الوقت الذي أحتاج فيه إلى تشفير القيمة. النصف الآخر I'؛ يحدق في عنوان URL المعقد من ملف سجل ويحتاج إلى فك تشفيره إلى شيء قابل للقراءة. تقوم الأداة بذلك من مربع إدخال واحد - وضع التشفير وفك التشفير بجوار بعضهما البعض كزرين، لذلك هناك '؛ لا تبحث عن صفحة منفصلة. لصق سلسلة مشفرة والضغط على فك التشفير؛ اكتب قيمة استعلام أولية واضغط على Encode. كما أنها تقوم أيضًا برحلات ذهابًا وإيابًا بشكل نظيف: التشفير وفك التشفير واستعادة السلسلة الأصلية، بايت للبايت. يبدو ذلك واضحًا، لكن I'؛ لقد استخدمت أدوات عبر الإنترنت تشوه علامات الزائد في رحلة ذهابًا وإيابًا لأنها تستطيع '؛ لا تقرر المواصفات التي كانوا يتبعونها. هذا واضح بشأن ما يفعله '؛s في كل خطوة، وهو بالضبط ما تريده عندما تقوم '؛إعادة تصحيح الأخطاء.
أوضاع ترميز المكون مقابل URL الكامل
هذا التمييز هو المكان الذي تولد فيه معظم أخطاء التشفير. يقوم وضع المكون بتشفير كل ما هو '؛t غير محجوز - بما في ذلك /، ?، &، و =- وهو ما تريده لقيمة معلمة واحدة. يترك وضع عنوان URL الكامل الأحرف الهيكلية بمفردها، لذا يظل عنوان URL يعمل كعنوان URL، وهو ما تريده عندما تقوم '؛ بإعادة تنظيف العنوان بالكامل. يؤدي استخدام الوضع الخاطئ إما إلى كسر بنية عنوان URL الخاص بك أو ترك الأحرف الخطرة غير مشفرة. تضع الأداة كلا الوضعين على مسافة نقرة واحدة في قائمة منسدلة واحدة، تحمل علامة وظيفة JavaScript التي يتوافق معها كل منهما - encodeURIComponent، encodeURI، application/x-www-form-urlencoded. لقد ذهبت ذهابًا وإيابًا في تلك التسمية. تسميات النية ("؛ ترميز قيمة وquot؛، "؛ ترميز عنوان URL وquot كامل؛) ستكون أكثر برودة، لكن أسماء الوظائف تعني اللوحة المرجعية الموجودة أسفل الخرائط واحدًا لواحد على الكود you'؛re على وشك الكتابة، وthat'؛s اللحظة التي يتواجد فيها معظم الأشخاص بالفعل. إذا كنت أنت '؛ لقد كتبت من أي وقت مضى encodeURI عندما قصدت encodeURIComponent- لدي أكثر من مرة - اللوحة موجودة لالتقاطها قبل الشحن.
يتعامل مع UTF-8 والرموز التعبيرية والشخصيات الدولية
يكتب café وتحصل caf%C3%A9- ال é تم توسيعه بشكل صحيح إلى بايتتين UTF-8. اكتب رمزًا تعبيريًا وستحصل على أربعة بايتات مشفرة بنسبة بالمائة. هذا هو المكان الذي توجد فيه الأدوات القديمة وجافا سكريبت المهملة escape() تنهار الوظيفة: فهي تفترض اللاتينية 1 أو تنتج غير قياسية %uXXXX التسلسلات التي لا يمكن لأي خادم تحليلها. إذا كنت '؛قم ببناء عناوين URL ذات المحتوى الذي أنشأه المستخدم - الأسماء، واستعلامات البحث، وأسماء المدن بأي لغة هي '؛ باللغة الإنجليزية - معالجة UTF-8 الصحيحة هي '؛ وهي لطيفة. النص البنغالي، والرخويات العربية، ومصطلحات البحث الصينية: جميعها تقوم بالتشفير إلى تسلسلات RFC 3986 بالمائة صالحة والتي يتم فك تشفيرها بشكل مماثل على الطرف الآخر.
زر مبادلة للقيم المشفرة المزدوجة
ال %2520 فخ - مشفر بالفعل %20 الحصول على التشفير مرة أخرى - كلفني يومين مرة واحدة، لذا فهذه العملية شخصية. فك التشفير هو عملية ذات طبقة واحدة %2520 فك التشفير ل %20، ليس إلى الفضاء، لأنه %25 يكون ترميز %. تمريرة واحدة تمنحك طبقة واحدة. زر المبادلة (⇄) ينقل الإخراج مرة أخرى إلى مربع الإدخال بحيث تكون التمريرة التالية على بعد نقرة واحدة. أنا '؛ لقد قمت بفك تغليف عناوين URL بثلاث طبقات عميقة بعد مرورها عبر وكيل وخدمة إعادة التوجيه ومغلف رابط البريد الإلكتروني - التبديل وفك التشفير والمبادلة وفك التشفير حتى تتوقف السلسلة عن التغيير. هذا & اقتباس؛ يتوقف عن التغيير والاقتباس؛ اللحظة هي الإشارة الفعلية التي تبحث عنها أنت و#39؛. كن صادقًا بشأن ماهية هذا: it'؛s حلقة يدوية، وليست كاشفًا. الأداة لا '؛t علامة %25XX بالنسبة لك، وأنا أتحرك ذهابًا وإيابًا حول ما إذا كان ينبغي ذلك - فك التشفير التلقائي حتى يصبح مستقرًا مناسبًا حتى يدمر بصمت القيمة التي تحتوي بشكل شرعي على علامة النسبة المئوية.
ثلاثة أوضاع، لوحة مرجعية صريحة واحدة
يحمل محدد الوضع ثلاثة خيارات - المكون، وعنوان URL الكامل، وترميز النموذج - وتوضح اللوحة الموجودة أسفله بالضبط الأحرف التي يهرب منها هذا الوضع، والتي يحتفظ بها، وتعرض مثالًا عمليًا. لقد أضفته لأنني لا أستطيع أن أتذكر ما إذا كان encodeURIComponent يترك ~ وحده (يفعل) أو ما إذا كان ! و * البقاء على قيد الحياة (وهذا ما يفاجئ الناس، حيث أن RFC 3986 يصنفهم على أنهم ديليمات فرعية وليس غير محجوزة). بدلاً من حفظ ثلاث وظائف JavaScript'؛ المراوغات، يمكنك اختيار الوضع عن قصد وقراءة ما هو '؛s على وشك القيام به. هذا النص المرجعي هو الجزء الذي أستخدمه أكثر، وهو '؛s الشيء I'؛d want إذا كنت أقف على الصفحة باردة في الساعة 1 صباحًا.
100% من جانب العميل - لا شيء يترك متصفحك
فكر في ماذا '؛s فعليًا داخل عناوين URL التي تقوم بفك تشفيرها: رموز ترخيص OAuth، والرموز المميزة لإعادة تعيين كلمة المرور، ومعرفات الجلسة، وعناوين البريد الإلكتروني في روابط إلغاء الاشتراك، ومفاتيح API، وبعض إطارات العمل محشوة بشكل مفيد في سلسلة استعلام. الصقها في أداة من جانب الخادم وستصل إلى سجلات الوصول الخاصة بشخص ما '؛، والتي يتم الاحتفاظ بها لمن يعرف المدة. يعمل برنامج تشفير Toolz.dev بالكامل في متصفحك - يتم التحويل عبارة عن بضعة أسطر من JavaScript يتم تنفيذها محليًا، ولا يتم تقديم أي طلب مع بياناتك. افتح DevTools وشاهد علامة تبويب الشبكة إذا كنت لا تفعل ذلك '؛t صدقني. بالنسبة لأي شيء مجاور للأمان، فإن جانب العميل هو '؛ وهي ميزة، '؛s الحد الأدنى للشريط.
مجاني، لا يوجد تسجيل، بلا حدود
لا يوجد جدار حساب، ولا يوجد تذمر يومي للأداة التي تقوم بتحويل السلسلة، لا "؛ الترقية إلى Pro لفك تشفير أكثر من 1000 حرف."؛ لقد قمت ببناء Toolz.dev لأنني سئمت من مواقع الأدوات المساعدة المختنقة بالإعلانات والتي تقاطع مهمة مدتها عشر ثوانٍ مع نشرة إخبارية منبثقة. قم بوضع إشارة مرجعية عليه، واستخدمه خمسين مرة في اليوم.
كيفية استخدام برنامج تشفير وفك تشفير URL
الخطوة 1: افتح الأداة واختر اتجاهك
اذهب الى Toolz.dev/tools/url-encoder وأسقط سلسلتك في المربع الأيسر. يوجد زران للعمل، التشفير وفك التشفير، وتختار واحدًا بعد اللصق بدلاً من تعيين الاتجاه أولاً. إذا كنت '؛ تبدأ من شيء قابل للقراءة (استعلام بحث، عنوان URL لإعادة التوجيه، أنت '؛ على وشك التضمين)، اضغط على تشفير. إذا كنت '؛ تبدأ من شيء مليء بإشارات النسبة المئوية (إدخال سجل، رأس مُحيل)، اضغط على فك التشفير. يهبط الإخراج في الجزء الأيمن مع زر نسخ في رأسه، ويجلس Swap and Clear بجوار زري الإجراء.
الخطوة 2: اختر المكون أو عنوان URL الكامل أو وضع النموذج
ترميز أ قيمة سيتم وضع ذلك داخل معلمة - redirect_uri، مصطلح بحث، أي شيء بعد = علامة؟ استخدم وضع المكون. إنه يشفر /، ?، &، و = حتى تتمكن قيمتك '؛t من كسر عنوان URL المحيط. ترميز أ عنوان URL كامل هذا يحتاج فقط إلى تنظيف المسافات والأحرف غير ASCII؟ استخدم وضع URL الكامل، الذي يحافظ على الأحرف الهيكلية. الوضع الثالث، المشفر بنموذج url، هو ترميز المكونات بمسافات مكتوبة كـ + بدلا من %20- اختره عندما تقوم '؛ ببناء يدوي application/x-www-form-urlencoded جسم. لاحظ أن الوضع يؤثر أيضًا على فك التشفير: في وضع النموذج، + يتم تحويله مرة أخرى إلى مساحة قبل فك التشفير؛ وفي الاثنين الآخرين يبقى علامة زائد حرفية. عندما تكون في شك: وضع المكون للقطع، ووضع URL الكامل للكل.
الخطوة 3: اقرأ الإخراج وشاهد علامات النسبة المئوية المتبقية
يظهر الإخراج في الجزء الأيمن. لفك التشفير، انظر ما إذا كانت النتيجة لا تزال تحتوي على ذلك %XX التسلسلات - إذا حدث ذلك، فسيتم تشفير القيمة أكثر من مرة. اضغط على Swap لنقل هذا الإخراج مرة أخرى إلى الإدخال، وفك التشفير مرة أخرى، وكرر حتى تتوقف السلسلة عن التغيير. إذا كان الإدخال مشوهًا (ضال % لا يتبعه رقمان سداسيان، مثل الحرف الحرفي 100%)، أنت و#39؛ ستحصل على خطأ صريح بدلاً من نصف فك التشفير الصامت، وهو السلوك الذي تريده عندما تقوم '؛ بتصحيح الأخطاء.
الخطوة 4: النسخ والتحقق
اضغط على زر النسخ والصق النتيجة حيث تنتمي. بالنسبة لأي شيء مهم - يقوم OAuth بإعادة التوجيه بشكل خاص - قم بإجراء فحص سلامة نهائي واحد: قم بلصق القيمة المشفرة مرة أخرى في وضع فك التشفير وتأكيدها ذهابًا وإيابًا إلى ما بدأت به بالضبط. ثلاثون ثانية من التحقق تدق يومين من redirect_uri_mismatch.
ترميز النسبة المئوية، RFC 3986، ولماذا تصبح المسافات إما %20 أو +
يمكن أن تحتوي عناوين URL بأمان فقط على مجموعة محدودة من الأحرف. يجب تهريب كل شيء آخر على شكل بايتات مشفرة بنسبة مئوية. كتاب القواعد هو RFC 3986 (2005)، ويقسم الشخصيات إلى معسكرين.
شخصيات غير محفوظة لا تحتاج أبدًا إلى الترميز: الحروف A–Z و a–z، أرقام 0–9وأربعة رموز - واصلة -، فترة .، تسطير _و تيلدا ~. ترميزها قانوني ولكن لا معنى له.
الشخصيات المحجوزة لديك وظائف هيكلية داخل عنوان URL: : / ? # [ ] @ (المحددات العامة) و ! $ & ' ( ) * + , ; = (المحددات الفرعية). تفصل النقطتين النظام عن المضيف. تبدأ علامة الاستفهام سلسلة الاستعلام. تفصل علامة العطف المعلمات. يعتمد ما إذا كان الحرف المحجوز يحتاج إلى تشفير بالكامل على حيث يظهر. أ / في المسار هيكل؛ أ / توجد بيانات داخل قيمة معلمة redirect_uri، ويجب أن تصبح كذلك %2F أو سيقوم الخادم بتحليل عنوان URL الخاص بك بشكل خاطئ.
الآليات: خذ الحرف، واحصل على بايت (بايت) UTF-8، واكتب كل بايت كـ % متبوعة برقمين سداسيين. أحرف ASCII هي بايت واحد - المسافة هي %20علامة العطف هي %26. لكن UTF-8 عبارة عن ترميز متعدد البايتات، لذا é هو اثنين بايت: %C3%A9. الرموز التعبيرية النموذجية هي أربع بايتات - 🚀 يتم تشفيرها كـ %F0%9F%9A%80. ولهذا السبب فإن الأدوات التي تفترض أن حرفًا واحدًا يساوي بايتًا واحدًا تفسد أي شيء خارج اللغة الإنجليزية البسيطة.
الآن، مشكلة المساحة - الشيء الوحيد الأكثر إرباكًا في ترميز URL. لكل RFC 3986، تصبح المسافة %20. لكن عمليات إرسال نموذج HTML تستخدم تسلسلًا مختلفًا application/x-www-form-urlencoded، تم تعريفها اليوم في معيار عنوان URL لـ WHATWG، و الذي - التي يقوم التنسيق بتشفير المسافات كـ +. كلاهما صحيح - في سياقاتهما الخاصة. مما يعني + تكون سلسلة الاستعلام غامضة: فقد تكون علامة زائد حرفية (قراءة RFC 3986) أو مساحة مشفرة (قراءة ترميز النموذج). إذا كنت '؛ لقد رأيت من قبل رقم هاتف يصل كـ 1234 5678 عندما أرسل شخص ما +1234...أنت '؛ لقد قابلت هذا الخطأ. نصيحتي: تنبعث دائما %20 للمساحات و %2B لعلامات الجمع الحرفية. لا أحد يخطئ في تحليل تلك.
تمنحك JavaScript ثلاث وظائف، وهي غير قابلة للتبديل. نظرا للسلسلة a=b&c d:
const s = "a=b&c d";
encodeURIComponent(s); // "a%3Db%26c%20d" — encodes =, &, and space
encodeURI(s); // "a=b&c%20d" — leaves = and & alone
escape(s); // "a%3Db%26c%20d" — deprecated; breaks on Unicode
encodeURIComponent يقوم بتشفير كل شيء باستثناء الأحرف غير المحجوزة (بالإضافة إلى ذلك !'()*- ميزة قديمة)، مما يجعلها آمنة لقيم المعلمات. encodeURI يحافظ على الأحرف المحجوزة بحيث يظل عنوان URL الكامل فعالاً - ولكن هذا يعني ذلك أيضًا فاز '؛ر حماية & داخل بياناتك. و escape() تم إهماله لسبب وجيه: فهو ينتج غير قياسي %uXXXX تسلسلات للأحرف غير اللاتينية-1. لا تستخدمه أبدًا في التعليمات البرمجية الجديدة.
يعكس PHP نفس الانقسام مع تطور: urlencode() ينتج ترميزًا على شكل نموذج (تصبح المساحات +) بينما rawurlencode() يتبع RFC 3986 (تصبح المساحات %20). إذا كنت '؛قم ببناء عناوين URL لأي شيء آخر غير نموذج POST body، rawurlencode() هو الذي تريد. لقد قمت بشحن كود WP Adminify مع الكود الخطأ في وقت مبكر؛ WordPress'؛ الخاصة add_query_arg() أنقذني مرات أكثر من I'؛ أود أن أعترف.
وأخيرا، مصيدة التشفير المزدوج. %20 هي مساحة مشفرة. تشفير تلك السلسلة مرة أخرى و % نفسه يصبح %25، يعطيك %2520. فك تشفيرها مرة واحدة وستحصل عليها %20 العودة - لا يزال مشفرة. يحدث هذا عندما تكون طبقتان من النظام "؛ بشكل مفيد وquot؛ التشفير: الكود الخاص بك بالإضافة إلى وكيل، وخدمة إعادة التوجيه بالإضافة إلى غلاف رابط البريد الإلكتروني. القاعدة التي تمنع ذلك: قم بالتشفير مرة واحدة بالضبط، في آخر لحظة ممكنة قبل أن تنتقل القيمة إلى عنوان URL، ولا تقوم أبدًا بتشفير شيء لم تقم به '؛ فقط قم بفك تشفيره أو إنشاءه بشكل خام.
حالات الاستخدام الشائعة
بناء سلاسل الاستعلام مع إدخال المستخدم
في أي وقت ينتقل فيه النص المكتوب بواسطة المستخدم إلى عنوان URL - مربعات البحث والمرشحات وقيم النماذج التي يتم تمريرها عبر GET - يجب أن يكون مشفرًا بالمكونات. مستخدم يبحث عنه Q&A tips يصبح ?q=Q%26A%20tips؛ غير مشفر، يرى الخادم بحثًا عنه Q ومعلمة غامضة A tips. أثناء التطوير، أستخدم تشفير URL لإنشاء القيم المتوقعة قبل كتابة التعليمات البرمجية، لدي مرجع صحيح معروف للاختبار ضده. It'؛s أيضًا أسرع طريقة للتسوية والاقتباس؛ هل يجب ترميز هذا الحرف؟"؛ الوسائط في مراجعة التعليمات البرمجية: لصقها في وضع المكون والمظهر. واجهات برمجة التطبيقات الحديثة مثل JavaScript'؛s URLSearchParams تعامل مع هذا تلقائيًا، ويجب عليك استخدامه - ولكن لا تزال بحاجة إلى ذلك يتحقق مخرجاتهم عندما ينكسر شيء ما، وهذه '؛s مهمة فك التشفير.
تصحيح أخطاء UTM وروابط الحملة
روابط التسويق تقوم بتشفير حقول الألغام. قيم UTM بمسافات أو أنابيب أو علامات الضم؛ الروابط التي تمر عبر مختصر URL، ثم خدمة البريد الإلكتروني '؛s انقر فوق أداة التتبع، ثم إعادة التوجيه - كل طبقة فرصة لإضافة التشفير أو تشويهه. عندما تظهر حملة خاطئة في التحليلات، تكون خطوتي الأولى هي نفسها دائمًا: لصق الرابط الكامل في وضع فك التشفير وقراءة ما تلقاه خادم التحليلات بالفعل. تسع مرات من أصل عشر يكون الجاني مرئيًا في ثوانٍ - خام & تقسيم المعلمة، أ + كان من المفترض أن يكون ذلك إضافة حرفية، أو أ %2520 خيانة الترميز المزدوج. بلدي black&friday كان من الممكن أن يكون الحادث بمثابة إصلاح مدته إحدى عشرة ثانية بدلاً من فجوة بيانات مدتها أحد عشر يومًا إذا قام I'؛d بذلك في اليوم الأول.
OAuth redirect_uri وعناوين URL لرد الاتصال
OAuth هو المكان الذي تصبح فيه أخطاء التشفير باهظة الثمن، لأن مقدمي الخدمة يفعلون ذلك مطابقة السلسلة الدقيقة على عناوين URI لإعادة التوجيه. إن redirect_uri عبارة عن عنوان URL كامل مضمن كقيمة معلمة داخل عنوان URL آخر - لذلك يجب أن يكون مشفرًا بالمكونات، مرة واحدة بالضبط. ترميزه بشكل ناقص و ? أو & بداخله يكسر عنوان URL الخارجي للتفويض. قم بتشفيرها بشكل مزدوج ويقوم الموفر بمقارنتها https%3A%2F%2F... ضد تسجيلك https://... ويعود redirect_uri_mismatch مع عدم وجود مزيد من التفاصيل. عند ظهور هذا الخطأ، قم بفك تشفير عنوان URL الفعلي للترخيص من متصفحك وشريط عناوين #39؛ وقارن قيمة redirect_uri حرفًا بحرف مقابل القيمة المسجلة لتطبيقك '؛s. إقرانه مع JWT فك التشفير لفحص الرموز المميزة التي تعود، ويمكنك تصحيح تدفق OAuth بالكامل دون مغادرة المتصفح.
فك تشفير عناوين URL Gnarly من السجلات ورؤوس المُحيلين
سجلات الخادم ورؤوس المُحيل مليئة بالحساء المشفر بالنسبة المئوية %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82 في مُحيل البحث، تقوم المسارات المشفرة ثلاث مرات من حركة مرور الروبوتات بتشفير الحمولات في الطلبات المشبوهة. فك تشفير هذه هو الطريقة التي تكتشف بها ما حدث بالفعل - سواء كان ذلك الغريب 404 مستخدمًا لديه استعلام سيريلي أو برنامج نصي يبحث عنه ../../etc/passwd خلف ثلاث طبقات من التشفير. وهذا أيضًا هو بالضبط الموقف الذي تكون فيه زاوية الخصوصية أكثر أهمية: تحتوي عناوين URL للسجل بشكل روتيني على رموز الجلسة وعناوين البريد الإلكتروني. فك تشفيرها في أداة من جانب العميل، وليس على خادم عشوائي يحتفظ بسجلاته الخاصة. لقد كتبت المزيد عن سير العمل هذا في دليل أدوات تصحيح أخطاء API.
اختبار API مع الضفيرة
تشكل قوقعتك وحليقتك حقل ألغام ثانيًا أعلى ترميز URL. & خلفيات عملية في باش، ? يؤدي إلى توسيع الكرة الأرضية في zsh - لذلك يفشل عنوان URL غير المقتبس وغير المشفر بطرق مربكة حتى قبل أن يصل إلى الشبكة. سير العمل الخاص بي: قم بتشفير كل قيمة معلمة في الأداة، وقم بتجميع عنوان URL، ولفه بعلامات اقتباس مفردة، ثم قم بتشغيل curl. عندما تقوم واجهة برمجة التطبيقات بإرجاع 400 لطلب "؛ يبدو صحيحًا، "؛ أقوم بفك تشفير عنوان URL الدقيق من الإخراج المطول (curl -v) لمعرفة ما تم إرساله بالفعل - كان الخطأ أكثر من مرة هو الجهاز الطرفي الخاص بي، وليس واجهة برمجة التطبيقات الخاصة بي. الضفيرة '؛س --data-urlencode يتعامل FLAG مع التشفير لأجسام POST، ولكن بالنسبة لسلاسل استعلام GET، فأنت '؛ في الغالب بمفردك، ويتفوق برنامج التشفير الموثوق به على التخمين.
مشاركة الروابط مع نص غير ASCII
مقالات ويكيبيديا بلغات أخرى، وروابط خرائط جوجل بأسماء الأماكن المحلية، وعناوين URL للمستندات التي تحتوي على رصاصات بنغالية أو عربية - انسخ واحدة من شريط العناوين الخاص بك وقد تحصل على إما جميلة يونيكود شكل أو جدار %E0%A6%AC- بايتات النمط، اعتمادًا على الحالة المزاجية للمتصفح '؛s. تقوم بعض تطبيقات الدردشة وعملاء البريد الإلكتروني باقتطاع أو تشويه نموذج Unicode الخام. يؤدي تشفير عنوان URL قبل المشاركة إلى إنتاج سلسلة ASCII خالصة تنجو من كل برنامج مراسلة وقائمة بريدية وعارض Markdown I'؛ لقد حاولت. وبالعكس، يؤدي فك التشفير إلى تحويل رابط مشترك غير قابل للقراءة مرة أخرى إلى شيء يمكن للإنسان التحقق منه قبل النقر عليه - وهو أمر يستحق القيام به قبل إعادة توجيه أي شيء يصل وكأنه ضوضاء خطية.
encodeURIComponent مقابل encodeURI مقابل الهروب (): أيهما يجب عليك استخدامه؟
ثلاث وظائف، واحدة افتراضية صحيحة. هنا '؛ المقارنة الصادقة:
encodeURIComponent() |
encodeURI() |
escape() |
|
|---|---|---|---|
| يشفر | كل شيء باستثناء A-Z a-z 0-9 - . _ ~ ! ' ( ) * |
كل شيء باستثناء غير محجوز + جميع الأحرف المحجوزة (: / ? # [ ] @ ! $ & ' ( ) * + , ; =) |
كل شيء باستثناء A-Z a-z 0-9 @ * _ + - . / |
| يصبح الفضاء | %20 |
%20 |
%20 |
& و = |
مشفرة (%26، %3D) |
غير مشفرة | مشفرة |
| التعامل مع يونيكود | تصحيح UTF-8 بايت | تصحيح UTF-8 بايت | مكسور - غير قياسي %uXXXX |
| يستخدم ل | قيم المعلمات، ومقاطع المسار، وأي شيء داخل عنوان URL | عنوان URL كامل لا تملكه '؛ تريد إعادة الهيكلة | لا شئ |
| حالة | قياسي، موصى به | قياسي، متخصص | مهمل |
موقفي، وأنا '؛ سأموت على هذا التل: يستخدم encodeURIComponent للقيم، دائما تقريبا. النموذج العقلي بسيط - إذا كان الخيط يسير داخل عنوان URL (قيمة استعلام، مقطع مسار، redirect_uri)، it'؛s مكون، ويحصل عليه encodeURIComponent. الحالات التي encodeURI من النادر حقًا: لديك عنوان URL كامل ومنظم بالفعل يحتوي على مسافات أو أحرف غير ASCII، وتريد تعقيمه دون لمس بنيته. ربما 5% من مكالمات التشفير في العالم الحقيقي. و escape() يجب ببساطة ألا يظهر أبدًا في التعليمات البرمجية المكتوبة بعد عام 2010 تقريبًا - فمخرجات Unicode الخاصة به هي '؛ وهي نسبة ترميز صالحة، وكل جهاز ربط حديث سوف يضع علامة عليه على أي حال.
فارق بسيط آخر: encodeURIComponent يترك ! ' ( ) * غير مشفرة لأسباب تاريخية، على الرغم من أن RFC 3986 يدرجها كمحددات فرعية محجوزة. بالنسبة لواجهات برمجة التطبيقات OAuth والتحليل الصارم، تضيف بعض المكتبات تمريرة ثانية لتشفير تلك الخمس أيضًا. إذا رفضت واجهة برمجة التطبيقات التي يصعب إرضاءها قيمك، فهذا '؛ مكان للبحث فيه - و برنامج تشفير URL '؛s يوضح لك وضع المكون الأحرف التي تم تحويلها بالضبط حتى تتمكن من المقارنة.
الأسئلة الشائعة
ما هو ترميز URL؟
ترميز URL (الترميز النسبي) هو آلية تمثيل الأحرف في عنوان URL الذي قد يكون غير آمن أو ذو معنى هيكليًا. يتم تحويل كل حرف مثير للمشاكل إلى بايت UTF-8 الخاص به، ويتم كتابة كل بايت كعلامة مئوية متبوعة برقمين سداسيين عشريين - تصبح المسافة %20، وتصبح علامة الضم %26. تم تعريف القواعد في RFC 3986. وهي موجودة لأن عناوين URL تسمح فقط بمجموعة أحرف محدودة، وأحرف مثل ؟ و&؛ لديك وظائف للقيام بها داخل بنية URL.
لماذا تتحول المسافات إلى %20 أحيانًا و+ مرات أخرى؟
مواصفات مختلفة. RFC 3986، الذي يحكم عناوين URL نفسها، يقوم بتشفير مسافة كـ %20. يقوم تنسيق التطبيق/x-www-form-urlencoded الذي تستخدمه عمليات إرسال نماذج HTML، والمحدد في معيار WHATWG URL، بتشفير مساحة كـ +. كلاهما صالح في سياقهما الخاص، ولهذا السبب يكون + في سلسلة الاستعلام غامضًا. الممارسة الآمنة: قم دائمًا بإنتاج %20 للمسافات و%2B لعلامات الزائد الحرفية - يتعامل كل محلل مع تلك بشكل صحيح.
ما الفرق بين encodeURI وencodeURIComponent؟
يقوم EncodeURIComponent بتشفير كل شيء تقريبًا، بما في ذلك /، ؟، &؛ و=، مما يجعله آمنًا للقيم الفردية الموضوعة داخل عنوان URL. يحتفظ encodeURI بتلك الأحرف المحجوزة بحيث يحافظ عنوان URL الكامل على بنيته. استخدم encodeURIComponent لقيم المعلمات وقطاعات المسار - وهي تقريبًا كل حالة في العالم الحقيقي - ويقوم بتشفير URI فقط عند تعقيم عنوان URL كامل دون إعادة هيكلته. استخدام encodeURI على قيمة تحتوي على &؛ سوف يكسر سلسلة الاستعلام الخاصة بك بصمت.
كيف يمكنني إصلاح عنوان URL مزدوج التشفير؟
يحدث التشفير المزدوج عندما يتم تشفير سلسلة مشفرة بالفعل مرة أخرى - %20 يصبح %2520 لأن % نفسها تتحول إلى %25. لإصلاحه، قم بفك تشفير السلسلة بشكل متكرر حتى لا تبقى تسلسلات %XX ويتوقف الإخراج عن التغيير. ثم ابحث عن طبقة نظامك المشفرة مرتين - عادةً الكود الخاص بك بالإضافة إلى وكيل أو خدمة إعادة التوجيه أو غلاف رابط البريد الإلكتروني - وقم بإزالة إحدى خطوات التشفير. القاعدة: قم بالتشفير مرة واحدة بالضبط، في اللحظة الأخيرة قبل دخول القيمة إلى عنوان URL.
هل من الآمن فك تشفير عناوين URL في أداة عبر الإنترنت؟
فقط إذا كانت الأداة تعمل من جانب العميل. تحتوي عناوين URL في كثير من الأحيان على رموز OAuth ورموز إعادة تعيين كلمة المرور ومعرفات الجلسة وعناوين البريد الإلكتروني. تتلقى الأداة من جانب الخادم كل ذلك وقد تحتفظ بها في سجلات الوصول إلى أجل غير مسمى. يقوم برنامج تشفير/فك تشفير URL الخاص بـ Toolz.dev بإجراء جميع التحويلات في متصفحك باستخدام JavaScript - لا يتم نقل أي بيانات في أي مكان، وهو ما يمكنك التحقق منه في علامة تبويب الشبكة الخاصة بالمتصفح '؛s. بالنسبة لأي شيء يحتوي على بيانات اعتماد أو رموز مميزة، يجب أن تكون المعالجة من جانب العميل غير قابلة للتفاوض.
هل أحتاج إلى ترميز عنوان URL بالكامل أو المعلمات فقط؟
فقط أجزاء البيانات - قيم المعلمات الفردية، وأحيانًا مقاطع المسار. يجب أن تظل الأحرف الهيكلية لعنوان URL نفسه (://بعد المخطط، ؟ بدء الاستعلام، &؛ بين المعلمات) غير مشفرة أو يتوقف عنوان URL عن العمل. قم بتشفير كل قيمة على حدة باستخدام ترميز نمط المكون، ثم قم بتجميع عنوان URL حولها. يكون تشفير عنوان URL الكامل من طرف إلى طرف صحيحًا فقط عندما يصبح عنوان URL هذا بحد ذاته قيمة داخل عنوان URL آخر، مثل OAuth redirect_uri.
هل يمكن لترميز URL التعامل مع الرموز التعبيرية والأحرف غير الإنجليزية؟
نعم - يعمل ترميز النسبة المئوية الحديث على بايتات UTF-8، لذا فإن أي حرف Unicode يعمل. يصبح الحرف ثنائي البايت مثل é%C3%A9، ويصبح الرمز التعبيري رباعي البايت أربعة بالمائة من التسلسلات، مثل %F0%9F%9A%80. تنشأ المشكلات فقط مع الأدوات القديمة أو وظيفة الهروب () المهملة JavaScript'؛s، والتي تفترض ترميزات أحادية البايت وتنتج مخرجات غير صالحة. يتعامل برنامج تشفير Toolz.dev مع UTF-8 الكامل بشكل صحيح في كلا الاتجاهين.
لماذا ينقطع عنوان URL الخاص بي عندما تحتوي المعلمة على علامة الضم؟
لأن &؛ هو المحدد بين المعلمات. إذا كانت القيمة تحتوي على علامة الضم الأولية - على سبيل المثال utm_campaign=black&؛ الجمعة - يقوم الخادم بتوزيعها كمعلمة تسمى utm_campaign بقيمة سوداء، بالإضافة إلى معلمة ثانية تسمى الجمعة. لم يتم رفع أي خطأ؛ بياناتك خاطئة بصمت. قم بتشفير علامة العطف كـ %26 داخل القيمة وستصل المعلمة سليمة. يعد هذا أحد أخطاء URL الأكثر شيوعًا والأقل وضوحًا.
ماذا يعني %2F في عنوان URL؟
%2F هو الشرطة المائلة للأمام المشفرة بنسبة مئوية. أنت #39؛ سنرى ذلك عندما يتم تشفير القيمة التي تحتوي على شرطة مائلة - مسار ملف، أو تاريخ مثل 07/07، أو عنوان URL متداخل - بشكل صحيح قبل وضعها في معلمة استعلام أو مقطع مسار. انتبه إلى أن بعض الخوادم والوكلاء (Apache، وإصدارات Tomcat الأقدم، وبوابات API المختلفة) يرفضون أو يفكون تشفير%2F بصمت في المسار لأسباب أمنية، لذلك إذا أدى طلب يحتوي على شرطة مائلة مشفرة إلى إرجاع 404، فإن التكوين من جانب الخادم عادةً ما يكون هو السبب، وليس التشفير الخاص بك.
كيف يمكنني تشفير عنوان URL بلغة Python أو PHP أو في سطر الأوامر؟
بايثون: urllib.parse.quote() لمقاطع المسار وquight_plus() لقيم الاستعلام على نمط النموذج. PHP: rawurlencode() ينتج مخرجات RFC 3986 مع %20 للمسافات، بينما ينتج urlencode() مخرجات على شكل نموذج مع +. سطر الأوامر: jq -rR @uri أو curl'؛s --data-urlencode flag. يتطابق كل واحد من هذه العناصر مع سلوك نمط المكون لهذه الأداة، لذا يمكنك إنشاء نموذج أولي للتشفير هنا والتحقق من أن الكود الخاص بك ينتج مخرجات متطابقة مع البايت.
إلتحاق بالركب
يعد ترميز URL مهارة صغيرة ذات مكافأة كبيرة. بمجرد أن تتمكن من القراءة %C3%A9 كـ é و بقعة %2520 كرائحة ترميز مزدوج، فئة كاملة من "؛ يعمل على جهازي وحاصل الاقتباس؛ الأخطاء - تدفقات OAuth المكسورة، وحملات UTM الوهمية، وواجهات برمجة التطبيقات التي ترفض الطلبات ذات المظهر المعقول تمامًا - تتحول من غامضة إلى ميكانيكية. القواعد مناسبة لبطاقة الفهرسة: تمر الأحرف غير المحجوزة، ويصبح كل شيء آخر UTF-8 بايت مثل %HH، ولا يتم تشفير القيم، ويتم التشفير مرة واحدة بالضبط.
احتفظ ب URL ترميز/فك تشفير URL إشارة مرجعية بجانب أشقائها - محول BASE64 بالنسبة لنظام التشفير الآخر، ستلتقي أنت و#39؛ في كل رأس مصادقة (I'؛ لقد كتبت ملفًا كاملاً دليل الترميز BASE64 على متى تستخدم أي)، و تشفير/فك تشفير كيانات HTML بالنسبة لطبقة التشفير الثالثة التي يحب محتوى الويب تكديسها في الأعلى ( دليل كيان HTML يغطي نسخة الهروب المزدوج من نفس الفخ الذي ضربته %2520) و ال تنسيق JSON لأي شيء يشير إليه عنوان URL الذي تم فك تشفيره.
وإذا كنت '؛re تجميع مجموعة تصحيح أخطاء أوسع تعتمد على المتصفح، فإن دليل أدوات الترميز يتصفح كيفية تناسب هذه الأدوات معًا في سير عمل حقيقي. كل شيء على Toolz.dev يعمل من جانب العميل، ولا يكلف شيئًا، ويقوم بعمل واحد بشكل جيد. هذا '؛ العرض التقديمي بأكمله - نفس العرض الذي أتمنى أن يكون قد قدمه لي شخص ما قبل أن أقضي يومين على %25 واحد في غير محله.



