国際化ドメイン名 (IDN) の処理
このトピックでは、アプリケーションで国際化ドメイン名 (IDN) を操作する方法について説明します。 IDN は、ネットワーク ワーキング グループ RFC 3490: Internationalizing Domain Names in Applications (IDNA) が規定しています。 このドラフト標準の前は、IDN は分音記号のないラテン文字に限定されていました。 IDNA を使うと、分音記号ありのラテン文字と共に、非ラテン スクリプトの文字 (キリル語、アラビア語、中国語など) を IDN に含めることができます。 また、この標準では、IDN を ASCII のみのドメイン名にマップするための規則も確立しています。 そのため、ドメイン ネーム サーバー (DNS) を変更することなく、IDNA の問題をクライアント側で処理できます。
注意事項
RFC 3490 では、IDN の使用に関連する多くのセキュリティの問題を紹介しています。 詳細については、「セキュリティに関する考慮事項: 国際的な機能」の関連するセクションを参照してください。
Note
現在、IDNA は Unicode 3.2 に基づいています。
IDN を処理するための NLS API 関数
NLS には、アプリケーションが IDN を別の表現に変換するために使用できる次の変換関数が含まれています。 これらの関数の使用例については、NLS: 国際化ドメイン名 (IDN) 変換のサンプルに関する記事を参照してください。
- IdnToAscii。 IDN を Punycode に変換します。
- IdnToNameprepUnicode。 IDN から ASCII 名への変換の NamePrep 部分を実行します。 この関数を使って、文字列の正規の Unicode 表現を作成します。
- IdnToUnicode。 Punycode 文字列を通常の UTF-16 文字列に変換します。
NLS には、IDN テクノロジによってもたらされるセキュリティ リスクの一部を軽減するために使用できるいくつかの API 関数も定義されています。 Windows Vista 以降では、次の関数を使って、特定のロケールまたは複数のロケールに関連付けられたスクリプトから、指定した IDN の文字を完全に取得できることを確認します。 これらの関数の使用例については、NLS: 国際化ドメイン名 (IDN) の軽減策のサンプルに関する記事を参照してください。
- GetStringScripts。 特定の文字列で使われるスクリプトの一覧を提供します。
- GetLocaleInfo、GetLocaleInfoEx。 ロケール情報を取得します。 LCType を LOCALE_SSCRIPTS に設定して関数を使うと、特定のロケールで通常使われるスクリプトの一覧を取得できます。
- VerifyScripts。 スクリプトの一覧を比較します。 複数のロケールに対して検証するために、アプリケーションから GetLocaleInfo または GetLocaleInfoEx と VerifyScripts を複数回呼び出すことができます。
Windows XP と Windows Server 2003 上で実行されるアプリケーションの場合、関数 DownlevelGetLocaleScripts、DownlevelGetStringScripts、DownlevelVerifyScripts は、セキュリティ リスクを軽減する上で、上記の関数と同様の役割を果たします。 archive.org から "Microsoft Internationalized Domain Name (IDN) Mitigation API" をダウンロードできます。
Unicode 文字列を処理する
IDNA は、制御文字や私用領域 (PUA) の文字など、特定の禁止文字を含む文字列を除く、Unicode 文字列の正当なホスト名ラベルへの変換をサポートします。 アプリケーションでは、いくつかの NLS 変換関数で IDN_USE_STD3_ASCII_RULES フラグを使って、文字、数字、ハイフンマイナス (-) 文字以外の ASCII 文字が見つかった場合、または文字列の先頭または末尾がハイフンマイナス文字である場合に、関数を強制的に失敗させることができます。 これらの文字はドメイン名での使用が常に禁止されており、ドラフト標準では引き続き禁止されています。
割り当てられていないコード ポイントを処理する
IDN には、割り当てられていないコード ポイントを含めることはできません。 そのため、特定の変換関数の IDN_ALLOW_UNASSIGNED フラグによって Punycode へのマッピングが許可されている場合でも、Unicode 3.2 の時点では、文字に関連付けられ ("割り当てられ") ていないコード ポイントには IDN マッピングが定義されていません。 未割り当てのコード ポイントの一覧は、RFC 3454 で確認できます。
注意事項
アプリケーションで未割り当てのコード ポイントを Punycode としてエンコードすると、結果のドメイン名は無効なものになります。 IDNA の新しいバージョンでこれらの名前が有効になった場合、またはアプリケーションで無効な文字を除外して有効なドメイン名を作成しようとした場合、セキュリティが侵害される可能性があります。
未割り当てのコード ポイントは、プロトコル識別子や名前付きエンティティ (デジタル証明書内の名前や DNS ドメイン名の部分など) で使われる格納文字列では使用できません。 ただし、コード ポイントはクエリ文字列 (たとえば、デジタル証明機関や DNS 参照のユーザー入力名など) 内で使用できます。これは、格納されている識別子との照合に使われます。
注意事項
クエリ文字列では未割り当てのコード ポイントを使用できますが、アプリケーション内では使わないでください。 ユーザーが指定したクエリ文字列であっても、"スプーフィング" 攻撃のリスクがあります。 この種の攻撃で、悪意のあるホスト サイトは、アクセス対象のサイトから、第三者に機密情報を提供する可能性のある別のサイトへとユーザーを再ルーティングします。 たとえば、受信メールから文字列をコピーすることが、ブラウザーでリンクをクリックするのと同じリスクになる可能性があります。
ドメイン名を ASCII 名に変換する
アプリケーションでは、IdnToAscii 関数と特定の軽減関数を使って、IDN を ASCII に変換できます。
注意事項
バイナリ表現が大きく異なる文字列でも同一のものとして比較される可能性があるため、この関数はセキュリティ上の問題を引き起こす可能性があります。 詳細については、「セキュリティに関する考慮事項: 国際的な機能」の比較関数の説明を参照してください。
例
NLS: 国際化ドメイン名 (IDN) 変換のサンプルに関する記事には、IDN 変換関数の使用例が記載されています。 NLS: 国際化ドメイン名 (IDN) の軽減策のサンプルに関する記事には、IDN 軽減関数の使用例が記載されています。
関連トピック