EtherDream / freecdn

A front-end CDN based on ServiceWorker
986 stars 81 forks source link

清单备用url优化 #11

Closed lirko closed 2 years ago

lirko commented 2 years ago

/index.html https://cdn.jsdelivr.net/gh/zjcqoo/test@0.0.1/index.html

备用地址完全可以用变量优化

@jsd = https://cdn.jsdelivr.net/gh/zjcqoo/test@ @unpkg = https://unpkg.com/free-host@

/index.html {jsd}0.0.1/index.html {unkpg}0.0.0-1lZrk8wvUYweiDaC/index.js

视清单备用地址数量预计减少30-80%以上的代码大小

另有一个问题 hash=1lZrk8wvUYweiDaCPB/LayLG2X8jh/7ln9l66boQVMU= 哈希值文档说文件sha256算法后base64编码 为何用其他语言如php对这个哈希值进行base64解码不成功,解码后是乱码

一个文件的sha256算法后字数也不是这么短,再用base64编码后字数更长,难道freecdn cli生成的哈希值不是通用标准?

还有一个疑问 第三方图床cors跨域问题 正常一个图片大多数是检测ref来路,很少检测cors freecdn拦截请求时比如 img src=xxx 可不发出ref来路,为什么又要求对方站点开放cors?

我的个人理解是不是 freecdn可以拦截 img src=xxx 的请求和修改请求头信息比如head但无法对该请求返回的内容进行控制修改

freecdn要想达到拦截请求又可以修改返回的内容比如截取后300字节的内容,url/a.jpg?pos=300 是不是就必须要对方站点开启cors跨域共享,不然freecdn就无法获取这个返回的对象,然而就无法对这个对象进行pos截取操作?

EtherDream commented 2 years ago

地址用变量优化是可以也在考虑,不过其实减少的并不多,因为 HTTP 压缩后体积会大幅减少(数据压缩本身就是合并重复部分),而且 br 压缩率已经很高。

Hash 用的是标准 SHA256 算法(32 字节),Base64 之后 44 字符。

资源不支持 cors 前端无法获取响应内容,无法获取状态码,无法 hash 校验,无法获取下载速度等等,绝大部分功能都无法实现。

lirko commented 2 years ago
<?php
$string = 'admin'; 
$md5 = hash('md5',$string);
//在线md5加密,admin的md5 32位等于21232f297a57a5a743894a0e4a801fc3
$sha256 = hash('sha256',$string);
//在线sha256加密,admin的sha256等于8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
$md5_strlen = strlen($md5);
$sha256_strlen = strlen($sha256);
$md5_base64 = base64_encode($md5);
$sha256_base64 = base64_encode($sha256);
$md5_base64_strlen = strlen($md5_base64);
$sha256_base64_strlen = strlen($sha256_base64);

echo "string = {$string}  > md5  </br>>  md5 :  {$md5}  </br>> md5 strlen : {$md5_strlen} </br>> base64 : {$md5_base64}  </br>> base64 strlen : {$md5_base64_strlen}</br></br>";
echo "string = {$string}  > sha256  </br>>  sha256 :  {$sha256}  </br>> sha256 strlen : {$sha256_strlen} </br>> base64 : {$sha256_base64}  </br>> base64 strlen : {$sha256_base64_strlen}</br></br>";

// https://ajax.cdnjs.com/ajax/libs/browser-logos/27.0.0/chrome/chrome_512x512.png  效验文件
// https://crypot.51strive.com/md5_checksum.html  在线网站效验
$file = 'chrome_512x512.png';
$md5_file = hash_file('md5',$file);
//在线效验chrome_512x512.png的md5等于bdb28395729d38e25bf36a037500ad35
$sha256_file = hash_file('sha256',$file);
//在线效验chrome_512x512.png的sha256等于a918149084a8e64fdb80858d1c67cbb02f1699ab2713b8d874266fb612052e7a
$md5_file_strlen = strlen($md5_file);
$sha256_file_strlen = strlen($sha256_file);
$md5_file_base64 = base64_encode($md5_file);
$sha256_file_base64 = base64_encode($sha256_file);
$md5_file_base64_strlen = strlen($md5_file_base64);
$sha256_file_base64_strlen = strlen($sha256_file_base64);

