什么是 IDN?
IDN(国际化域名)是包含传统 DNS 规范所用 ASCII 字符集之外字符的域名。IDN 让人们可以使用本民族文字注册域名,例如中文(中文.com)、阿拉伯文(مثال.com)、西里尔文(пример.com)以及许多其他文字。
IDN 为什么重要
最初的 DNS 是为英语使用者设计的,域名字符受到以下限制:
- 字母 a-z(不区分大小写)
- 数字 0-9
- 连字符(不能位于开头或结尾)
这排除了数十亿不使用拉丁字母语言的人。IDN 通过以下方式让互联网更加普惠:
- 本民族语言地址:用户可以用自己的语言输入 URL
- 品牌保护:企业可以在多种文字体系中保护品牌名称
- 文化可访问性:降低参与互联网的语言门槛
IDN 如何工作:Punycode 的作用
DNS 基础设施只能理解 ASCII,因此 IDN 使用一种称为 Punycode 的编码系统。当你注册或访问 IDN 时:
1. 用户输入:中文.com(“Chinese”的中文写法)
2. 浏览器编码:xn--fiq228c.com(Punycode 表示形式)
3. DNS 解析:执行标准 ASCII 查询
4. 浏览器显示:中文.com(原始形式)
前缀 “xn--” 表示该字符串经过 Punycode 编码。这个过程对用户是透明的。
Punycode 示例
| IDN | Punycode |
|---|---|
| münchen.de | xn--mnchen-3ya.de |
| 中文.com | xn--fiq228c.com |
| правда.рф | xn--80aafi6cg.xn--p1ai |
各 TLD 的 IDN 支持
不同 TLD 的 IDN 支持情况不同:
完整支持
大多数现代 gTLD 和许多 ccTLD 都支持 IDN:
- .com、.net、.org(Verisign)
- .de(德语字符)
- .jp(日语)
- .cn(中文)
国际化 TLD
有些 TLD 本身就是 IDN:
- .рф(俄罗斯,西里尔文)
- .中国(中国)
- .भारत(印度,天城文)
- .السعودية(沙特阿拉伯,阿拉伯文)
有限支持或不支持
一些 TLD 会限制 IDN,或完全不支持 IDN。注册前应始终确认目标 TLD 的 IDN 政策。
安全注意事项:同形异义字符攻击
IDN 可能带来安全风险:攻击者使用不同文字体系中外观相似的字符,构造具有欺骗性的域名,这称为同形异义字符攻击。
apple.com (legitimate - Latin letters)
аpple.com (attack - Cyrillic 'а' looks like Latin 'a')
防范同形异义字符攻击
浏览器行为:现代浏览器会对可疑 IDN 显示 Punycode,而不是 Unicode 形式,以暴露潜在攻击。 注册局政策:一些注册局会限制同一域名中可以组合使用的字符集。 域名监控:DomScan 的错拼检测等工具可以识别已注册的品牌同形变体。实现 IDN 支持
对于构建域名工具的开发者:
验证
// Check if domain contains non-ASCII
function isIDN(domain) {
return /[^\x00-\x7F]/.test(domain);
}
转换
// Convert to Punycode for DNS queries
const punycode = require('punycode/');
const ascii = punycode.toASCII('中文.com'); // xn--fiq228c.com
const unicode = punycode.toUnicode('xn--fiq228c.com'); // 中文.com
RDAP 查询
大多数 RDAP 服务器同时接受两种形式:
# Both work
curl "https://rdap.verisign.com/com/v1/domain/xn--fiq228c.com"
curl "https://rdap.verisign.com/com/v1/domain/中文.com"
最佳实践
使用 IDN 时:
1. 始终在内部存储和处理 Punycode 形式
2. 向用户显示 Unicode 形式
3. 为安全功能实现同形异义字符检测
4. 注册前确认特定 TLD 的 IDN 政策