Я создаю электронное клиентское приложение, которое находит сервер в локальной сети, а затем подключается к этому серверу с помощью socket.io. Я хотел бы защитить клиента, запретив ему подключаться к другим серверам, кроме моего, с помощью CSP. Забавно: хотя Chrome выдает нарушение CSP, он все равно подключается.
Вот важные части моего кода:
main. js
function createWindow() {
mainWindow = new BrowserWindow({
width: 1200,
height: 600,
webPreferences: {
preload: path.join(__dirname, "preload.js"),
nodeIntegration: false,
enableRemoteModule: false,
contextIsolation: true,
sandbox: false,
},
});
mainWindow.loadFile("src/index.html");
}
preload. js
const { ipcRenderer } = require("electron");
const io = require("socket.io-client");
process.once("loaded", () => {
ipcRenderer.on("connectSocket", (event, data) => {
connectSocket(data);
});
});
function connectSocket(ip) {
const socket = io("http://" + ip + ":3000");
socket.on("connect", () => {
console.log("connected");
});
}
index. html метатеги
<meta
http-equiv="Content-Security-Policy"
content=" default-src 'self'; connect-src https://example.com"
/>
<meta
http-equiv="X-Content-Security-Policy"
content="default-src 'self'; connect-src https://example.com"
/>
Итак, если сервер обнаружен на 192.168.178.99 (клиент на 192.168.178.11) и я передаю это из основного процесса в предварительный загрузчик функции connectSocket, Chrome / Electron выдает нарушение CSP, например:
websocket.js:124 Refused to connect to 'ws://192.168.178.99:3000/socket.io/?EIO=3&transport=websocket&sid=hrNlyFY6i7-S1fUTAAAK' because it violates the following Content Security Policy directive: "connect-src https://example.com".
Что правильно. Но потом все равно подключается. Это почему? Разве он не может подключаться только к https://example.com?
По крайней мере, так сказано в документации: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/connect-src
Это Chrome 83.0.4103.104, Electron 9.0.4, Node 12.14.1