ترميز Base64 الآمن لعناوين URL: ما هو ولماذا يهم
ما هو ترميز Base64 الآمن لعناوين URL؟
ترميز Base64 الآمن لعناوين URL (ويسمى أيضًا Base64url) هو متغير من Base64 القياسي يستبدل الأحرف التي لها معانٍ خاصة في عناوين URL وأسماء الملفات ببدائل آمنة. يستخدم Base64 القياسي + و / كجزء من أبجديته المكونة من 64 حرفًا، بالإضافة إلى = للحشو، وجميعها تسبب مشاكل في عناوين URL وسلاسل الاستعلام ومسارات الملفات.
يحل Base64url هذه المشكلة باستبدالين بسيطين:
| Base64 القياسي | Base64 الآمن لعناوين URL |
|-----------------|-----------------|
| + (زائد) | - (ناقص) |
| / (شرطة مائلة) | _ (شرطة سفلية) |
| = (حشو) | محذوف (عادةً) |
لماذا يكسر Base64 القياسي عناوين URL
عندما تظهر سلسلة مُرمّزة بـ Base64 تحتوي على + أو / في عنوان URL، يصبح سلوك المتصفح والخادم غير متوقع.
مشكلة +
في سلاسل استعلام URL، يُفسَّر الحرف + كمسافة. يأتي هذا السلوك من مواصفة application/x-www-form-urlencoded ويتسبب في احتواء البيانات المفكوكة على مسافات غير متوقعة.
على سبيل المثال، سلسلة Base64 مثل Pj4+Pz8/Pw== تحتوي على أحرف +. إذا ظهرت هذه في معامل URL ?token=Pj4+Pz8/Pw==، فسيرى الخادم ?token=Pj4 Pz8/Pw== — يتحول + إلى مسافة.
مشكلة /
في مسارات URL، الحرف / هو فاصل مسار. سلسلة Base64 مثل ab/CD+Ef== تحتوي على / سيتم تفسيرها كمستوى دليل. إذا ظهر هذا في مقطع URL، فقد يسيء كل من العميل والخادم تفسير البنية.
مشكلة =
يُستخدم الحرف = لأزواج المفتاح والقيمة في سلاسل الاستعلام. يمكن أن يكون = اللاحق في ?data=SGVsbG8= غامضًا — هل = جزء من حشو Base64 أم من صيغة معامل الاستعلام؟
بينما يمكن للترميز النسبي (percent-encoding) إصلاح هذه المشكلات (+ يصبح %2B، / يصبح %2F)، إلا أنه يضخم طول السلسلة ويجعل التصحيح أصعب. Base64url هو حل أنظف.
كيف يعمل Base64url
تم تعريف Base64url رسميًا في RFC 4648 القسم 5. يستخدم نفس الخوارزمية تمامًا مثل Base64 القياسي — 3 بايتات تصبح 4 أحرف — ولكن مع استبدال حرف واحد في الموضعين 62 و 63 من الأبجدية:
- فهرس الأبجدية 62:
+→-(ناقص) - فهرس الأبجدية 63:
/→_(شرطة سفلية)
عادةً ما يتم حذف الحشو (=)، حيث يمكن استنتاجه من طول السلسلة عند فك الترميز. تكون سلسلة Base64url دائمًا مكونًا صالحًا لعنوان URL دون حاجة إلى تخطي إضافي.
قبل وبعد
إليك كيف تبدو نفس البيانات الثنائية في كلا التنسيقين:
Standard: Pj4+Pz8/Pw==
URL-safe: Pj4-Pz8_Pw
أين يُستخدم Base64url
رموز JSON Web Tokens (JWT)
JWT هو أبرز مستخدم لـ Base64url. يتكون كل JWT من ثلاثة أجزاء — الرأس والحمولة والتوقيع — كل منها مُرمّز بـ Base64url ومفصول بنقاط:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNqP0m2iTgCjD0
لاحظ الشرطات والشرطات السفلية — لا توجد علامات زائد أو شرطات مائلة. إذا استخدم JWT Base64 القياسي، فستتعطل الرموز عند تمريرها كمعاملات URL، وهي الطريقة الأكثر شيوعًا لاستخدامها في تطبيقات الويب.
OAuth و OpenID Connect
يعتمد كل من OAuth 2.0 و OpenID Connect على JWT لرموز الوصول ورموز الهوية، مما يجعل ترميز Base64url أساسيًا للمصادقة الحديثة. تنقل تدفقات authorization code و implicit flow و client credentials flow جميعها رموزًا تستخدم Base64url.
واجهات برمجة تطبيقات الويب ومعاملات الاستعلام
تقبل العديد من واجهات REST و GraphQL API البيانات المُرمّزة بـ Base64 في معاملات الاستعلام لمؤشرات التصفح (pagination cursors) أو عوامل التصفية أو الحمولات المُرمّزة. يضمن Base64url عمل هذه المعاملات بشكل صحيح دون ترميز URL إضافي.
مثال من العالم الحقيقي — تصفح API باستخدام المؤشر:
GET /api/users?cursor=MjAyNC0wMS0xNVQxMDozMDowMFo
تستخدم واجهة برمجة تطبيقات GitHub هذا النمط بالضبط لتصفح مجموعات النتائج الكبيرة.
أسماء الملفات وتخزين الملفات
تشكل سلاسل Base64url أسماء ملفات آمنة لأنها لا تحتوي على فواصل مسارات (/)، ولا أحرف خاصة تربك أنظمة الملفات، ولا أحرف غير صالحة على Windows (:، *، ?، إلخ).
شبكات توصيل المحتوى ومفاتيح الذاكرة المؤقتة
غالبًا ما تستخدم شبكات CDN وطبقات التخزين المؤقت القيم المُرمّزة بـ Base64url كمفاتيح ذاكرة مؤقتة. سيُنشئ Base64 القياسي مع / تسلسلات هرمية وهمية للأدلة في مساحة أسماء الذاكرة المؤقتة، مما يؤدي إلى مفاتيح غامضة.
التحويل بين Base64 القياسي و Base64url
التحويل بين المتغيرين مباشر في أي لغة:
JavaScript
// Standard Base64 to URL-safe Base64
function base64ToBase64url(base64) {
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
// URL-safe Base64 to Standard Base64
function base64urlToBase64(base64url) {
let result = base64url.replace(/-/g, '+').replace(/_/g, '/');
// Restore padding
while (result.length % 4) {
result += '=';
}
return result;
}
Node.js
توفر Node.js دعمًا أصليًا لـ Base64url منذ الإصدار 15.7.0:
// Encode to Base64url
const encodedUrl = Buffer.from('Hello, world!').toString('base64url');
console.log(encodedUrl);
// Output: SGVsbG8sIHdvcmxkIQ
// Decode from Base64url
const decoded = Buffer.from(encodedUrl, 'base64url').toString('utf-8');
console.log(decoded);
// Output: Hello, world!
Python
import base64
# Encode to Base64url
encoded = base64.urlsafe_b64encode(b"Hello, world!")
print(encoded.decode())
# Output: SGVsbG8sIHdvcmxkIQ==
# Decode from Base64url
decoded = base64.urlsafe_b64decode(encoded)
print(decoded.decode())
# Output: Hello, world!
متى تستخدم Base64 القياسي مقابل Base64url
استخدم Base64 القياسي عندما:
- ترميز مرفقات البريد الإلكتروني (معيار MIME يتطلب ذلك)
- إنشاء عناوين URL بيانات لتضمين HTML/CSS
- تخزين البيانات في قواعد البيانات حيث لا تهم سلامة URL
- التفاعل مع الأنظمة القديمة التي تتوقع Base64 القياسي
استخدم Base64url عندما:
- إنشاء أو تحليل رموز JWT
- تمرير البيانات المُرمّزة في معاملات استعلام URL أو مقاطع المسار
- إنشاء أسماء ملفات من البيانات الثنائية
- إنشاء مفاتيح ذاكرة مؤقتة أو معرفات
- العمل مع رموز OAuth أو OpenID Connect
جرّب ترميز Base64 الآمن لعناوين URL عبر الإنترنت
استخدم أداة ترميز وفك ترميز Base64 المجانية عبر الإنترنت للتحويل بين تنسيقي Base64 القياسي و Base64 الآمن لعناوين URL. الصق بياناتك، واختر المتغير الذي تريده، واحصل على النتيجة فورًا.