一、背景
最近大连车务段在其公众号发表了题为《全力攻关一昼夜,确保运输三十站》的文章,迅速在网络上引发了群嘲,面对舆论压力只好自行删除了此文。起因是其现在车子系统在浏览器中运行的网页代码依赖Flash Player控件的运行,而其开发商Adobe公司呢,完全没考虑商用业务系统的风险做了一个骚操作,在32后的版本中加入了“定时炸弹”,从2021年1月12日(美国时间)开始禁止Flash内容在Flash Player中运行,而Flash Player在Windows 8及以上版本的操作系统中一直是内置自动更新的,从而引发了现在车子系统的故障。按理说你Adobe公司不再维护Flash Player也就罢了,用户继续使用引发的风险自己承担,也没人会来追究你的责任,非要整这么一个定时炸弹在软件中,这和植入了木马病毒又有啥差别呢?可能很多人在说,3年前Adobe公司就公告了这个时间点会停止更新和分发Flash Player,相信大家也绝不会想到Adobe公司会植入这个定时炸弹。而大连车务段遇到的问题绝不是孤例,只是并非所有单位都在公众号发个表扬稿罢了。
Flash Player从1996年诞生开始,逐步成为一种广泛使用的多媒体程序播放器,因为Adobe大力推广其Flex作为RIA(因特网应用程序)的框架,第三方因此开发创造出众多丰富型互联网应用程序,最典型的如曾经火热一时的网页游戏,进一步丰富了Flash Player的使用场景。有数据统计,Flash Player曾经达到13亿台电脑安装使用,装机率超过90%。正因为如此,在数年前开发的各种业务系统,包括企事业单位的网站,或多或少也都依赖它才能正常运行。
然而互联网技术的更新换代一直是非常快的,因为Adobe一系列失误导致Flash Player错失了在移动平台的发展良机,漏洞太多加上HTML5、WebGL、WebAssembly等技术的不断成熟,当前主流的Chrome、Edge等浏览器于2021年1月22日左右发布的88版也纷纷对Flash Player痛下杀手,取消了其PPAPI插件的运行支持,微软也来补刀推出可选更新 KB4577586直接卸载原系统集成的Flash Player版本。对于那些依赖Flash Player的网站和业务系统,如何保证继续正常运行成为了难题。
二、现有方案
虽然3年前Adobe就建议开发者将Flash内容及程序移植到 HTML5、WebGL 以及 WebAssembly,但客观现实是当初开发Flash相关内容和程序的公司可能都已经倒闭了,或者因为迁移成本过大、或者体制原因无法立项缺乏经费、或者对新技术储备不足等迟迟未做改造,比如咱们的CCTV官网就还有很多视频还需要Flash Player来播放,所以只能从浏览器端想办法了。而想要在浏览器中继续正常使用Flash Player,目前有以下几个可选的方案:
[if !supportLists]1、 [endif]回退旧版本方案
这也是大连车务段采用的保守方案,卸载有时间炸弹逻辑的版本,将Flash Player回退到29版(无锁区及广告骚扰问题)使用,此方案虽然可用了,但不可避免的因为使用的是旧版本,其中存在已曝光的漏洞还是存在很大安全风险的,另外也只能在Chrome、Edge等浏览器87及以下版本及IE浏览器中加载使用。
[if !supportLists]2、 [endif]特有浏览器方案
此方案也就是国产浏览器方案了,如360极速及QQ浏览器等,这些浏览器一般都是双内核,其中的Chromium内核版本一般都比较低,所以还可以继续加载Flash Player来使用,啥时候这些国产浏览器升级内核到88及以上版本,就彻底不支持了。典型的如4399网页游戏网站,也是推荐用户用国产浏览器搭配Flash Player中国区版(解除了时间炸弹但会收集你上网习惯来针对性弹广告)来使用(当然也可以回退版本,不过对小白个人用户来说是不知道如何操作的)。另外Adobe官方对企业用户想要继续使用Flash Player的解决方案说明:Update
for Enterprise Customers Using Adobe Flash Player,推荐的第三方合作方叫HARMAN,据了解给出的方案就是提供一个内置了Flash Player的浏览器,一年五万刀费用,其实也是专有浏览器方案,不能在主流的Chrome、Edge、Firefox等浏览器中使用。
[if !supportLists]3、 [endif]替代技术方案
在Github上有个开源的项目,https://github.com/ruffle-rs/ruffle,是一个用 Rust 语言开发的 Adobe Flash Player 模拟器,通过WASM技术实现在网页播放支持。但Ruffle并非完美无缺,当前它并不能保证完美兼容所有的Flash组件,有时候会遇到出错的情况,另外虽然作为浏览器的扩展可在Chrome等浏览器中调用,不过并未上架浏览器官方商店,只能手工部署安装,对商业用户来说并不友好。由于不是原生官方支持的,其兼容性、稳定性及播放性能都可能存在问题,后续能否长期更新维护也是未知数。
三、改进方案
从现有方案可以看出,想要完美解决问题,需要同时解决时间炸弹问题(32.0.0.371后的版本加入了时间炸弹的问题)、浏览器全兼容运行问题(Chrome、Edge等88版移除了Flash Player运行支持),在中国大陆地区出的特供版虽然无时间炸弹问题,但因为其收集电脑上网信息并针对性弹出广告,广大用户早就怨声载道,自然也不能用在商业环境中。而国际版从30.0.0.113开始的版本就加入了锁区运行限制,就是国际版正常不能在中国大陆地区的电脑上正常运行。所以对最新的国际版通过修改其控件特定位置的字节码从而解除其在锁区问题及时间炸弹问题。而想要兼容Chrome、Edge等88版及以后更高版浏览器的运行,目前全网上都还没有一个成熟的解决方案。通过网络搜索发现有PluginOK中间件(https://codechina.csdn.net/zorrosoft/pluginok)这样一个跨浏览器的原生小程序系统,通过简单摸索和测试验证,证明完全可以用来解决此问题。借助PluginOK中间件,有两种办法可以让Flash Player继续运行在Chrome、Edge等最新版浏览器中:
[if !supportLists]1、[endif]PluginOK中间件搭配IE控件小程序(https://codechina.csdn.net/zorrosoft/pluginok/-/blob/master/Bin/IEApplet.txt),让Chrome、Edge、Firefox等浏览器变成双内核方案,而且还可以指定IE内核运行的版本,这种方案尤其适合那些以前只兼容IE低版本浏览器的网站,只需要对网站做简单改造,通过JS脚本连接Web Socket侦听端口,然后通过JSON组包发送命令即可,前端还可以与IE控件小程序互操作。此方案由于借助了IE内核,内存占用会高一些,可能会遇到IE网页加载ActiveX控件警告问题。
[if !supportLists]2、[endif]PluginOK中间件搭配Flash Player网页播放小程序(https://codechina.csdn.net/zorrosoft/pluginok/-/blob/master/Bin/FlashPlayerApplet.txt),此方案完全甩开IE内核来加载Flash Player的ActiveX控件,运行性能比第一种方案好,内存占用低、体验也更好,不过网站改造这块更多一些,不过是一劳永逸的解决办法,如果是新项目要兼容Flash Player的运行,建议用此方案。
针对以上两个方案,也有体验版程序包可以下载:http://zorrosoft.com/Files/PluginOKFlash.zip,需要的朋友可以试试,如遇到问题,程序包中也有联系方式可以咨询。
这里虽然解决的是Adobe Flash Player的问题,微软的Silverlight也将在2021年10月12日到达支持结束,当初Silverlight可是和Adobe Flex同台竞技的火热程序框架,使用了Silverlight的各种业务系统也非常多,而且只支持IE浏览器。借助PluginOK中间件,还可以将使用了Silverlight的业务系统兼容到Chrome等浏览器运行,也是一箭双雕了。
四、总结
一个好的技术实施方案,首先是要满足客户的刚性需求,其次是尽量降低开发、实施及运营的总成本,再次是是良好的兼容性和稳定性,最后需尽量确保技术方案不能因为浏览器的升级而失效。本文基于当前最新的技术信息和实践经验,提供了这样一个稳定可靠、兼容性好的低成本半开源技术方案,以供大家选型参考。