echo "file = {$file} > md5  </br>>  md5 :  {$md5_file}  </br>> md5 strlen : {$md5_file_strlen} </br>> base64 : {$md5_file_base64}  </br>> base64 strlen : {$md5_file_base64_strlen}</br></br>";
echo "file = {$file} > sha256  </br>>  sha256 :  {$sha256_file}  </br>> sha256 strlen : {$sha256_file_strlen} </br>> base64 : {$sha256_file_base64}  </br>> base64 strlen : {$sha256_file_base64_strlen}</br></br>";
?>

php返回结果

string = admin > md5
> md5 : 21232f297a57a5a743894a0e4a801fc3
> md5 strlen : 32
> base64 : MjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzM=
> base64 strlen : 44

string = admin > sha256
> sha256 : 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
> sha256 strlen : 64
> base64 : OGM2OTc2ZTViNTQxMDQxNWJkZTkwOGJkNGRlZTE1ZGZiMTY3YTljODczZmM0YmI4YTgxZjZmMmFiNDQ4YTkxOA==
> base64 strlen : 88

file = chrome_512x512.png > md5
> md5 : bdb28395729d38e25bf36a037500ad35
> md5 strlen : 32
> base64 : YmRiMjgzOTU3MjlkMzhlMjViZjM2YTAzNzUwMGFkMzU=
> base64 strlen : 44

file = chrome_512x512.png > sha256
> sha256 : a918149084a8e64fdb80858d1c67cbb02f1699ab2713b8d874266fb612052e7a
> sha256 strlen : 64
> base64 : YTkxODE0OTA4NGE4ZTY0ZmRiODA4NThkMWM2N2NiYjAyZjE2OTlhYjI3MTNiOGQ4NzQyNjZmYjYxMjA1MmU3YQ==
> base64 strlen : 88
lirko commented 2 years ago

资源不支持 cors 前端无法获取响应内容,无法获取状态码,无法 hash 校验,无法获取下载速度等等,绝大部分功能都无法实现。

如果对方没有开启cors共享,freecdn能否利用iframe发出请求,然后附加一段JS代码在这个iframe,虽然cors限制无法获取这个响应对象,如果能附加js进去,把逻辑都写进js让远程iframe自己执行dom操作是否可行???

EtherDream commented 2 years ago

hash 是文件内容的 sha256,不是文件路径。

ServiceWorker 里无法操作 DOM

lirko commented 2 years ago

php hash_file函数第二个参数就是文件路径,函数执行打开这个路径文件进行计算文件哈希

用百度搜索出来的 在线sha256文件校验网站 计算得出的哈希值和php hash_file函数得出的哈希值是一致的 包括我在win系统下用校验工具选择这个文件得出的结果也和php hash_file也完全一致的

php hash('sha256',string) php hash_file('sha256',文件路径) 二者函数使用的参数不相同 不管是计算字符串还是文件资源 md5都是32字数,sha256都是64字数 所以我才对freecdn计算出来的哈希值有疑问

ServiceWorker 里无法操作 DOM 我知道 我只是在想sw可以拦截请求,附加js脚本到拦截下来的请求,让请求在它自己的dom里面执行js脚本,并非是要在sw直接操作远程请求的dom

EtherDream commented 2 years ago

64字数是 hex,不是base64。用 openssl dgst -sha256 -binary 文件 | openssl base64 -A 试下就可以了。

网页里插脚本是可以,不过具体替换资源实现很麻烦,不同类型的资源替换方式都不一样,没有cors也无法观察内容是否预期。

lirko commented 2 years ago

hex是算法后返回十六进制字符串 bin是算法后返回二进制格式 用php一般是直接 hash_file('sha256',文件路径) 返回的就是默认的十六进制64位字数的字符串 如果想返回二进制的格式需要在函数第三个参数开启设置 php hash_file('sha256', 文件路径,true) 一般好像普遍使用hash算法返回十六进制的字符串格式,很少有人使用返回二进制格式

比如很多文件或者系统镜像等都是提供十六进制字符串,没见过用算法后的二进制再压缩base64提供,以win系统镜像为例,基本都是十六进制 又比如普遍的用户密码用hash算法,基本也是用十六进制的字符串来存储在数据库。

因为hash算法后既然能返回十六进制字符串了为什么还要再浪费计算资源去再次base64压缩

所以大家都是直接使用hash算法返回的十六进制字符串来使用,不想再计算一次base64