Sicurezza e dati: il suo lavoro resta in locale
PanelCraft è un’applicazione desktop pensata per l’uso offline. Progetti, listini, schede clienti e immagini dei decori sono memorizzati sul suo computer, e l’applicazione è costruita in modo che un file ostile o un componente difettoso non possa andare oltre ciò che gli serve.
Domande sulla sicurezza: hello@panelcraft.store.
Pensata per l’uso offline
Progettazione, taglio, prezzi, disegni, documenti, export per lavorazioni e vista ambiente girano tutti in locale. L’interfaccia dell’applicazione non può caricare nulla dalla rete: i suoi criteri sui contenuti limitano ogni tipo di fonte all’applicazione stessa e la sessione predefinita annulla ogni richiesta tranne file locali, dati e URL blob.
Una sola cosa richiede internet: la licenza. L’applicazione si attiva una volta e poi verifica la licenza online alla scadenza del controllo. Se non raggiunge il servizio di licenza, continua a funzionare per un periodo di tolleranza di alcuni giorni, così un laboratorio con una connessione scadente non viene interrotto. Errori di rete e di server non rimuovono mai una licenza esistente; solo un rifiuto esplicito del servizio lo fa.
Nessun progetto, listino, scheda cliente, immagine di decoro o foto di un ambiente viene mai caricato.
Dove si trovano i suoi dati
Tutto è memorizzato sul suo computer, in posti che può trovare e salvare in backup.
| Dati | Dove | Note |
|---|---|---|
| Progetti | Dove salva il file .panelcraft | Scritti in modo atomico (file temporaneo, poi ridenominazione). L’apertura legge al massimo 50 MB. |
| Indice dei progetti, clienti, preventivi | Un database SQLite locale nella cartella dati dell’applicazione | Tenuto in memoria e salvato in modo atomico dopo ogni transazione. Un file illeggibile viene rinominato e messo da parte, mai eliminato. |
| Librerie e magazzino | File JSON nella cartella dati dell’applicazione | Letti per al massimo 10 MB, verificati prima dell’uso. |
| Immagini dei decori | La cartella dati dell’applicazione, memorizzate per hash del contenuto | Verificate nel contenuto: 8 MB, da 16 a 8192 px, 36 megapixel per immagine. |
| Foto della vista ambiente | Una copia ridotta nella cartella dati dell’applicazione | Al massimo 10 MB, verificata tramite i magic byte, cartella nominata con un hash dell’id del progetto. |
| Licenza | Due copie di un file di stato della licenza nella cartella dati dell’applicazione | Vince la copia valida con l’orario di verifica più recente, perciò eliminare o modificare una copia non azzera il conteggio della prova. |
Le esportazioni lasciano l’applicazione come file semplici: PDF, CSV, DXF, SVG e immagini. È Lei a scegliere dove vengono scritte e l’applicazione non decide mai un percorso al suo posto.
Da cosa difende il progetto
Il modello di minaccia individua quattro avversari. Un file malevolo o danneggiato che apre o importa (un progetto, un CSV, una libreria, un’immagine o un database) è trattato come dato non attendibile. Un’interfaccia compromessa, ad esempio per un difetto in una dipendenza, è trattata anch’essa come non attendibile: non deve poter leggere o scrivere file arbitrari, eseguire codice nel processo principale, aggirare le licenze né raggiungere la rete. Un utente locale che manomette i file di licenza o l’orologio è gestito a un livello ragionevole. E la catena di fornitura, le dipendenze npm ed Electron stesso, è mantenuta ridotta e rivista.
Restano fuori ambito un aggressore che già esegue codice come Lei, un sistema operativo malevolo e l’accesso fisico alla macchina. Nessuna applicazione desktop può difendersi da questi casi e non pretendiamo di farlo.
I controlli
| Ambito | Controllo |
|---|---|
| Isolamento del renderer | Renderer in sandbox con isolamento del contesto e senza integrazione Node. Nessun contenuto remoto e nessuna web view incorporata. Sandbox dell’applicazione attiva per ogni finestra. |
| Chiamate al processo principale | Ogni chiamata è verificata: il mittente deve essere il frame principale della pagina impacchettata, ogni argomento è controllato nel tipo e limitato nella dimensione, i campi sconosciuti vengono scartati e le estensioni di esportazione sono in una lista consentita. |
| Percorsi dei file | L’interfaccia non sceglie mai dove leggere o scrivere. Le letture provengono da finestre native di apertura, le scritture da finestre native di salvataggio o da file di proprietà dell’applicazione. Un percorso è accettato per il salvataggio solo se Lei lo ha scelto in una finestra in questa sessione oppure è già nell’indice scritto dal processo principale. |
| I/O dei file con limiti | Le letture hanno un limite di dimensione (progetto 50 MB, CSV 10 MB, archivi 10 MB, database 512 MB, licenza 64 KB) e devono riguardare file normali, non dispositivi né cartelle. Le scritture usano un nome temporaneo casuale aperto in modo esclusivo e poi ridenominato, così un collegamento inserito ad arte non viene mai seguito. |
| Input malformato | Il testo di progetti, librerie e archivi deve essere interpretabile come oggetto o array JSON prima dell’uso. Gli errori di lettura diventano un messaggio pulito, mai un arresto anomalo. |
| Criteri sui contenuti | Criteri di produzione: fonti di script, stili, immagini, caratteri e connessioni limitate all’applicazione stessa; niente eval; niente script o stili inline; niente frame né oggetti; niente destinazioni base o di moduli. |
| Rendering dei PDF | Una finestra nascosta con JavaScript disattivato, una propria sessione in memoria che annulla tutto tranne gli URL di dati, permessi negati, navigazione e finestre popup negate e un timeout di 60 secondi. Il markup viene ripulito di nuovo nel processo principale, un criterio è inserito come primo elemento e vengono rimossi script, frame, oggetti, embed, elementi base e link e gestori di eventi. Il testo dell’utente viene neutralizzato quando si generano i documenti. |
| Navigazione | La finestra può navigare solo verso la propria pagina; le nuove finestre sono sempre negate; i collegamenti web si aprono nel browser di sistema; web view e richieste di permessi sono negate. |
| Immagini | Le foto di decori e ambienti sono verificate nel contenuto (magic byte e dimensione in pixel nell’intestazione), rifiutate se sono collegamenti, cartelle o file troppo grandi, memorizzate per hash e decodificate senza allentare i criteri sui contenuti. |
| Database | Ogni query è un’istruzione preparata con parametri vincolati. L’unico punto che costruisce un elenco di colonne usa valori letterali fissi. I caratteri jolly sono neutralizzati e test avversari coprono i payload di injection. |
| Rafforzamento del runtime | L’applicazione impacchettata modifica i fuse del runtime: la modalità di esecuzione node è disattivata, la variabile NODE_OPTIONS e le opzioni di inspect sono disattivate, la cifratura dei cookie è attiva, si può caricare solo l’archivio impacchettato e ne viene verificata l’integrità. |
Licenze senza sorveglianza
Una licenza è un token firmato: un insieme di attestazioni (piano, funzioni, scadenza, limite di dispositivi, giorni di tolleranza) e una firma Ed25519 su di esse. L’applicazione verifica la firma sul suo computer con una chiave pubblica incorporata; la chiave privata si trova solo sul server delle licenze. I controlli sulle funzioni girano nel processo principale, dentro i gestori che salvano, esportano e leggono i dati, perciò un’interfaccia modificata non può attivare funzioni.
La gestione del tempo è monotona. L’applicazione ricorda l’ultimo orario visto e non torna mai indietro, quindi riportare indietro l’orologio non prolunga una prova né un periodo di tolleranza. Prova e tolleranza sono contate a partire da quell’orologio.
La chiamata di licenza invia una chiave di licenza e un identificativo del dispositivo, e nulla sui suoi progetti.
Dipendenze e test
Il JavaScript distribuito è poco: React, three.js, una piccola libreria di stato, un motore SQLite compilato in WebAssembly e i pacchetti propri del progetto. Il motore SQLite non richiede una compilazione nativa, e questo elimina una classe di problemi di compilazione per piattaforma.
Il comportamento di sicurezza è coperto da test: controlli sul mittente, verifica di percorsi e argomenti, attraversamento di percorsi e scritture tramite collegamenti, JSON troppo grande o malformato, rafforzamento del markup di stampa, la lista consentita degli URL e i criteri sui contenuti; payload di SQL injection; magic byte dei decori, dimensioni dell’intestazione, bombe di decompressione, attraversamento, collegamenti e manomissioni; e test end-to-end che falsificano percorsi, tentano esportazioni non sicure, violano i criteri sui contenuti, navigano, aprono finestre, inviano chiamate da una finestra estranea e forniscono file ostili e markup PDF ostile.
Se trova un problema di sicurezza, scriva a hello@panelcraft.store con i dettagli.
Il programma in immagini
Lo provi sul suo computer
Scarichi PanelCraft per Windows o macOS e porti un lavoro reale dal disegno al preventivo. La prova di 14 giorni include tutte le funzioni Studio.
Preferisce scriverci prima? Ci contatti a hello@panelcraft.store o consulti le domande frequenti.





