問題描述:
我在修改 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);