Punycode

ドメイン基礎
Unicode ドメイン名を ASCII 互換形式に変換するエンコーディング システム。国際化ドメイン名が DNS で機能することを可能にします。
← 用語集に戻る

Punycodeとは何ですか?

Punycode は、Unicode 文字列を DNS でサポートされている限られた ASCII 文字に変換する RFC 3492 で定義されるエンコーディングの構文です。 国際化ドメイン名(IDN)を可能とする技術基盤で、既存のDNSインフラと連携できる任意の言語のドメイン名を使用できます。

問題のPunycodeの解決

ドメインネームシステムは1980年代に、ASCII文字のみを念頭に置いて設計されています。 DNS ラベルは、以下を含むことができます。

この制限は、主にラテン文字を使用しないインターネットユーザーの数億を除外します。 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のリゾルバやアプリケーションに信号を送ります。 この接頭辞:

練習の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アプリケーションを構築するための重要な知識です。

この知識を実践する

DomScan の API を使用してドメインの可用性、状態などを確認します。