什么是IDN?
IDN(国际化域名)是包含原始DNS规范中使用的传统ASCII集外字符的域名。IDN使用本地脚本(如中文、阿拉伯文、西里尔文等)启用域名。
为什么IDN很重要
原始DNS是为英语使用者设计的,将域名限制为:
- 字母a-z(不区分大小写)
- 数字0-9
- 连字符(不在开始或结尾)
这排除了数十亿不主要使用拉丁字母的人。IDN通过以下方式民主化互联网:
- 本地语言地址:用户可以用自己的语言输入URL
- 品牌保护:公司可以用多种脚本保护其名称
- 文化可访问性:降低互联网参与的障碍
IDN的工作原理:Punycode连接
DNS基础设施只理解ASCII,所以IDN使用称为Punycode的巧妙编码系统。当你注册或访问IDN时:
1. 用户输入:中文.com(中文为"中文")
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支持
IDN支持因TLD而异:
完全支持
大多数现代gTLD和许多ccTLD支持IDN:
- .com、.net、.org(Verisign)
- .de(德语字符)
- .jp(日语)
- .cn(中文)
国际化TLD
有些TLD本身是IDN:
- .рф(俄罗斯,西里尔)
- .中国(中国)
- .भारत(印度,天城文)
- .السعودية(沙特阿拉伯,阿拉伯)
有限或无支持
某些TLD限制IDN或根本不支持。始终验证你的目标TLD的IDN支持。
安全考虑:同形异义体攻击
IDN通过同形异义体攻击引入安全风险,其中来自不同脚本的视觉相似字符创建欺骗域:
apple.com (合法 - 拉丁字母)
аpple.com (攻击 - 西里尔'а'看起来像拉丁'a')
防御同形异义体攻击的保护
浏览器行为:现代浏览器为可疑的IDN显示Punycode,而不是Unicode形式,暴露攻击。 注册局政策:某些注册局限制在单个域中可以组合哪些字符集。 域名监控:DomScan的typosquatting检测等工具可以识别你品牌的已注册同形异义体变体。实现IDN支持
对于构建域名工具的开发者:
验证
// 检查域名是否包含非ASCII
function isIDN(domain) {
return /[^\x00-\x7F]/.test(domain);
}
转换
// 转换为Punycode进行DNS查询
const punycode = require('punycode/');
const ascii = punycode.toASCII('中文.com'); // xn--fiq228c.com
const unicode = punycode.toUnicode('xn--fiq228c.com'); // 中文.com
RDAP查询
大多数RDAP服务器接受两种形式:
# 两者都可以
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政策