Как безопасно предварительно загрузить контент в основной процесс перед созданием главного окна? - PullRequest
0 голосов
/ 09 марта 2020

Я создаю приложение (на базе 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, я буду очень признателен.

1 Ответ

0 голосов
/ 11 марта 2020
  1. Да, это нормально для использования node.js require в основном процессе (используйте любую библиотеку с обработкой ошибок, потому что она может создать sh приложение)
  2. Вы можете сделать HTTP-запрос из основного процесса
  3. Вы можете использовать Preload. js, если вам нужен результат выполнения кода в процессе рендерера. (Вы также можете использовать ip c)
...