什么是"零宽空格"?

2023-02-26 15:52:27 浏览数 (1)

同事问了个问题,从邮件正文中粘出来的URL,复制到任何的浏览器中,回车都会报404的错,和原始的URL对比,发现URL结尾多了一串特殊的字符,

代码语言:javascript复制

相当于这串字符接着原始URL,自然就导致出错。

研究一下,原来这串字符,有个名字叫Zero-width space,简称ZWSP,翻译过来就是"零宽空格",它是一种不可打印的Unicode字符,就是一般情况 肉眼不可见,但是当它变成URL的一部分,就会变成"​",让你的URL在请求时抛出404错误。

这种字符的出现是为了文字控制排版作用的,但是由于它拥有肉眼无法观察到的特性,零宽度字符可作为识别某些用户身份的"指纹"数据,也可非常方便地追溯到某些秘密数据的泄露源。

HTML页面中,零宽空格可以替代,一般用于可能需要换行的地方,标点之前为URL换行,以便避免将标点符号留在行尾,让读者将URL的末尾搞错。

三种常见的零宽字符,

(1)不换行空格,全称No-Break Space,它是最常见和我们使用最多的空格,大多数的人可能这个字符叫做Zero Width Space,中文可称为"零宽空白",这个字符在主流文本编辑器中均没有任何显示效果,就像一只看不见、摸不着的幽灵。拷贝也会带上零宽空白,HTML字符值引用为:​

(2)零宽不连字:不换行空格,全称No-Break Space,它是最常见和我们使用最多的空格,大多数的人可能它叫零宽不连字,全称是Zero Width Non Joiner,简称"ZWNJ",是个不打印字符,放在电子文本的两个字符之间,抑制本来会发生的连字,而是以这两个字符原本的字形来绘制。Unicode中的零宽不连字字符映射为(zero width non-joiner,U 200C),HTML字符值引用为:‍或‌

(3)零宽连字,全称是Zero Width Joiner,简称"ZWJ",是个不打印字符,放在某些需要复杂排版语言(如阿拉伯语、印地语)的两个字符之间,使得这两个本不会发生连字的字符产生了连字效果。零宽连字符的Unicode码位是U 200D,HTML字符值引用为:‌或‍

零宽度字符能做什么?

(1)数据防爬,将零宽度字符插入文本中,干扰关键字匹配。爬虫得到的带有零宽度字符的数据会影响他们的分析,但不会影响用户的阅读数据。

(2)信息传递,将自定义组合的零宽度字符插入文本中,用户复制后会携带不可见信息,达到传递作用。

(3)传递隐密信息,利用零宽度字符不可见的特性,我们可以用零宽度字符在任何未对零宽度字符做过滤的网页内插入不可见的隐形文本。

(4)隐形水印,通过零宽度字符我们可以对内部文件添加隐形水印。在浏览者登录页面对内部文件进行浏览时,我们可以在文件的各处插入使用零宽度字符加密的浏览者信息,如果浏览者又恰好使用复制粘贴的方式在公共媒体上匿名分享了这个文件,我们就能通过嵌入在文件中的隐形水印轻松找到分享者了。

(5)加密信息分享,通过零宽度字符我们可以在任何网站上分享任何信息。敏感信息的审核与过滤在当今的互联网社区中扮演着至关重要的角色,但是零宽度字符却能如入无人之境一般轻松地穿透这两层信息分享的屏障。对比明文哈希表加密信息的方式,零宽度字符加密在网上的隐蔽性可以说是达到了一个新的高度。仅仅需要一个简单的识别/解密零宽度字符的浏览器插件,任何网站都可以成为信息分享的游乐场。

(6)逃脱敏感词过滤,通过零宽度字符我们可以轻松逃脱敏感词过滤。敏感词自动过滤是维持互联网社区秩序的一项重要工具,只需倒入敏感词库和匹配相应敏感词,即可将大量的非法词汇拒之门外。使用谐音与拼音来逃脱敏感词过滤会让语言传递信息的效率降低,而使用零宽度字符可以在逃脱敏感词过滤的同时将词义原封不动地传达给接受者,大大提高信息传播者与接受者之间交流的效率。

0 人点赞