前文回顾

这里先复习一下。主要提到的就是大概三点

  • 代码混淆

  • 信息脱敏

  • 云开发

具体就不展开了,然后最近发现其实还可以通过插件的形式实现代码保护。

这里自然会有一个问题,小程序插件可以逆向吗?

逆向插件?

应该有相当一部分同学注意到了,反编译之后的插件目录常常是如下状态:

再谈保护小程序代码的方法_小程序代码

可以发现代码中只有一个json配置文件,其它就啥都没了。没有找到任何有用的文件。(使用root过的安卓及越狱的iPhone也没找到有价值的文件)

就是说并没有逆向拿到插件的本体代码(wxml、js)。

所以初步怀疑有两种可能:
  1. 插件的主体代码是放在云端的使用了插件之后拿下来的代码只是一个外壳,一个框架,反编译是获取不到插件的实质内容的,只能拿到调用的方法,就是说插件本身对于使用者来说是不可见的。 

  2. 插件代码是跟随代码包一起下载下来的(但是会隐含一个问题,即:如果插件代码是本地引用,当小程序使用了过多插件必然会容易导致大小超过限制),但是脚本没有做处理(依然存在逆向的可能)。

所以这就给保护代码提供了一个思路,我们可以把一些关键内容放入插件去实现,这样子就可以降低一下别人抄袭的速度。下面简述一下插件化相关的内容吧,官方文档上都有比较完备的说明的,大家可以自助。

开发插件

插件,是可被添加到小程序内直接使用的功能组件。开发者可以像开发小程序一样开发一个插件,供其他小程序使用。同时,小程序开发者可直接在小程序内使用插件,无需重复开发,为用户提供更丰富的服务。

开放范围及服务类目

开放范围:企业、媒体、政府及其他组织主体

所以如果是个人用户的话,就无法使用这种办法了。

有条件的需要开发插件可以按照官方文档的说明来做就可以了。

使用插件

添加插件

在使用插件前,首先要在小程序管理后台的“设置-第三方服务-插件管理”中添加插件。开发者可登录小程序管理后台,通过 appid 查找插件并添加。如果插件无需申请,添加后可直接使用;否则需要申请并等待插件开发者通过后,方可在小程序中使用相应的插件。

引入插件代码包

在 app.json 中声明需要使用的插件,例如:

  1. {

  2. "plugins": {

  3. "myPlugin": {

  4. "version": "1.0.0",

  5. "provider": "wxidxxxxxxxxxxxxxxxx"

  6. }

  7. }

  8. }

plugins 定义段中可以包含多个插件声明,每个插件声明以一个使用者自定义的插件引用名作为标识,并指明插件的 appid 和需要使用的版本号。其中,引用名(如上例中的 myPlugin)由使用者自定义,无需和插件开发者保持一致或与开发者协调。在后续的插件使用中,该引用名将被用于表示该插件。

在分包内引入插件代码包

如果插件只在一个分包内用到,可以将插件仅放在这个分包内,例如:

  1. {

  2. "subpackages": [

  3. {

  4. "root": "packageA",

  5. "pages": [

  6. "pages/cat",

  7. "pages/dog"

  8. ],

  9. "plugins": {

  10. "myPlugin": {

  11. "version": "1.0.0",

  12. "provider": "wxidxxxxxxxxxxxxxxxx"

  13. }

  14. }

  15. }

  16. ]

  17. }

分包内使用插件有的限制:

  • 仅能在这个分包内使用该插件;

  • 同一个插件不能被多个分包同时引用;

  • 如果基础库版本低于 2.9.0 ,不能从分包外的页面直接跳入分包内的插件页面,需要先跳入分包内的非插件页面、再跳入同一分包内的插件页面。

使用插件

使用插件时,插件的代码对于使用者来说是不可见的。为了正确使用插件,使用者应查看插件详情页面中的“开发文档”一节,阅读由插件开发者提供的插件开发文档,通过文档来明确插件提供的自定义组件、页面名称及提供的 js 接口规范等。

页面

插件的页面从小程序基础库版本 2.1.0 开始支持。

需要跳转到插件页面时,url 使用 plugin:// 前缀,形如 plugin://PLUGINNAME/PLUGINPAGE, 如:

  •  
<navigator url="plugin://myPlugin/hello-page">  Go to pages/hello-page!</navigator>

js 接口

使用插件的 js 接口时,可以使用 requirePlugin 方法。例如,插件提供一个名为 hello 的方法和一个名为 world 的变量,则可以像下面这样调用:

  •  
var myPluginInterface = requirePlugin('myPlugin');
myPluginInterface.hello();var myWorld = myPluginInterface.world;

基础库 2.14.0 起,也可以通过插件的 AppID 来获取接口,如:

  •  
var myPluginInterface = requirePlugin('wxidxxxxxxxxxxxxxxxx');

总结

上述部分内容引用自官方文档,感兴趣并且有条件的同学可以尝试用插件的方式去保护自己的代码。

 

再谈保护小程序代码的方法_微信开发_02

浅谈反扒:如何保证微信小程序代码的安全性

再谈保护小程序代码的方法_小程序_03

获取小程序基础库的N种方法


再谈保护小程序代码的方法_微信开发_04

小程序基础库探究:说说formid生成的实现


再谈保护小程序代码的方法_微信开发_05

vue项目对接钉钉企业内部H5微应用