在chrome客户端可以通过policy策略指定安装非官方来源的crx,但是chrome的crx请求地址不能是直接的crx下载链接,还需要一个服务器来解析请求并返回成对应的crx下载地址。
chrome请求crx流程
- 根据policy中的update_url发送请求
- 根据返回的xml解析crx实际下载地址
- 检查返回的crx版本是否和xml中的一致
- 根据policy中的安装方式安装crx
chrome对多个同一update_url的crx请求会合并到一个请求,即多个x参数和合并,这就表示,在url请求参数内会存在多个同key的不同值,而通常的url解析函数都不允许存在重复key,需要用正则或字符串分割方法手动解析url,否则会丢失请求。
例如policies.json中包含两个crx请求,update_url是同一个地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "ExtensionSettings": { "bfmgdnjlifbmedglimhnbhgkefanaiep": { "installation_mode": "force_installed", "update_url": "https://minir.plus/crx", "override_update_url": true, "toolbar_pin": "force_pinned" }, "cfhdojbkjhnklbpkdaibdccddilifddb": { "installation_mode": "force_installed", "update_url": "https://minir.plus/crx", "override_update_url": true, "toolbar_pin": "force_pinned" }, } } |
这时chrome就会给这个地址发送这样一个请求
1 |
//minir.plus/crx?os=linux&arch=x64&os_arch=x86_64&nacl_arch=x86-64&prod=chromecrx&prodchannel=&prodversion=97.0.4692.99&lang=en-US&acceptformat=crx3&x=id%3Dcfhdojbkjhnklbpkdaibdccddilifddb%26v%3D0.0.0.0%26installsource%3Dnotfromwebstore%26installedby%3Dpolicy%26uc&x=id%3Dbfmgdnjlifbmedglimhnbhgkefanaiep%26v%3D1.3.3%26installsource%3Dnotfromwebstore%26installedby%3Dpolicy%26uc |
解析后,如下
1 2 3 4 5 6 7 8 9 10 11 |
["os","linux"] ["arch","x64"] ["os_arch","x86_64"] ["nacl_arch","x86-64"] ["prod","chromecrx"] ["prodchannel",""] ["prodversion","97.0.4692.99"] ["lang","en-US"] ["acceptformat","crx3"] ["x","id%3Dcfhdojbkjhnklbpkdaibdccddilifddb%26v%3D0.0.0.0%26installsource%3Dnotfromwebstore%26installedby%3Dpolicy%26uc"] ["x","id%3Dbfmgdnjlifbmedglimhnbhgkefanaiep%26v%3D1.3.3%26installsource%3Dnotfromwebstore%26installedby%3Dpolicy%26uc"] |
可以看到有两个key为x的参数
继续解析这个x参数,在foreach里使用字符=作为分隔符将x字符串后的内容分割出来。并使用urldecode函数解密字符串
1 2 |
$x = explode('=',$val); parse_str(urldecode($x[1]), $parse_url_3st); |
接着继续解析需要的参数
1 2 |
$crx[$parse_url_3st["id"]]['id'] = $parse_url_3st['id']; $crx[$parse_url_3st["id"]]['v'] = $parse_url_3st['v']; |
获得crx_id和crx_v在后续操作中使用
使用另一个foreach循环组装xml文件
1 2 3 4 5 |
$output_xml = '<gupdate xmlns="http://www.google.com/update2/response" protocol="2.0">'; foreach ($crx as $key=>$val) { $output_xml .= '<app appid="'.$val['id'].'"><updatecheck codebase="https://minir.plus/file/'.$val['id'].'.crx" version="'.$val['v'].'"/></app>'; } $output_xml = $output_xml.'</gupdate>'; |
在浏览器访问
1 |
https://minir.plus/crx?os=linux&arch=x64&os_arch=x86_64&nacl_arch=x86-64&prod=chromecrx&prodchannel=&prodversion=97.0.4692.99&lang=en-US&acceptformat=crx3&x=id%3Dcfhdojbkjhnklbpkdaibdccddilifddb%26v%3D0.0.0.0%26installsource%3Dnotfromwebstore%26installedby%3Dpolicy%26uc&x=id%3Dbfmgdnjlifbmedglimhnbhgkefanaiep%26v%3D1.3.3%26installsource%3Dnotfromwebstore%26installedby%3Dpolicy%26uc |
输出如下
在chrome中测试,注意这里的version需要和codebase中的crx对应,否则无法安装。
可以通过白名单来写死crx和版本的对应关系
1 2 3 4 |
foreach ($crx as $key=>$val) { if( $val['id'] == "cfhdojbkjhnklbpkdaibdccddilifddb" ) // Adblock-Plus---free-ad-blocker $output_xml .= '<app appid="cfhdojbkjhnklbpkdaibdccddilifddb"><updatecheck codebase="https://minir.plus/file/cfhdojbkjhnklbpkdaibdccddilifddb.crx" version="3.12"/></app>'; } |
如何使用
目前提供的插件列表
- Video-Styler–brightness-and-more【bfmgdnjlifbmedglimhnbhgkefanaiep】
- Adblock-Plus—free-ad-blocker【cfhdojbkjhnklbpkdaibdccddilifddb】
- Proxy SwitchyOmega【padekgcemlokbadohgkifijomclgjgif】
policies.json位置
编辑policies.json,增加ExtensionSettings设置
设置插件信任源
1 2 3 |
"ExtensionInstallSources": [ "*://minir.plus/*", ], |
设置预安装插件
1 2 3 4 5 6 7 8 9 |
"ExtensionSettings": { "cfhdojbkjhnklbpkdaibdccddilifddb": { "installation_mode": "force_installed", "update_url": "https://minir.plus/crx", "override_update_url": true, "toolbar_pin": "force_pinned" }, } |
保存policies.json,打开chrome后自动安装插件。
2 comments