處理國際化網域名稱 (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)風險降低範例。
- GetStringScripts。 提供特定字串中使用的文稿清單。
- GetLocaleInfoGetLocaleInfoEx。 擷取地區設定資訊。 使用函式並將 LCType 設定為 LOCALE_SSCRIPTS 可以提供一份書寫系統清單,這些系統通常用於特定的地區設定。
- VerifyScripts。 比較腳本清單。 若要針對多個地區設定進行驗證,應用程式可以多次 呼叫 getLocaleInfo 或 GetLocaleInfoEx,VerifyScripts。
對於在 Windows XP 和 Windows Server 2003 上執行的應用程式,函式 DownlevelGetLocaleScripts、DownlevelGetStringScripts,以及 DownlevelVerifyScripts 在降低安全性風險中所列的函式扮演類似的角色。 「Microsoft國際化域名(IDN)減緩介面(API)」 可從 archive.org下載。
處理 Unicode 字串
IDNA 支援將 Unicode 字串轉換成合法的主機名標籤,但包含特定禁止字元的字串除外,例如控制字元、私人使用區域 (PUA) 中的字元等等。 您的應用程式可以使用 IDN_USE_STD3_ASCII_RULES 旗標搭配數個 NLS 轉換函式,強制函式遇到字母、數字或連字號減號(-)以外的 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緩解功能。
相關主題