uniapper
uniapper
  • 发布:2019-12-18 17:16
  • 更新:2020-01-14 11:39
  • 阅读:4249

【报Bug】webview web-view 禁用plus可被绕过 5+App和UniApp均存在此漏洞

分类:HTML5+

详细问题描述

webview.style.plusrequire='none' 无法阻止添加了 <script src="html5plus://ready"></script> 的页面使用html5+对象。

这个问题,在之前我发起的提问中已经得到官方人员的确认!

但是 本来,使用plusrequire:'none'是防止在应用内打开外部链接时被别有用心的人获取到plus对象,进而对应用造成危害。

假设一个场景:

一个app,允许用户(假设安全起见游客无权)添加外部链接,并且该链接可以在app中开一个webview打开。

本来打开外部链接的新窗口设置了requireplus:'none'目的是防止恶意网站执行获取plus对象执行破坏。但是,这个别有用心的用户自制了一个网页,并在网页中加入了<script src="html5plus://ready"></script>。

那么,是不是相当于 requireplus: 'none'是一把锁,而<script src="html5plus://ready"></script&gt是开这把锁的钥匙?

恐怖的是,这把钥匙就放在锁的旁边,任何人都能得到。

所以,这把锁有用吗?

UniApp的web-view组件同样存在该漏洞!!!

按照uniapp官方示例 https://uniapp.dcloud.io/component/web-view
我载入了一个本地页面 并在页面中加入了 <script src="html5plus://ready"></script> 这个 禁用 plus的 也被轻易打开了。

附件是一个简版demo源码(因为uniapp打包后超过14M无法上传)

希望官方重视起来。毕竟不是所有人都了解这个 plus禁用可被绕过的问题!!!

<template>  
    <view>  
    </view>  
</template>  
<script>  
var wv;//计划创建的webview  
export default {  
    onLoad() {  
        // #ifdef APP-PLUS  
        wv = plus.webview.create("","custom-webview",{  
            plusrequire:"none", //禁止远程网页使用plus的API,有些使用mui制作的网页可能会监听plus.key,造成关闭页面混乱,可以通过这种方式禁止  
      'uni-app': 'none', //不加载uni-app渲染层框架,避免样式冲突  
            top:uni.getSystemInfoSync().statusBarHeight+44 //放置在titleNView下方。如果还想在webview上方加个地址栏的什么的,可以继续降低TOP值  
        })  
        wv.loadURL("/hybride/html/local.html")  
        var currentWebview = this.$mp.page.$getAppWebview() //获取当前页面的webview对象  
        currentWebview.append(wv);//一定要append到当前的页面里!!!才能跟随当前页面一起做动画,一起关闭  
        setTimeout(function() {  
            console.log(wv.getStyle())  
        }, 1000);//如果是首页的onload调用时需要延时一下,二级页面无需延时,可直接获取  
        // #endif  
    }  
};  
</script>

重现步骤

[步骤]
1 安装附件apk
2 打开app
3 点击首页右上角 图标 打开 about页面
4 等待2秒
5 会弹出alert 内容是JSON.stringify(plus)

[结果]

禁用plus无效

[期望]
能够做到 真正禁用plus
或 调高webview.style.plusrequire='none' 的优先级。无论加载的网页是否包含<script src="html5plus://ready"></script>,都要确保已经设置plusrequire为'none'的webview中的网页无法获取并使用html5+对象。

[如果语言难以表述清晰,拍一个视频或截图,有图有真相]

IDE运行环境说明

[HBuilder 或 HBuilderX。如果你用其他工具开发uni-app,也需要在此说明]

[IDE版本号]

[windows版本号]

[mac版本号]

uni-app运行环境说明

[运行端是h5或app或某个小程序?]

[运行端版本号]

[项目是cli创建的还是HBuilderX创建的?如果是cli创建的,请更新到最新版cli再试]

[编译模式是老模板模式还是新的自定义组件模式?]

App运行环境说明

[Android版本号]

[iOS版本号]

[手机型号]

[模拟器型号]

附件

[IDE问题请提供HBuilderX运行日志。菜单帮助-查看运行日志,点右键打开文件所在目录,将log文件压缩成zip包上传]

[App问题请提供可重现问题的代码片段,你补充的细一点,问题就解决的快一点]

[App安装包或H5地址]

[可重现代码片段]

联系方式

[QQ]

2019-12-18 17:16 负责人:无 分享
已邀请:

最佳回复

DCloud_heavensoft

DCloud_heavensoft

HBuilderX 2.5.6起,新增了plus属性 disablePlus,解决加载外部页面时可能调用plus对应用造成危害的隐患

  • jimmy_zejia

    disablePlus:true之后如何进行通信?

    2021-08-12 15:22

DCloud_App_Array

DCloud_App_Array

HBuilderX2.5.6+版本Webview窗口样式新增disablePlus属性(Boolean类型)禁止使用5+ API,示例如下:

var webview = plus.webview.create('url', 'id', {  
    disablePlus: true,  
    plusrequire: 'none'  
});

这样设置后webviwe窗口将无法调用任何5+ API,即使页面中加载了框架也无法调用,可解决外部网页恶意调用plus的隐患。

  • uniapper (作者)

    这个必须来个大大的赞!

    2020-01-15 15:08

uniapper

uniapper (作者) - abc

没有人说说吗?

DCMarvel

DCMarvel

问题有点儿严重,顶一下

DCloud_App_Array

DCloud_App_Array

requireplus参数设计的目的不是禁止调用plus,而是设置不预加载plus。禁止调用plus的功能后续会提供新的参数配置

  • uniapper (作者)

    其实,这个问题我已经提了好久了。官方也一直在说后续会提供参数。


    感觉这个“后续”会提供的参数有必要提高一下优先级。因为,即使所有使用5+app的webview或uniapp的web-view的场景,加载的都是自己可控的url。也有网站被黑从而被恶意调用plus的危险。


    因为,按照官方文档的描述,会让人认为这个参数就是“禁止调用”,从而加上该参数之后,放心的让用户打开任意页面。

    1、 uniapp web-view 页面: plusrequire:"none", //禁止远程网页使用plus的API,有些使用mui制作的网页可能会监听plus.key,造成关闭页面混乱,可以通过这种方式禁止


    2、 5+Api webview 页面: plusrequire: (String 类型 )控制Webview注入5+ API时机

    可取值: "ahead" - 尽量提前注入,拦截页面中网络js请求实现提前注入,如果没有拦截到js请求则在页面loaded时注入; "normal" - 页面loaded时注入; "later" - 较晚在注入,在loaded事件发生后2s再注入,plusready事件同样延迟触发; "none" - 不注入,页面无法调用5+ API,不触发plusready事件。 默认值为"normal"。

    2020-01-06 12:34

  • w***@gmail.com

    回复 uniapper: 大佬,请教个问题!plus.webview.create('url', 'id', {

    disablePlus: true,

    plusrequire: 'none'

    }); 我们现在使用的是vue,这个url参数改怎么写才行? vue只有一个index. html,我是想实现ios侧滑功能。

    2020-01-16 14:41

  • uniapper (作者)

    回复 w***@gmail.com: vue 有路由功能啊 https://router.vuejs.org/zh/

    2020-01-16 15:23

  • w***@gmail.com

    回复 uniapper: 但是用vue路由,没法实现侧滑返回呀? 使用plus.webview.create 这种方式可以加入侧滑返回,但是第一个url参数不知道怎么写了。。。。文档上写的都是xxx.html。vue里只有index.html。

    2020-01-16 15:31

该问题目前已经被锁定, 无法添加新回复