Punycode Nedir?
Punycode, RFC 3492'de tanımlanan ve Unicode dizelerini DNS tarafından desteklenen sınırlı ASCII karakter kümesine dönüştüren bir kodlama sözdizisidir. Uluslararasılaştırılmış Alan Adları (IDN'ler) mümkün yapan teknik temeldir; tüm dillerden alan adlarının mevcut DNS altyapısı ile çalışmasını sağlar.
Punycode Çözen Sorunu
Alan Adı Sistemi 1980'lerde, yalnızca ASCII karakterleri göz önünde bulundurularak tasarlanmıştır. DNS etiketleri yalnızca şunları içerebilir:
- Küçük harfler (a-z)
- Sayılar (0-9)
- Tire işareti (-)
Bu sınırlama, ana olarak Latin alfabesi kullanmayan dilleri konuşan milyarları hariç tutmuştur. Punycode, herhangi bir Unicode dizesini geçerli ASCII'ye kodlayarak bu boşluğu kapatır.
Punycode Kodlaması Nasıl Çalışır
Punycode, ASCII karakterlerini korurken ASCII olmayan karakterleri kompakt bir ASCII temsili içine kodlayan akıllı bir algoritma kullanır.
Kodlama Süreci
1. Karakterleri Ayır: ASCII ve ASCII olmayan karakterlere böl
2. ASCII'yi Kopyala: Tüm ASCII karakterlerini orijinal konumlarında tut
3. ASCII Olmayan Karakterleri Kodla: Genelleştirilmiş değişken uzunluk tamsayı kodlaması kullan
4. Ön Ek Ekle: Punycode kodlamatasını belirtmek için "xn--" ekleme
Örnekler
| Orijinal (Unicode) | Kodlanmış (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--" Ön Eki
"xn--" ön ekine ACE (ASCII Uyumlu Kodlama) ön eki denir. DNS çözümleyicilerine ve uygulamalarına, etiketin Punycode kodlu içerik içerdiğini gösterir. Bu ön ek:
- Her zaman küçük harftir
- Normal ASCII alan adlarında asla görünmez
- Uyumlu yazılımda Unicode kod çözümlemesi tetikler
Uygulamada Punycode
Tarayıcı İşleme
Modern tarayıcılar Punycode'u otomatik olarak işler:
User types: 中文.com
Browser sends: xn--fiq228c.com (to DNS)
Browser displays: 中文.com (in address bar)
Geliştirici Uygulama
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 İşleme
IDN'ler içeren URL'lerle çalışırken:
// 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
Güvenlik Çıkarımları
Punycode'un herhangi bir Unicode karakterini temsil etme yeteneği güvenlik riskleri yaratır:
Görsel Aldatma
Saldırganlar, meşru sitelere görsel olarak özdeş alan adları kaydedebilir:
аррlе.com (Cyrillic 'а' and 'р')
apple.com (Latin letters)
Her ikisi de bazı yazı tiplerinde özdeş görünür, ancak farklı alan adlarıdır.
Tarayıcı Korumaları
Aldatmaya karşı savaşmak için tarayıcılar korumalar uygular:
1. Karışık Komut Algılaması: Şüphe duyulan IDN'ler için Punycode'u görüntüle
2. Kafa Karıştırıcı Algılaması: ASCII'yi taklit eden karakterler kullanarak alan adları işaretle
3. Beyaz Liste: Unicode görüntülemesine yalnızca bilinen TLD'ler için izin ver
API'lerde Punycode ile Çalışma
Alan adı araçları oluştururken:
Her Zaman Punycode Depola: Tutarlılık ve veritabanı dizinlemesi için dahili olarak ASCII biçimini kullan. Her İki Formu Kabul Et: Kullanıcıların Unicode veya Punycode'u girmesine izin ver; gerektiğinde dönüştür. Unicode Görüntüle: Kullanıcı arabiriminde insan tarafından okunabilir formu göster.function normalizeDomain(input) {
const punycode = require('punycode/');
// Convert to lowercase Punycode for internal use
return punycode.toASCII(input.toLowerCase());
}
Punycode çoğu kullanıcı için şeffaftır ancak uluslararasılaştırılmış web uygulamaları oluşturan geliştiriciler için gerekli bilgidir.