Punycodeとは何ですか?
Punycode は、Unicode 文字列を DNS でサポートされている限られた ASCII 文字に変換する RFC 3492 で定義されるエンコーディングの構文です。 国際化ドメイン名(IDN)を可能とする技術基盤で、既存のDNSインフラと連携できる任意の言語のドメイン名を使用できます。
問題のPunycodeの解決
ドメインネームシステムは1980年代に、ASCII文字のみを念頭に置いて設計されています。 DNS ラベルは、以下を含むことができます。
- ルーダ文字(a-z)
- ディジット(0-9)
- ハイフン (-)
この制限は、主にラテン文字を使用しないインターネットユーザーの数億を除外します。 Punycode は、Unicode 文字列を有効な ASCII にエンコーディングすることでこのギャップをブリッジします。
Punycodeのエンコーディングの仕組み
Punycode は、ASCII 以外の文字をコンパクトな ASCII 表現にエンコーディングしながら、ASCII 文字を保持する巧妙なアルゴリズムを使用します。
エンコーディングプロセス
1. 分離文字: ASCIIと非ASCII文字に分割
2. Copy ASCII: 元の位置にあるすべてのASCII文字を保持する
3. 非ASCIIのエンコード:一般化された変数長さの整数の符号化を使用して下さい
4. プレフィックスを追加: プリペンド "xn--" は、Punycodeエンコーディングを示す
事例紹介
| オリジナル(Unicode) | エンコード(Punycode) |
|---|---|
| メニュー | xn--mnchen-3yaの特長 |
| ニッコー ホテル | xn-fiqs8sの特長 |
| メニュー | xn--mnchen-3ya.de |
| お問い合わせ | xn--fiq228c.com |
| Cafe.com(カフェ) | xn--caf-dma.com |
"xn--" プレフィックス
"xn--" プレフィックスは ACE (ASCII 互換エンコーディング)プレフィックスと呼ばれます。 ラベルにPunycodeでエンコードされたコンテンツを含むDNSのリゾルバやアプリケーションに信号を送ります。 この接頭辞:
- 常に小文字
- 通常の 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処理
IDN を含む URL を扱う場合:
// 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
セキュリティへの影響
任意のUnicode文字を表すPunycodeの能力は、セキュリティリスクを作成します。
##ビジュアルスプーフィング
攻撃者は、正当なサイトと同じに見えるドメインを登録することができます。
аррlе.com (Cyrillic 'а' and 'р')
apple.com (Latin letters)
両方の表示は、いくつかのフォントで同じですが、異なるドメインです。
##ブラウザ保護
スプーフィングに対処するため、ブラウザは保護を実行します。
1. Mixed Script Detection: 疑わしいスクリプトを混合するドメインのPunycodeを表示
2. 有効な検出: ASCIIのように見える文字を使ったフラグドメイン
3. ホワイトリスト: よく知られているTLDだけUnicodeの表示を許可して下さい
APIでPunycodeを使う
ドメインツールを作成する場合:
常にPunycodeを保存します。一貫性とデータベースのインデックス作成のために、ASCIIフォームを内部で使用してください。 Forms: 必要に応じて変換するUnicodeまたはPunycodeのいずれかをユーザに入力してみましょう。 表示Unicode**:ユーザ・インタフェースの人読み可能な形態を示して下さい。function normalizeDomain(input) {
const punycode = require('punycode/');
// Convert to lowercase Punycode for internal use
return punycode.toASCII(input.toLowerCase());
}
Punycodeは、ほとんどのユーザーには透明ですが、開発者が国際化したWebアプリケーションを構築するための重要な知識です。