零宽字符是 Unicode 中一类不可见的特殊字符,不占据视觉空间,但会影响文本的排版、编码或行为。它们在前端开发中常用于特定场景,但也可能引发安全问题。
前端应用场景
1. 文本换行优化
使用 `ZWSP` 允许长单词在特定位置换行:
<p>这是一个非常长的单词:Antidisestablishmentarianism</p>
<!-- 插入零宽空格 -->
<p>这是一个非常长的单词:Anti\u200Bdisestablishmentarianism</p>
2. 数据隐藏与水印
在用户不可见的文本中嵌入信息(如用户ID):
const userId = "user123";
const hiddenText = "可见内容" + userId.split('').map(c => `\u200B${c}`).join('');
console.log(hiddenText); // 用户看到"可见内容",实际包含隐藏信息
3. Emoji 组合
使用 `ZWJ` 连接多个 Emoji:
const family = "👨\u200D👩\u200D👧\u200D👦";
console.log(family); // 显示为 👨👩👧👦
4. 防爬虫与抄袭
在网页内容中插入零宽字符,干扰爬虫解析:
document.body.innerText = "原创内容" + "\u200B".repeat(10);
安全问题与注意事项
1. 钓鱼攻击
攻击者利用零宽字符伪造 URL:
const fakeUrl = "https://example.com\u200B@evil.com";
console.log(fakeUrl); // 显示为 "https://example.com@evil.com",实际指向恶意网站
2. 输入验证绕过
用户可能在表单中输入含零宽字符的恶意数据:
// 检测并移除零宽字符
function sanitize(input) {
return input.replace(/[\u200B-\u200F\uFEFF]/g, '');
}
3. 调试困难
零宽字符可能导致字符串长度异常,需用工具检测:
"test\u200B".length; // 输出 5,但视觉上只有4个字符
检测与处理
正则表达式过滤:
const hasZeroWidth = /[\u200B-\u200F\uFEFF]/g.test(text);
浏览器插件:
使用 [Zero-Width Character Detector](https://chrome.google.com/webstore/detail/zero-width-character-detec/ojppmkgpljfmhnfaeplldlajjhgehomb) 高亮显示页面中的零宽字符。