在使用 Electron WebView 进行开发时需要注意安全问题

你好。我是Play-Doh的Ryosuke。我目前在明治大学综合数理学部应用数理学科就读三年级,专攻统计学系的研究室。

这次我们要写的是关于Electron Webview安全方面需要注意的事项。

电子

Electron是一种可以使用Web技术创建跨平台桌面应用程序的工具。如果想了解由Electron创建的应用程序的相关信息,请查看“Awesome Electron”。

Electron通过在nodejs后台运行并在Chromium浏览器上显示网页来作为桌面应用的表现。由于Electron中的nodejs部分的js进程(主进程)和浏览器部分的js进程(渲染进程)是分开的,因此使用ipc(内部过程调用)作为进程间通信的手段。

而且,在浏览器方面,您可以使用这个HTML标签。webview类似于iframe,可以通过指定URL来显示其他网页。但是,与iframe不同的是,webview内部的javascript进程具有与浏览器的javascript进程不同的实例。当然,webview内部的javascript进程是渲染进程,就像浏览器一样,它具有与主进程进行通信的方式。在安全方面,这里需要注意一些事情。

WebView的安全性。

如果WebView的渲染器进程和主进程之间不需要进行通信,那就没有问题。但是,如果想要进行通信,或者想要在WebView的渲染器进程中使用require来使用nodejs的API,注意在安全方面需要谨慎。

不安全的方法 – nodeintegration

在的属性中,有一个名为nodeintegration的选项。默认情况下,它被设置为false,但可以通过明确指定来允许在webview内访问低级系统功能,如nodejs的require和process。如果想要在webview和主进程之间进行通信,需要使用ipc进行require,所以如果想要实现这一点,最方便的方法是在webview上添加nodeintegration。

然而,XSS存在危险,并且恶意网站可以做很多坏事。因此,请务必确认nodeintegration设置为false。

安全的方式 – 预装

在Webview内如何使用IPC和其他API呢?事实上,通过在preload属性中指定JS文件路径,可以预加载该JS文件。此外,预加载的JS文件没有限制,可以使用require函数,而且preload的作用域与Webview内的作用域是分离的,因此相对较安全。通过合理使用preload,即使在启用nodeintegration为false的Webview内,也能使用所需的Node.js API。

<webview preload="PATH/TO/PREALOD_JS" src="URL">
const {ipcRenderer} = require('electron')

global.sendToHost = (message) => {
  ipcRenderer.sendToHost(message)
}

还有别的值得阅读的东西

    • セキュリティを考える:ElectronでWebブラウザを作る(その2)

 

    • Electronのセキュリティその後

 

    webview Tag
广告
将在 10 秒后关闭
bannerAds