
Isolamento e incapsulamento sicuri degli alberi DOM tramite ShadowDOM
⚠️ SPERIMENTALE [WIP] - USALO A TUO RISCHIO (scopri di più)
Prova a violare LavaDome - visita l'app demo, apri la console, e fai tutto ciò che è in tuo potere per rubare il segreto dall'interno dell'istanza LavaDome (segnala il tuo successo)
Negli standard web odierni, non esiste un modo consolidato per isolare selettivamente i sottoalberi DOM in maniera sicura. In altre parole, non possiamo controllare l'accesso a sezioni del DOM concedendo l'accesso ad alcune parti e bloccandolo per altre se condividono lo stesso ambiente di esecuzione JavaScript.
Viviamo in un mondo in cui non possiamo più fidarci del codice nelle nostre app, e l'esecuzione same-origin non garantisce la sicurezza. Per proteggere i segreti nel frontend, dobbiamo essere in grado di presentare contenuti all'utente assicurando che non possano essere compromessi da codice JavaScript in esecuzione sulla stessa origin.

Attualmente, questo contenuto sensibile viene semplicemente allegato al DOM una volta esportato, rendendolo completamente accessibile a tutte le entità in esecuzione nella stessa app. Cioè, sezioni del codice che non dovrebbero avere accesso alla chiave privata potrebbero estrarla facilmente in chiaro, purché il codice malintenzionato abbia accesso al DOM.
Ma stai tranquillo. Crediamo che questo sia un problema risolvibile 👇
LavaDome attualmente supporta Vanilla JavaScript e React (con altri in arrivo)
import { LavaDome as LavaDomeJavaScript } from '@lavamoat/lavadome-javascript';
const root = document.getElementById('root'); const lavadome = new LavaDomeJavaScript(root); lavadome.text(secret); lavadome.copy(); // copy to clipboard
### [React](https://github.com/lavamoat/lavadome/blob/main/packages/react)```javascript
import { LavaDome as LavaDomeReact, toLavaDomeToken } from '@lavamoat/lavadome-react';
function Secret({ text }) {
const {token, copy} = toLavaDomeCapabilities(text);
return <>
<a onClick={copy}> copy to clipboard </a>
<LavaDomeReact token={token} />
</>;
}
Oltre al nodo radice, tutti i costruttori accettano un secondo argomento opzionale per le opzioni:```javascript // javascript new LavaDomeJavaScript(root, { // boolean unsafeOpenModeShadow: false, });
// react function Secret({ text }) { const {token} = toLavaDomeCapabilities(text); return <LavaDomeReact token={token} // boolean unsafeOpenModeShadow={false} /> }
### Utilizzo Sicuro
A causa delle limitazioni del web core, per integrare LavaDome in modo sicuro, ci sono alcune cose da tenere a mente che richiedono un impegno attivo da parte dello sviluppatore che integra il programma:
#### Ordine di esecuzione
LavaDome, come qualsiasi altro software di sicurezza JavaScript, è sempre vulnerabile al codice che viene eseguito prima di esso.
Ciò significa che, tranne che per il codice di cui ci fidiamo assolutamente, LavaDome deve essere il primo pezzo di codice a essere caricato nel programma dell'applicazione web.
Anche se questo non significa che lo sviluppatore debba usarlo immediatamente (ma solo quando ne ha bisogno), deve comunque includere il programma il prima possibile.
Per farlo correttamente (in sicurezza), deve essere la prima dichiarazione import/require nell'intero programma:```javascript
import '@lavamoat/lavadome-react';
import 'other-stuff';
console.log('Program starts here');
In questo modo garantiamo che LavaDome possa prepararsi per un utilizzo sicuro.
Nota che questo vale analogamente anche per il resto dei pacchetti LavaDome e non solo per @lavamoat/lavadome-react (quindi importarne più di uno non è necessario).
Vai a Security(defensive-coding) per saperne di più.
A causa degli attacchi side-channel e delle limitazioni del web, l'importazione di font remoti può essere una tecnica efficace contro LavaDome. Poiché è incorporata nei meandri del CSS, affrontare questo problema tramite LavaDome non è attualmente possibile.
Fortunatamente, questo può essere affrontato efficacemente utilizzando la direttiva font-src del CSP.
Per mitigare questa forma di attacco, assicurati che la tua applicazione web non consenta di scaricare font da server sconosciuti.
Vai a Security(side-channeling) per saperne di più.
Il testo fornito a LavaDome dallo sviluppatore deve essere imprevedibile al 100%, altrimenti può essere attaccato e divulgato.
Quindi se la tua app deve mostrare "your key is 234789", significa che la tua struttura DOM dovrebbe essere:```html
your key is 234789
e non deve essere:```html
<span> <lavadome>your key is 234789</lavadome> </span>
Vai a Security(findability) per saperne di più.
Integrare LavaDome può essere complicato nel contesto dei test, poiché LavaDome fa un ottimo lavoro nel nascondere il segreto, nascondendolo molto bene anche ai tuoi test!
Per integrare con successo LavaDome nel tuo ambiente di test, potresti aver bisogno di un aiuto da LavaDomeDebug, che viene esportato da @lavamoat/lavadome-core:```javascript
// IMPORT/USE FOR TESTING/DEBUGGING PURPOSES ONLY - NEVER IN PRODUCTION!
import { LavaDomeDebug } from '@lavamoat/lavadome-core';
Ecco alcuni dei metodi di utilità di debug esportati da `LavaDomeDebug` che possono aiutarti a testare i componenti basati su `LavaDome`:
#### `getTextByRoot()`
Data una root a cui è collegato `LavaDome`, `getTextByRoot()` estrae e ricostruisce ricorsivamente il segreto interno. Per consentire ciò, l'istanza di `LavaDome` deve essere inizializzata originariamente con l'opzione UNSAFE `@unsafeOpenModeShadow`, che rende accessibili dall'esterno le shadow interne di `LavaDome`.
Naturalmente, questa è una scelta UNSAFE e rende `LavaDome` completamente vulnerabile, ma ha senso solo per scopi di test/debugging: assicurati di non abilitare mai questa opzione in produzione!```javascript
new LavaDomeJavaScript(root, {
unsafeOpenModeShadow: isThisTestingEnv, // boolean
}).text('123456');
LavaDomeDebug.getTextByRoot(root) === '123456'; // true
stripDistractionFromText()Quando si utilizzano i web driver per i test e si chiede loro di estrarre il testo interno della radice di un'istanza di LavaDome, questi restituiscono una stringa che contiene sia il segreto sia il testo di distrazione di LavaDome.
Il testo di distrazione è importante per la sicurezza (vedi Sicurezza (side-channeling)), ma fa sì che i web driver estraggano caratteri che non fanno realmente parte del segreto.
Per risolvere il problema, data la stringa ottenuta dal web driver, stripDistractionFromText() rimuove il testo di distrazione, lasciando solo la stringa esatta che i tuoi test si aspettano di trovare.
Non preoccuparti del testo di distrazione: non sarà mai visibile/interagibile per l'utente nella tua app, ma deve esistere per motivi di sicurezza```javascript new LavaDomeJavaScript(root).text('123456'); const element = await driver.findElement('#ROOT'); // driver const text = await element.getText(); // driver LavaDomeDebug.stripDistractionFromText(text) === '123456'; // true
## Sviluppo
Per configurare una build di sviluppo locale di **`LavaDome`**, clona questo repository ed esegui uno dei seguenti comandi:```bash
npm install && npm install --global serve
Possiamo configurare il limite della dimensione del corpo della richiesta impostando una dimensione massima. Questo limite dovrebbe essere applicato alla quantità di dati che possono essere trasmessi in una singola richiesta, prevenendo potenziali attacchi di esaurimento della memoria.
[!NOTE]
Il parametromax-sizeaccetta solo valori interi. Il valore è interpretato come byte, a meno che non venga specificato un suffisso. I suffissik,megrappresentano rispettivamente kilobyte, megabyte e gigabyte.
Per ridurre la larghezza di banda e migliorare la velocità di trasferimento, puoi attivare
la compressione delle risposte. Aggiungi il flag --compress per abilitarla.
Per abilitare la crittografia SSL/TLS, usa il flag --ssl e fornisci i
file del certificato e della chiave:
myapp --ssl --cert /path/to/cert.pem --key /path/to/key.pem
Durante lo sviluppo, puoi abilitare l'hot reload per riavviare automaticamente
l'applicazione quando i file sorgente cambiano. Usa il flag --hot-reload.
Per raccogliere metriche di runtime, esponi un endpoint /metrics usando il
flag --metrics. Prometheus può quindi effettuare lo scraping dei dati.```bash
yarn install && yarn global add serve
## Soluzione
L'API Web [`ShadowDom`](https://web.dev/articles/`ShadowDom`-v1) ci consente di isolare e incapsulare i nodi DOM. Sebbene [non sia progettata come funzionalità di sicurezza](https://web.dev/articles/`ShadowDom`-v1#:~:text=Note%3A%20Closed%20shadow%20roots%20are%20not%20very%20useful.%20Some%20developers%20will%20see%20closed%20mode%20as%20an%20artificial%20security%20feature.%20But%20let%27s%20be%20clear%2C%20it%27s%20not%20a%20security%20feature.for%20Closed%20mode%20simply%20prevents%20outside%20JS%20from%20drilling%20into%20an%20element%27s%20internal%20DOM.), `ShadowDom` funziona bene per isolare sottoalberi DOM da JavaScript e CSS in esecuzione altrove nella pagina.
L'approccio di base di **`LavaDome`** è sfruttare `ShadowDom`, affrontando con attenzione le sue [potenziali lacune di sicurezza](https://blog.ankursundara.com/shadow-dom/).
**[LavaDome](https://github.com/lavamoat/lavadome/)** è pensato per essere uno **strumento di sicurezza nella cassetta degli attrezzi LavaMoat** per implementare componenti solo-frontend che consentano esclusivamente interazioni con l'utente e con codice fidato, bloccando al contempo i tentativi di accesso da parte di codice JavaScript e CSS non fidato nell'app.
> Un ringraziamento a [@arxenix](https://github.com/arxenix) per la loro [ricerca](https://blog.ankursundara.com/shadow-dom/) sulla sicurezza di `ShadowDom`, che ha fornito le basi per importanti miglioramenti di sicurezza implementati in **`LavaDome`**.
## Obiettivi
Il progetto **`LavaDome`** segue i seguenti principi fondamentali:
### Sicuro
La nostra priorità assoluta è garantire una sicurezza a prova di falle. Abbiamo avvolto l'API `ShadowDom` con proprietà di sicurezza avanzate per renderne sicuro l'uso quando si presentano informazioni sensibili.
Visita [Sicurezza](#Security) per saperne di più su questo lavoro.
### DX
Ci impegniamo a fornire un'esperienza di sviluppo fluida. A tal fine:
1. Supportiamo quanti più framework popolari possibile (React, Angular, ecc.);
2. Rendiamo l'API facile e semplice da usare.
### Solo modalità di lettura
In questa fase, non prevediamo di supportare la modalità di scrittura, il che significa che **`LavaDome`** accetterà solo contenuti in testo semplice da proteggere, e niente di più complesso.
Questo perché supportare la modalità di scrittura richiederebbe l'implementazione di un DOM isolato intrattabile, che introduce molteplici complicazioni di sicurezza che non siamo ancora pronti ad affrontare, come:
1. Sicurezza degli event listener - impedire al codice esterno di intercettare input destinati ai nodi interni di LavaDome.
2. Sicurezza delle sovrapposizioni - impedire a codice dannoso di sovrapporre un DOM di phishing su **`LavaDome`** per indurre l'utente a fornire input sensibili all'entità sbagliata.
## Design
La complessità progettuale di questo progetto non è elevata. Tuttavia, soddisfare i requisiti combinati dei principi di sicurezza che implementa è un compito non banale (vedi [Sicurezza](#Security)).
**`LavaDome`** è composto dai seguenti pacchetti:
### [Core](https://github.com/lavamoat/lavadome/blob/main/packages/core)
Implementa il livello API di base che gestisce la comunicazione tra il consumatore e il componente isolato protetto. L'API mira a consentire quante più manipolazioni esterne possibile del componente isolato senza fornire a nessuno i nodi DOM effettivi al suo interno - nemmeno al consumatore di LavaDome - per mantenere il massimo livello di sicurezza possibile.
Inoltre, si assume la responsabilità di implementare tutto l'indurimento di sicurezza necessario per rendere l'uso della funzionalità `ShadowDom` davvero sicuro, in contrasto con la sua natura nativa di non essere una funzionalità di sicurezza per impostazione predefinita (vedi [Sicurezza](#Security)).
> Ricorda: il pacchetto core non è da usare per scopi di produzione!
### [JavaScript](https://github.com/lavamoat/lavadome/blob/main/packages/javascript) / [React](https://github.com/lavamoat/lavadome/blob/main/packages/react) / ecc.
Esportano funzionalità affinché gli sviluppatori possano utilizzare **`LavaDome`** come preferiscono, sia tramite JavaScript che come componente React (o qualsiasi altra piattaforma - [chiedete pure!](https://github.com/lavamoat/lavadome/issues/new?title=**`LavaDome`**+misses+support+for+...))
> NOTA: fornire supporto **`LavaDome`** per framework integra codice di terze parti che non controlliamo, il che crea "punti ciechi di sicurezza".
> Si prega di leggere la sezione [Sicurezza](#Security) per sapere come rimanere il più al sicuro possibile quando si usa **`LavaDome`** con framework di terze parti.
## Sicurezza
Se hai intenzione di usare **`LavaDome`** per un progetto, ecco gli aspetti di sicurezza da tenere presenti:
### `ShadowDom` vs `iframe`
Ancora una volta, questo è ancora un progetto sperimentale, ma abbiamo riflettuto su questa decisione. Un'alternativa naturale all'uso del `ShadowDom` è sfruttare `iframe` cross-origin. Infiltrare un `iframe` cross-origin è impossibile, ed è riconosciuto come meccanismo critico per la sicurezza dalle specifiche W3C. Ciò significa che se una violazione dovesse comunque verificarsi, verrebbe trattata come una vulnerabilità di sicurezza e corretta dai produttori di browser con urgenza.
Lo svantaggio di questo approccio, tuttavia, è che integrare una soluzione basata su iframe è significativamente più difficile, in termini di UI/UX/DX, soprattutto come strumento pensato per un'adozione di massa.
**`LavaDome`** deve fornire un'esperienza di sviluppo fluida e naturale, facilitando al contempo l'integrazione sicura di nodi DOM ombra incapsulati all'interno dell'albero DOM host, e `ShadowDom` è un'API orientata al DOM costruita proprio per questo scopo. Questo l'ha resa più adatta ai nostri obiettivi.
Sebbene l'API `ShadowDom` non sia ufficialmente sostenuta come strumento di sicurezza dai suoi creatori, la sua implementazione è altamente sicura e non fa trapelare alcuna informazione incapsulata dall'interno dell'albero DOM ombra, tranne che in scenari molto specifici.
Crediamo che affrontando con attenzione proprio quegli scenari, `ShadowDom` possa essere potenziata in un'API di incapsulamento DOM sicura (vale la pena provarci).
### Minacce
È importante affrontare le attuali minacce alla sicurezza che esistono con una soluzione basata su `ShadowDom` come `LavaDome`.
#### 1. Iniezione
Gli sviluppatori potrebbero fornire a **`LavaDome`** contenuti HTML/JS/CSS che, una volta caricati, possono accidentalmente o intenzionalmente far trapelare nodi DOM dall'interno del `ShadowDom`, ad esempio aggiungendo dinamicamente codice JavaScript a runtime.
Leggi la [ricerca](https://blog.ankursundara.com/shadow-dom/#contenteditable-or-css-injection) di [@arxenix](https://github.com/arxenix) per saperne di più su questa tecnica.
Per prevenire questa possibilità, **`LavaDome`** non accetta affatto nodi DOM nell'albero del DOM ombra e supporta solo l'incapsulamento di testo semplice. Questo ci evita di dover affrontare i problemi di sicurezza insiti nel fidarsi di contenuti HTML/JS/CSS forniti dall'utente.
Ci piacerebbe riconsiderare questa decisione in futuro, mentre studiamo un mezzo stabile e sicuro per supportare l'input di nodi DOM e sottoalberi.
#### 2. Reperibilità
L'API [find()](https://developer.mozilla.org/en-US/docs/Web/API/Window/find) consente agli sviluppatori di trovare ed estrarre nodi DOM cercando il testo che contengono. Questa è l'unica API finora nota in grado di far trapelare con successo nodi DOM dall'interno di un `ShadowDom`.
<details>
<summary>
In Firefox, dopo aver trovato il testo, si può usare l'API <code>getSelection()</code> per far trapelare nodi DOM dall'interno del `ShadowDom`, compromettendo così l'intera idea: <i>(clicca per espandere)</i>
</summary>```js
// defender
const secret = 'AN UNPREDICTABLE SECRET';
const opts = { mode:'closed' };
const root = document.body.firstElementChild.firstElementChild;
const p = document.createElement('p');
const shadow = root.attachShadow(opts);
shadow.append(p);
p.innerText = 'Secret is: ' + secret;
// attacker
setTimeout(() => {
find('Secret is:'); // assuming the Shadow includes predictable text
console.log('stolen secret: ', getSelection().anchorNode.textContent);
});

Leggi la ricerca di @arxenix per saperne di più su questa tecnica.
Per difendersi da questo attacco, il fruitore di LavaDome non deve passare contenuti prevedibili all'API di LavaDome. Anche se può sembrare ovvio, gli sviluppatori potrebbero facilmente essere tentati di passare a LavaDome un input che assomiglia a The secret is: ldsjf9304rjdkn, il che comprometterebbe completamente la sicurezza di LavaDome. Anche se la parte ldsjf9304rjdkn è imprevedibile, la frase fissa "The secret is: " potrebbe essere sfruttata per rivelare il segreto, soprattutto se era stata precedentemente esposta nel DOM.
Pertanto, quando si utilizza LavaDome, gli sviluppatori DEVONO passare solo testo 100% imprevedibile come input.
document.execCommand('insertHTML', ...) per ottenere l'esecuzione di codice arbitrario nello scope interno del `ShadowDom` e usarlo per accedere ai nodi DOM incapsulati. (clicca per espandere)
// attacker setTimeout(() => { console.log(1, 'stolen secret:'); const bypass = '<audio/src/onerror=console.log(2,this.nextSibling.innerHTML)>'; find('Secret is:'); // assuming the Shadow includes predictable text // assuming the found node is contenteditable=true document.execCommand('insertHTML', false, bypass); });
<div align="center"><img width="800" src="https://assets.kitploit.com/production/public/readmes/48843/b3f770ae9d6ea6070e8ed984e33a2f4df5112128d21d3c01000dd66ee1143733.png" alt="`ShadowDom` bypass Chromium"/></div>
</details>
Per difendersi da questo vettore d'attacco, **`LavaDome`** rimuove tutti gli attributi di stile dai suoi custom elements usando l'attributo di stile con la priorità più alta possibile (`-webkit-user-modify: unset;`). Questo garantisce che i suoi elementi non siano vulnerabili all'iniezione di CSS esterni malevoli che applicano l'attributo `-webkit-user-modify:read-write`, che renderebbe gli elementi `ShadowDom` `contenteditable`.
La seconda tecnica che utilizza `contenteditable` come attributo non è attualmente rilevante poiché **`LavaDome`** non supporta l'accettazione di nodi DOM.
#### 3. Selezionabilità e suddivisione del segreto
I vettori d'attacco precedenti non sono così utili se [`getSelection`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection) viene mitigato. Rendendo il testo contenuto in **`LavaDome`** non selezionabile, rafforziamo la sicurezza contro possibili iniezioni come dimostrato sopra. Questo funziona bene in Chromium, ma stiamo risolvendo alcuni problemi con Firefox.
Se un attaccante riesce a indovinare un sottoinsieme del segreto, può compromettere l'intero segreto (supponendo che `getSelection` catturi nodi con scope come in Firefox). Questo perché la ricerca del sottoinsieme farà trapelare il nodo di testo che contiene quel sottoinsieme del segreto, dando all'attaccante accesso all'intero segreto.
Come contromisura, **`LavaDome`** memorizza ogni carattere del segreto nel proprio `ShadowDom`, garantendo che compromettere un sottoinsieme del segreto non porti al compromesso del resto. Questa salvaguardia ha il vantaggio aggiuntivo di rendere esponenzialmente più difficile per gli attaccanti far trapelare l'intero segreto, più è lungo e più opzioni di caratteri include potenzialmente.
Una violazione è ancora possibile, ma solo se l'attaccante prova con forza bruta tutti i caratteri possibili uno per uno, fa trapelare tutte le shadow che trova, e poi riordina in modo sincrono tutte le shadow correttamente per allinearle con le rispettive posizioni all'interno dell'host principale di **`LavaDome`**.
#### 4. Side channeling
Un altro attacco ben noto è far trapelare i contenuti degli ShadowDOM usando proprietà CSS ereditabili come `@font-face` verso un server remoto, carattere per carattere.
Considera la seguente [ricerca](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html) sull'attacco documentata da [@masatokinugawa](https://github.com/masatokinugawa).
Per affrontare questo problema, LavaDome aggiunge alla Shadow padre tutti i caratteri possibili, così che tale tentativo di leak venga confuso quando trova tutti i caratteri possibili, rendendo questo attacco inutile (vedi https://github.com/LavaMoat/LavaDome/issues/16).
Naturalmente, il side channeling si presenta in molte forme, alcune più difficili da affrontare, come la [ricerca](https://research.securitum.com/stealing-data-in-great-style-how-to-use-css-to-attack-web-application/) di [@securityMB](https://github.com/securityMB) in cui utilizza font con legature (exploit di [@masatokinugawa](https://github.com/masatokinugawa) @ https://github.com/LavaMoat/LavaDome/issues/40).
Per affrontare questo, ci si aspetta che gli sviluppatori che adottano LavaDome impongano una politica CSP `font-src` rigorosa per assicurarsi che la fuga di dati tramite font non sia possibile verso server remoti non controllabili.
Vale la pena notare che questo (teoricamente) non sarà utile in Safari dove questo attacco può essere effettuato usando SVG locali per formare i font, permettendo così agli attaccanti di rimanere indipendenti dalla CSP (vedi WIP @ https://github.com/LavaMoat/LavaDome/issues/40#issuecomment-2090318009).
Un altro grande esempio di attacchi side channeling - questa volta non usando font - è lo sfruttamento dei frammenti di testo (vedi l'[exploit](https://github.com/LavaMoat/LavaDome/issues/35) di [@masatokinugawa](https://github.com/masatokinugawa)).
#### 5. Codifica difensiva
Una soluzione sicura richiede pratiche di codifica difensiva.
- A tal fine, tutte le API native che utilizziamo sono memorizzate nella cache per uso interno, per impedire agli attaccanti di riconfigurare le API globali per sabotare il flusso di esecuzione di **`LavaDome`**.
- Se osservi scelte stilistiche non convenzionali nel codice sorgente, ci sono buone probabilità che siano state dettate da principi di codifica difensiva.
- È **fondamentale** includere **`LavaDome`** nell'app prima di qualsiasi script di cui non ti fidi, e preferibilmente prima di TUTTI gli script!
- Quando si utilizzano le versioni framework di **`LavaDome`**, dovresti presumere che questi framework non siano scritti in modo difensivo e che le API native utilizzate non siano al sicuro da interferenze malevole. Sii avvertito che la sicurezza del codice esterno è fuori dal controllo di **`LavaDome`**.
Pertanto, raccomandiamo di integrare sempre tali soluzioni di sicurezza con la tecnologia [SES](https://github.com/endojs/endo/tree/master/packages/ses#ses) sviluppata da [@agoric](https://github.com/agoric). Questa è una pratica di sicurezza seguita in [LavaMoat](https://github.com/lavamoat/lavamoat) e [MetaMask](https://github.com/MetaMask/metamask-extension).
#### 6. Perdita di dati attraverso i meccanismi interni di React
Un'altra cosa di cui preoccuparsi (specificamente nel contesto di React) è il fatto che l'input fornito ai componenti React viene attivamente divulgato da React all'oggetto globale, rendendolo così disponibile a entità non fidate in esecuzione nell'app (il che mina completamente l'obiettivo di `LavaDome`).
Fai riferimento alla [scoperta](https://github.com/LavaMoat/LavaDome/pull/23#issue-2093459897) di [naugtur](https://github.com/naugtur) per saperne di più.
Per bilanciare la nostra intenzione di supportare React con il fatto che non possiamo fidarci di React con il nostro segreto, il pacchetto `LavaDomeReact` esporta alcune funzionalità minime (ma sicure) per scambiare il segreto con un token speciale prima di passarlo a React, dove l'unica entità che può scambiare quel token di nuovo nel segreto è `LavaDome` stesso.
Sebbene potente, questo richiede purtroppo che gli utenti di React eseguano attivamente lo scambio prima di passare il segreto a `LavaDomeReact`.
Se l'utente riceve qualcosa di diverso da un token noto, viene lanciata un'eccezione generata da `LavaDome`, per costringere gli sviluppatori a usare `LavaDomeReact` in modo sicuro.
## Disclaimer
Se hai letto tutto quanto sopra, dovresti avere una buona idea del perché **`LavaDome`** è ancora molto sperimentale. Rendere sicura una funzionalità non legata alla sicurezza è intrinsecamente rischioso, ma poiché questo spazio di problemi non ha buone soluzioni esistenti, riteniamo che questo tentativo rappresenti un passo nella giusta direzione.
Raccomandiamo comunque l'uso di **`LavaDome`**, poiché rappresenta un miglioramento inequivocabile rispetto al fare affidamento solo sugli attuali standard web. Ricorda solo che la nostra soluzione renderà il tuo codice "più sicuro", ma non "sicuro".
Inoltre, ricorda: LavaDome ti aiuta a portare un segreto nel DOM in modo sicuro. Se il segreto sia stato violato o meno prima di essere passato a LavaDome è fuori dallo scope di LavaDome.
Ciò significa che è tua responsabilità assicurarti che il segreto sia al sicuro fino al punto in cui lo condividi con LavaDome.
Il modo migliore per ottenere questo risultato è eseguire in un ambiente blindato usando [SES](https://github.com/endojs/endo/tree/master/packages/ses#ses) / [LavaMoat](https://github.com/lavamoat/lavamoat).