浏览器会将哪些主机名以Punycode显示?其判定规则是什么?
浏览器显示Punycode的判定规则及同形字符攻击防范逻辑
核心判定逻辑
浏览器决定是否显示Punycode,核心依据是Unicode字符的归属区块与预定义的安全字符规则,而非字符的视觉相似度。
两种显示场景的具体规则
保留原URL显示,仅内部转换为Punycode
当域名中的非ASCII字符属于对应语言的合法常用字符集,且归属的Unicode区块被标记为“安全”时,浏览器会在内部将其转换为Punycode以兼容DNS解析,但地址栏仍显示原Unicode域名。
比如你提到的http://gibts.überhaupt.nicht,其中的ü属于Latin-1 Supplement Unicode区块,是德语的标准合法字符,因此地址栏保留原显示。强制显示Punycode
当域名中的字符属于易引发同形混淆的Unicode区块(比如修饰字母、半宽/全宽字符、非标准拉丁变种等),即使视觉上和普通拉丁字母高度相似,浏览器也会强制显示Punycode。
比如http://ᴅᴏᴇs.not.exist中的ᴅᴏᴇs属于“修饰字母-小写”这类区块,和普通拉丁字母does视觉近似但编码完全不同,浏览器会显示对应的Punycodehttp://xn--s-h6lg5a.not.exist,避免用户被钓鱼域名误导。
关于同形字符攻击的判定依据
判定时不直接考量字符的视觉相似度,而是依赖浏览器预设的Unicode区块分类和安全字符列表:
- 浏览器会将所有非ASCII字符按Unicode区块归类;
- 仅允许属于“常用语言标准字符区块”的字符保留原显示;
- 所有归属到易混淆区块的字符,一律强制显示Punycode,以此防范同形字符钓鱼攻击。
内容的提问来源于stack exchange,提问作者Heiko Theißen
相关产品推荐
相关产品推荐

