日本語ドメインは2003年からJPRSによって.jpの下で登録できるようになったが、実際のDNS上では常にxn--で始まるASCII文字列として存在しており、ひらがな・カタカナ・漢字を1つのラベルに混在させても、Punycodeの変換アルゴリズム自体はどの文字体系が使われているかを区別しない。
3つの文字体系が混在しても変換は同じ仕組み
日本語は同じ単語の中でひらがな・カタカナ・漢字を自然に混在させる珍しい言語だが、Punycodeにとってはすべて「ASCII範囲外のコードポイント」として同列に扱われる。つまり「東京とうきょう」のような混在ラベルでも、各文字の位置とコードポイントを順番にエンコードするだけで、文字体系ごとに特別な処理は行われない。
まれな漢字はサロゲートペアと絡む
基本的な漢字はUnicodeの基本多言語面(BMP)に収まっているが、人名や地名に使われる一部の異体字・historical kanji は補助漢字面(U+20000以降)に置かれており、JavaScriptなど内部でUTF-16を使う環境ではサロゲートペアとして扱われる。ドメイン名にこうした稀な漢字が含まれる場合、Punycodeへの変換処理がこの点を正しく扱えるかどうかが実務上の落とし穴になる。
よくある用途
- メールやリンク中の分かりにくい
xn--...文字列の背後にある実際のドメインを確認する。 - 日本語ドメインを、ASCIIしか受け付けないDNSパネルに設定する前にPunycode形式に変換する。
- 証明書やメールアドレスのIDN関連の問題を診断する。
ホモグリフ攻撃は日本のブランドにも無関係ではない
キリル文字の「а」はほとんどのフォントでラテン文字の「a」と区別がつかず、攻撃者はこれを利用して「аpple.com」のような、Punycodeで一意のxn--文字列にエンコードされつつ正規ブランドに見えるドメインを登録する。ラベルが複数の文字体系を疑わしい形で混在させている場合、最新のブラウザはデコードせずに生のxn--表記をそのまま表示する。