思路参照:
Web 端反爬技术方案,请先看完此文。否则以下内容你会有些蒙。
步骤概括:
ttf => svg => 加密并清理不加密得字符 => svg => woff/woff2
具体步骤:
一、整理需要加密的“字”:
先将网站常用字体统计处理,这个不管你用什么方式,人工还是程序,都要先统计出来,因为你不可能把所有文字都加密混编,那样字体文件就太大了,网站加载会出问题。
这个时候你就有了你的需要加密的字体的清单了。
二、清理不加密的字,并将需要加密的字的字符加密:
如果网站针对window系统,那么就用工具将微软雅黑字体导出svg
格式,svg
其实也是xml
的一种,里面每个字的节点会有个属性:unicode
, 这个编码就是这个字的unicode值,不过是ucs-4
字符集所对应的。用你所熟悉的编程语言,将你第一步整理出来的待加密文字清单 里 意外的文字从 这个svg
文件中清除.
怎么除每个语言不太相同,我的思路是将xml
转换成array
,然后处理,处理完再转换成xml
,附送需要的代码(PHP版本):
//xml转array
$xml = simplexml_load_string(file_get_contents("msyh.svg"));
$xml_json = json_encode($xml);//将对象转换个JSON
$xml_arr = json_decode($xml_json, true);
//array转xml
function arr2xml($arr,$parentNode=null){
//如果父节点为null,则创建root节点,否则就使用父节点
if($parentNode === null){
$simxml = new \SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><svg></svg>');
}else{
$simxml = $parentNode;
}
//遍历数组
foreach($arr as $k => $v){
//再将xml转换成数组的时候,xml节点的属性会变成子数组,键名是@attributes,
//在转回xml的时候,就需要特殊处理,将这个数组添加为属性,而不是节点
if($k === '@attributes'){
foreach ($v as $name => $value){
if($name === 'unicode'){
//注意这个‘&#x’中的‘&’,在保存为xml文件是,会被转移为&记得在导出文件后批量替换掉。
$value = "&#x".ltrim(bin2hex(iconv('UTF-8', 'UCS-4', $value)), '0').';';
}
$simxml->addAttribute($name, $value);
}
}else{
if(is_numeric($k))
$k = 'glyph';
if(is_array($v)){//如果是数组的话则继续递归调用,并以该键值创建父节点
arr2xml($v, $simxml->addChild($k));
}else{
$simxml->addChild($k, $v);
}
}
}
//返回数据
header('Content-type:text/xml;charset=utf-8');
return $simxml->saveXML();
}
注意:每个svg
文件里的glyph
节点的unicode
属性值,便是你要加密的值,如果这个值不修改,继续保留,那么你就跟没有加密一样。你要做的就是用你自己的加密算发,将这个值修改,但是修改的结果必须保证在unicode
值得范围内,你不要乱改成超出范围得值,否则最后依然无法生成字体文件得。
三、转换为woff
将上一步修改后的xml文件得后缀名改为svg
,然后在百度在线字体编辑器里将svg
导出为woff
或者woff2
。woff得兼容性比woff2
好,woff2
得体积比woff
小30%左右,根据你的需求选择相应格式。
接下来怎么做,请回到文章开头推荐的另外一个文章里,你就明白了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。