Electron + MySQL抛出安全警告



我已经安装了Electron和MySql,并让它们很好地协同工作。

  • https://www.npmjs.com/package/mysql
  • https://www.electronjs.org/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Hello world</h1>
</body>

<script>
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'blog'
});
connection.connect();
connection.query('SELECT * FROM posts', function (error, results, fields) {
if (error) throw error;
console.log(results);
});
connection.end();
</script>
</html>

然后在窗口中出现安全错误。

索引.html:16 未捕获的引用错误:未定义要求

我注意到我可以像下面这样覆盖它。

win = new BrowserWindow({
webPreferences: {
nodeIntegration: true
}
});

我读过这很危险,不推荐?这样做时我也会收到警告。

电子安全警告(不安全的内容安全策略( 此渲染器进程没有内容安全性 策略集或启用了"不安全评估"的策略。这会暴露用户 这个程序给不必要的安全风险。

我怎样才能绕过它?

你在这里体验的是Electron开箱即用的沙盒。这可以防止执行用户界面HTML和JavaScript的渲染器进程访问NodeJS API,因此恶意代码实际上不会对用户的计算机造成损害。正如您所说,您可以通过设置nodeIntegration: true来禁用此自动沙盒,这会产生此安全警告,但 Electron 开发人员不认为这是一种好的做法。

但是,如果您无法使用某些解决方法(例如,通过使用preload脚本;请参阅 Electron 文档,特别是本教程关于上下文隔离(,以摆脱警告(这实际上不会造成任何伤害,因为它不会在应用程序打包时显示(,您可以在主进程中设置一个环境变量,如下所示(最好在第一行(:

process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = true;
// Other main process code...

虽然这会删除警告,但我会把它留在原处,这样它就可以提醒你你的安全职责,并在应用程序达到生产就绪状态后重新访问你的代码,使其符合Electron的安全准则。

改用预加载脚本,并将MySQL连接代码放在那里。预加载脚本可以访问要求/节点集成,同时也可以访问内容窗口。您可以使预加载脚本添加到全局窗口对象,以公开用于连接和执行 sql 查询的函数。

最新更新