字体反爬的现象:

例如58同城中,不管是F12选中元素,还是直接查看网页源代码,在网页上看到的是正常的,但是在源代码中它是属于乱码,如下图样子就是字体反爬

字体反爬的原理:

利用字体的方式,它在源代码中展示了字体的一个代号,根据代号从字体中找到真正的文字然后再在网页上显示出来

破解方法:

既然可以显示出来,说明了这个字体已经在源代码中已经加载进来,只要在网页中找到这个字体,通过字体加载即可

破解58同城字体反爬:

从58同城网页源代码中可以看到一个font-family字体设置的选项,这个就是58同城自己设计的字体,可以看出通过base64进行编码,真正的编码信息在蓝色竖线之间

创建的ttf文件可以通过FontCreator进行查看

生成ttf文件之后,再通过TTFont去生成字体的xml后缀的一个配置文件

再对xml文件进行解析

记录的字体的名字和形状的映射关系,和FontCreator软件中的图像进行对比,glyph00001对应的是0,以此类推,就是找到字体的name和软件中哪个字进行对应

再去找到name对应的编码,这个编码值就是在网页源代码中展示的,也就是从网页的编码找到编码对应的名字,再从名字找到字符的形状,就是如下映射关系:

name <->数字

code<->name

但是要注意name和数字之间的关系不是永久一样的,第一次获取的时候可能glyph1->1,第二次可能就是glyph1->2

再添加一层关系(name<->shape这个形状就是数字的样子),原因就是每次获取再怎么变,字或者数字的形状都是不变的,所以这层关系是固定的,通过形状找到name,再通过name找到数字,然后再找数字和code之间的关系

总结就是找形状和数字之间关系,形状和code之间的关系,然后通过形状把数字和code联系在一起

关于字体文件:

一个最基本的字体文件一定会包含以下的表:

cmap: unicode跟 Name的映射关系

head: 字体全局信息

hhea:定义了水平header

hmtx:定义了水平metric

maxp:用于为字体分配内存

name:定义字体名称、风格名以及版权说明等

glyf: 字形数据即轮廓定义和调整指令

OS__2:

post:

高级书法特性的字体包含表:

BASE: Base­line data

GDEF: Glyph de­f­i­n­i­tion data

GPOS: Glyph po­si­tion­ing data

GSUB: Glyph sub­sti­tu­tion data

JSTF: Jus­ti­fi­ca­tion data

MATH: Math lay­out data

一些常用字体操作可见:https://blog.csdn.net/Obgo_6/article/details/101169682