uniapper
uniapper
  • 发布:2017-10-01 16:29
  • 更新:2017-10-01 22:54
  • 阅读:3393

【安全隐患】 有没有办法禁止远程页面访问 html5+ 的api,比如禁止访问plus对象?

分类:HTML5+

无论是否打包的wap站,难免有时候想在自己app中打开第三方的页面。
比如: 页面中的外部链接 / 允许用户输入网址并在自己的app打开。
那么,问题来了:

1 . 若打开的该第三方页面正好有h5+相关的操作代码,那么很有可能会造成本地app页面操作逻辑混乱(如:本来想将第三方页面限制在一个webview中,但是第三方又有开新窗口的逻辑?)

2 . 更严重的是,若有恶意第三方,故意将自己编写的获取用户本地信息等敏感内容,或破坏app逻辑的相关h5+代码的页面,诱骗用户打开。 可能后果会很严重!

怎么办?

2017-10-01 16:29 负责人:无 分享
已邀请:

最佳回复

DCloud_heavensoft

DCloud_heavensoft

webview有个api专门负责此事,是否允许Webview使用plus api,看Webview的style里的plusrequire

  • uniapper (作者)

    多谢,

    还是自己文档看的不仔细。这样就是写个简单浏览器也没问题了。原来光想着在一个单独WebView实现,现在用父子WebView就解决了

    2017-10-02 09:06

  • DCloud_heavensoft

    回复 uniapper:回复 uniapper:为啥要用父子浏览器?给浏览器的那个Webview设个titleNView做返回就好了。我们不再推荐父子Webview模式了

    2017-10-02 13:25

  • uniapper (作者)

    @16 是。用nativeobj的view更好。但是,刚刚又发现了个问题:

    用nativeobj.view 做了个带地址栏的简易浏览器。把loadURL的webview的plus禁掉了(pluserequire : 'none')。

    这样一来,想监听该页面的上下滑动手势事件然后操作地址栏view的移动(类似手机chrome的页面上划,地址栏隐藏),却无法实现了。

    也想着通过整个webview上面再画一个透明原生view来监听划动事件,但是又想让webview中的网页相关点击等事件不被阻止。这个方案也实现不了了,因为若要view能监听手势事件则需要view.interceptTouchEvent(true),此时,下面的页面就无法触发相应事件。而,view.interceptTouchEvent(false), 下面页面能正常触发相应事件,但view又无法监听。




    所以,最好的办法就是:plus.webview.create()中传入参数,仅允许本地js可以调用plus,而从服务器加载的js(js文件或html中的js代码)禁止调用plus。

    2017-10-02 17:02

  • 码农TT

    如果那个页面加了<script src="html5plus://ready"></script>,就是写了pluserequire : 'none'也可以调用plus api

    2019-06-25 17:16

  • DCloud_App_Array

    回复 码农TT: 页面中script的优先级高于页面的plusrequire:'none'属性。不需要使用plus时不应该添加<script src="html5plus://ready"></script>

    2019-06-25 19:56

  • uniapper (作者)

    回复 DCloud_App_Array: 这样搞的话,plusrequire:'none'存在的意义是啥?

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

    假设一个场景:

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

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

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

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

    所以,这把锁有用吗?

    2019-12-18 16:54

  • DCloud_App_Array

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

    2019-12-18 20:03

赵梦欢

赵梦欢 - 专注前端,乐于分享!

赵梦欢

赵梦欢 - 专注前端,乐于分享!

其实你只需要把不符合要求的外部链接匹配到一个没装载插件的webview下即可,在原生层做可能是最好的,js屏蔽解决不了根本问题,最保险的还是拦截默认跳转,外部链接用外部浏览器打开。

  • uniapper (作者)

    多谢

    2017-10-02 09:07

uniapper

uniapper (作者) - abc

@赵梦欢
想过 使用 plus=undefined 屏蔽
但是,这样本地的脚本怎么用plus??

也想过用沙箱 但是沙箱如果用jS实现的话也是防君子不防小人。 所以,是不是从底层去考虑?

比如 plus.webview.create() 中可以传递相关的开关参数,或者弄个全局的开关 比如在manifest.json中设置一下?

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