處理國際化網域名稱 (IDN)

本主題描述如何在應用程式中使用國際化功能變數名稱(IDN)。 IDN 是由網路工作組 RFC 3490 所指定:將應用程式 (IDNA) 中的域名國際化。 在此草稿標準之前,IDN 限制為不含變音符號的拉丁字元。 IDNA 允許 IDN 包含具有讀音符號的拉丁字元,以及非拉丁文腳本中的字元,例如斯拉夫文、阿拉伯文和中文。 標準也會建立將IDN對應至僅限 ASCII 功能變數名稱的規則。 因此,可以在客戶端處理 IDNA 問題,而不需要任何功能變數名稱伺服器 (DNS) 變更。

警告

RFC 3490 引進一些與使用IDN相關的安全性問題。 如需詳細資訊,請參閱安全性考慮:國際功能的相關章節

 

注意

IDNA 目前以 Unicode 3.2 為基礎。

 

處理IDN的NLS API函式

NLS 包含下列轉換函式,您的應用程式可用來將IDN轉換成不同的表示法。 如需使用這些函式的範例,請參閱 NLS:國際化功能變數名稱 (IDN) 轉換範例

  • IdnToAscii. 將 IDN 轉換為 Punycode。
  • IdnToNameprepUnicode。 執行IDN轉換為 ASCII 名稱的 NamePrep 部分。 此函式會建立字串的正式 Unicode 表示法。
  • IdnToUnicode。 將 Punycode 字串轉換成一般 UTF-16 字串。

NLS 也會定義數個 API 函式,可用來減輕 IDN 技術所呈現的某些安全性風險。 在 Windows Vista 和更新版本上,下列函式可用來驗證指定 IDN 中的字元完全取自與特定地區設定或地區設定相關聯的腳本。 如需使用這些函式的範例,請參閱 NLS:國際化功能變數名稱 (IDN) 風險降低範例

對於在 Windows XP 和 Windows Server 2003 上執行的應用程式,DownlevelGetLocaleScriptsDownlevelGetStringScripts 和 DownlevelVerifyScripts 的功能會扮演與上述功能類似的角色,以降低安全性風險。 可從 archive.org 取得「Microsoft 國際化功能變數名稱(IDN)風險降低 API」下載。

處理 Unicode 字串

IDNA 支援將 Unicode 字串轉換成合法的主機名標籤,但包含特定禁止字元的字串除外,例如控制字元、私人使用區域 (PUA) 中的字元等等。 如果您的應用程式可以使用具有數個 NLS 轉換函式的 IDN_USE_STD3_ASCII_RULES 旗標,強制函式在遇到字母、數位或連字元減號 (-) 字元以外的 ASCII 字元時失敗,或者字元串開頭或結尾為連字元減號字元。 這些字元一律禁止在功能變數名稱中使用,而且在草案標準中仍被禁止。

處理未指派的代碼點

IDN 不能包含未指派的代碼點。 因此,與 Unicode 3.2 中的字元 (“assigned”) 無關的程式代碼點並沒有定義 IDN 對應,即使特定轉換函式中的IDN_ALLOW_UNASSIGNED旗標允許它們對應到 Punycode。 您可以在 RFC 3454 中找到未指派代碼點的清單。

警告

如果您的應用程式將未指派的程式代碼點編碼為 Punycode,則產生的功能變數名稱應該是非法的。 如果較新版本的 IDNA 使這些名稱合法,或應用程式篩選出非法字元,嘗試建立合法功能變數名稱,則安全性可能會遭到入侵。

 

在通訊協定識別碼和具名實體中使用的預存字串中,不允許未指派的代碼點,例如數位證書和 DNS 功能變數名稱。 不過,查詢字串中允許代碼點,例如,數位證書頒發機構單位和 DNS 查閱的使用者輸入名稱,用來比對預存識別碼。

警告

雖然查詢字串可以使用未指派的代碼點,但您不應該在應用程式中使用這些字串。 即使是使用者提供的查詢字串也會造成「詐騙」攻擊的風險。 在此類型的攻擊中,無良主機網站會從他們想要存取另一個可能提供敏感性資訊給第三方的網站重新路由傳送使用者。 例如,從內送電子郵件複製字串可能會有與在瀏覽器中按兩下連結相同的風險。

 

將功能變數名稱轉換為 ASCII 名稱

您的應用程式可以使用 IdnToAscii 函式和特定風險降低函式,將 IDN 轉換成 ASCII。

警告

因為具有非常不同二進位表示法的字串可以做為相同的比較,因此此函式可能會引發某些安全性考慮。 如需詳細資訊,請參閱安全性考慮:國際功能中的比較函式討論。

 

範例

NLS:國際化功能變數名稱 (IDN) 轉換範例 示範IDN轉換函式的使用。 NLS:國際化功能變數名稱 (IDN) 風險降低範例 示範如何使用IDN風險降低功能。

使用國家語言支援

安全性考慮:國際功能