Я создаю приложение (на базе Electron ), в котором мне нужно получить информацию со стороннего веб-сайта перед созданием главного окна, но я немного запутался в мерах безопасности. Я использую ax ios для выполнения HTTP-запроса внутри основного процесса, потому что он основан на обещаниях, и я могу создать окно после загрузки веб-сайта. Мои опасения таковы:
Включение nodeIntegration не очень хорошо при работе с процессом рендеринга из-за атаки межсайтового скриптинга. Должен ли я включить все nodejs модули в предзагрузку. js, например, как показано ниже.
index. html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="script-src 'self';">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Viewer</title>
</head>
<body>
<div id="box">
<form id='fo'>
<input type="text" id="num">
<button type="button" id="bttn">Random</button>
</form>
</div>
<script src="renderer.js"></script>
</body>
</html>
main. js
const electron = require('electron');
const cheerio = require('cheerio');
const axios = require('axios').default;
const path = require('path');
const {app, BrowserWindow, ipcMain, Menu, MenuItem,session} = electron;
let win;
let url = 'sampletext';
function createWindow() {
win = new BrowserWindow({
width: 400,
height: 250,
webPreferences:{
nodeIntegration: false,
contextIsolation: true,
preload: path.join(app.getAppPath(), 'preload.js')
},
show: false,
});
win.loadFile('index.html');
win.once('ready-to-show', () =>{
win.show();
});
win.on('closed', () =>{
win = null;
});
}
app.whenReady().then(getRequest().then(res => {
const $ = cheerio.load(res);
if($('infoNeeded')){
random = get_numbers($('infoNeeded').attr('href'));
}
createWindow();
}));
app.on('window-all-closed', () =>{
app.quit();
});
function getRequest() {
return axios.get(url).then(res => res.data).catch(err => console.log(err));
}
preload. js
//Instead of using getRequest() on main.js use this file
const electron = require('electron');
const remote = require('electron').remote;
const cheerio = require('cheerio');
const axios = require('axios').default;
let url = 'sampletext';
//So I can use it in renderer.js
window.getReq = function () {
return axios.get(url).then(res => res.data).catch(err => console.log(err));
}
window.parseInfo = function (data) {
const $ = cheerio.load(data);
if($('infoNeeded')){
return random = get_numbers($('infoNeeded').attr('href'));
}
return;
}
//Preload first request
window.getReq().then(doStuffHere);
рендер. js
let info;
//Keep updating the info
setInterval( () =>{
window.getReq().then(data => {
info = window.parseInfo(data);
});
}, 10000);
1) Это нормально делать nodejs требуют внутри основного процесса? Если нет, то какой безопасный способ сделать это?
2) Могу ли я сделать HTTP-запросы внутри основного процесса? Если да, должен ли я отправлять заголовок CSP при этом?
3) Вместо выполнения запроса внутри основного. js, следует ли мне использовать свойство "webPreferences: preload" и сделать первый HTTP-запрос внутри предзагрузки. js (как в примере выше)? (Мне нужно получить информацию перед тем, как отправить ее рендереру. js)
Я уже прочитал https://www.electronjs.org/docs/tutorial/security, но я не смог asp их учить. Если бы вы могли дать ответ о том, как и когда использовать предварительную загрузку. js и заголовок CSP, я буду очень признателен.