ما هو Punycode؟
Punycode هو صيغة ترميز معرّفة في RFC 3492 تحوّل سلاسل Unicode إلى مجموعة ASCII المحدودة التي يدعمها DNS. وهو الأساس التقني الذي يجعل أسماء النطاقات المدوّلة (IDNs) ممكنة، إذ يتيح لأسماء النطاقات بأي لغة العمل مع بنية DNS الحالية.
المشكلة التي يحلها Punycode
صُمم نظام أسماء النطاقات في ثمانينيات القرن الماضي مع مراعاة أحرف ASCII فقط. ولا يمكن أن تحتوي تسميات DNS إلا على:
- الأحرف اللاتينية الصغيرة (a-z)
- الأرقام (0-9)
- الشرطات (-)
استبعد هذا القيد مليارات مستخدمي الإنترنت الذين لا يستخدمون الأبجدية اللاتينية أساساً. ويسد Punycode هذه الفجوة بترميز أي سلسلة Unicode إلى ASCII صالح.
كيف يعمل ترميز Punycode
يستخدم ترميز Punycode خوارزمية ذكية تحافظ على أحرف ASCII، بينما تحوّل الأحرف غير ASCII إلى تمثيل ASCII مدمج صالح للاستخدام في DNS.
عملية الترميز
1. فصل الأحرف: تقسيم الأحرف إلى ASCII وغير ASCII
2. نسخ ASCII: إبقاء جميع أحرف ASCII في مواضعها الأصلية
3. ترميز غير ASCII: استخدام ترميز عام للأعداد الصحيحة متغير الطول
4. إضافة البادئة: إضافة «xn--» للدلالة على ترميز Punycode
أمثلة
| النص الأصلي (Unicode) | التمثيل المرمّز (Punycode) |
|---|---|
| münchen (ألماني) | xn--mnchen-3ya |
| 北京 (صيني) | xn--fiqs8s |
| münchen.de (ألماني) | xn--mnchen-3ya.de |
| 中文.com (صيني) | xn--fiq228c.com |
| café.com (فرنسي) | xn--caf-dma.com |
بادئة «xn--»
تُسمى بادئة «xn--» بادئة ACE (ASCII Compatible Encoding). وهي تشير إلى محللات DNS والتطبيقات إلى أن التسمية تحتوي على محتوى مرمّز بـ Punycode. وهذه البادئة:
- تكون دائماً بأحرف صغيرة
- لا تظهر في أسماء النطاقات ASCII العادية
- تطلق فك ترميز Unicode في البرامج المتوافقة
Punycode عملياً
معالجة المتصفح
تتعامل المتصفحات الحديثة مع Punycode تلقائياً:
User types: 中文.com
Browser sends: xn--fiq228c.com (to DNS)
Browser displays: 中文.com (in address bar)
تطبيق المطور
JavaScript (Node.js):const punycode = require('punycode/');
// Encode to Punycode
const encoded = punycode.toASCII('münchen.de');
// Result: xn--mnchen-3ya.de
// Decode from Punycode
const decoded = punycode.toUnicode('xn--mnchen-3ya.de');
// Result: münchen.de
Python:
domain = 'münchen.de'
encoded = domain.encode('idna').decode('ascii')
# Result: xn--mnchen-3ya.de
معالجة عناوين URL
عند العمل مع عناوين URL التي تحتوي على IDNs:
// URL API handles Punycode automatically
const url = new URL('https://中文.com/path');
console.log(url.hostname); // xn--fiq228c.com
console.log(url.href); // https://xn--fiq228c.com/path
الآثار الأمنية
إن قدرة ترميز Punycode على تمثيل أي حرف Unicode تنشئ مخاطر أمنية لنطاقات الويب:
انتحال بصري
يمكن للمهاجمين تسجيل نطاقات تبدو مطابقة لمواقع شرعية:
аррlе.com (Cyrillic 'а' and 'р')
apple.com (Latin letters)
قد يظهر النطاقان متطابقين في بعض الخطوط، لكنهما نطاقان مختلفان.
حماية المتصفحات
لمواجهة الانتحال، تطبق المتصفحات وسائل حماية:
1. كشف الخطوط المختلطة: عرض Punycode للنطاقات التي تخلط الخطوط بصورة مريبة
2. كشف الأحرف المتشابهة: الإبلاغ عن النطاقات التي تستخدم أحرفاً تشبه ASCII
3. القوائم المسموح بها: السماح بعرض Unicode فقط لنطاقات TLD المعروفة
التعامل مع Punycode في واجهات API
عند بناء أدوات النطاقات:
خزّن Punycode دائماً: استخدم صيغة ASCII داخلياً للاتساق والفهرسة في قاعدة البيانات. اقبل الصيغتين: اسمح للمستخدم بإدخال Unicode أو Punycode، وحوّل الصيغة عند الحاجة. اعرض Unicode: أظهر الصيغة المقروءة للبشر في واجهات المستخدم.function normalizeDomain(input) {
const punycode = require('punycode/');
// Convert to lowercase Punycode for internal use
return punycode.toASCII(input.toLowerCase());
}
يكون Punycode شفافاً لمعظم المستخدمين، لكنه معرفة أساسية للمطورين الذين يبنون تطبيقات ويب مدوّلة.