Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
LavaDome — Изоляция и инкапсуляция защищённых DOM-деревьев с использованием ShadowDOM | Kitploit
Инструменты/GitHubGitHub/lavamoat/lavadome
Оборонительные ИнструментыВеб-безопасностьКонфиденциальность
GitHublavamoat/lavadome

LavaDome

Изоляция и инкапсуляция защищённых DOM-деревьев с использованием ShadowDOM

РепозиторийСайт
36541 год назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

LavaDome 🌋️

~ Новый инструмент LavaMoat для DOM-узлов с защищённой Eнкапсуляцией ~

⚠️ ЭКСПЕРИМЕНТАЛЬНО [WIP] - ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК (подробнее)

Демо

Попробуйте LavaDome - посетите демо-приложение, откройте консоль и сделайте всё возможное, чтобы украсть секрет из экземпляра LavaDome (сообщите о своём успехе)

Предпросмотр (нажмите, чтобы раскрыть)
LavaDome DEMO

Мотивация

В современных веб-стандартах нет устоявшегося способа выборочно изолировать поддеревья DOM безопасным образом. Другими словами, мы не можем контролировать доступ к разделам DOM, предоставляя доступ одним сторонам и блокируя его для других, если они используют одну и ту же среду выполнения JavaScript.

Мы живём в мире, где больше не можем доверять коду в наших собственных приложениях, и выполнение в одном origin не гарантирует безопасность. Чтобы защитить секреты во фронтенде, мы должны иметь возможность показывать контент пользователю, гарантируя, что он не может быть скомпрометирован JavaScript-кодом, работающим в том же origin.

Пример

Один из вариантов использования такой функции — переключатель MetaMask «show private key», который экспортирует приватный ключ в открытый текст по запросу пользователя. (нажмите, чтобы раскрыть)
Show private key feature by MetaMask

В настоящее время этот чувствительный контент просто присоединяется к DOM после экспорта, что делает его полностью доступным для всех сущностей, работающих в том же приложении. То есть части кода, которые не должны иметь доступ к приватному ключу, могут легко извлечь его в открытом виде, если вредоносный код имеет доступ к DOM.

Но не волнуйтесь. Мы считаем, что это решаемая проблема 👇

Использование

LavaDome в настоящее время поддерживает Vanilla JavaScript и React (в планах — больше)

JavaScript```javascript

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

root@kitploit:~
### [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} />
    </>;
}

API

В дополнение к корневому узлу, все конструкторы принимают необязательный второй аргумент options:```javascript // javascript new LavaDomeJavaScript(root, { // boolean unsafeOpenModeShadow: false, });

// react function Secret({ text }) { const {token} = toLavaDomeCapabilities(text); return <LavaDomeReact token={token} // boolean unsafeOpenModeShadow={false} /> }

root@kitploit:~
### Безопасное использование

Из-за ограничений веб-ядра, чтобы безопасно интегрировать LavaDome, нужно учитывать несколько моментов, требующих активных действий со стороны разработчика, выполняющего интеграцию:

#### Порядок выполнения

LavaDome, как и любое другое программное обеспечение для безопасности на JavaScript, всегда уязвим для кода, выполняемого до его загрузки.

Это означает, что, за исключением кода, которому мы абсолютно доверяем, LavaDome должен быть первым фрагментом кода, загружаемым в программу веб-приложения.

Хотя это не означает, что разработчик должен использовать его немедленно (а только тогда, когда это необходимо), он всё же обязан подключить программу как можно раньше.

Чтобы сделать это правильно (безопасно), он должен быть первым объявлением import/require во всей программе:```javascript
import '@lavamoat/lavadome-react';
import 'other-stuff';

console.log('Program starts here');

Таким образом мы гарантируем, что LavaDome успеет подготовиться к безопасному использованию.

Обратите внимание, что это относится и к остальным пакетам LavaDome, а не только к @lavamoat/lavadome-react (поэтому импортировать более одного из них необязательно).

Перейдите к разделу Безопасность(defensive-coding), чтобы узнать больше.

CSP

Из-за атак по побочным каналам и ограничений веб-платформы импорт удалённых шрифтов может стать успешным методом атаки на LavaDome. Поскольку это встроено в область CSS, решить эту проблему средствами LavaDome на данный момент невозможно.

К счастью, это можно эффективно решить с помощью директивы font-src CSP.

Чтобы снизить риск такой атаки, убедитесь, что ваше веб-приложение не разрешает загрузку шрифтов с неизвестных серверов.

Перейдите к разделу Безопасность(side-channeling), чтобы узнать больше.

Непредсказуемый текст

Текст, передаваемый разработчиком в LavaDome, должен быть на 100% непредсказуемым, иначе он может быть атакован и похищен.

Так, если ваше приложение должно отображать "your key is 234789", это означает, что структура DOM должна быть:```html your key is 234789

root@kitploit:~
и не должно быть:```html
<span> <lavadome>your key is 234789</lavadome> </span>

Переходите к Безопасность(findability), чтобы узнать больше.

Тестирование

Интеграция LavaDome может оказаться непростой при тестировании: поскольку LavaDome отлично скрывает секрет, он точно так же хорошо скрывает его и от ваших тестов!

Чтобы успешно интегрировать LavaDome в вашу тестовую среду, вам может понадобиться помощь LavaDomeDebug, который экспортируется из @lavamoat/lavadome-core:```javascript // IMPORT/USE FOR TESTING/DEBUGGING PURPOSES ONLY - NEVER IN PRODUCTION! import { LavaDomeDebug } from '@lavamoat/lavadome-core';

root@kitploit:~
Вот некоторые из отладочных методов-утилит, которые экспортирует `LavaDomeDebug` и которые могут помочь вам при тестировании компонентов на основе `LavaDome`:

#### `getTextByRoot()`

Получив корневой элемент, к которому подключён `LavaDome`, `getTextByRoot()` рекурсивно извлечёт и восстановит внутренний секрет. Чтобы это стало возможным, экземпляр `LavaDome` должен быть изначально создан с небезопасным параметром `@unsafeOpenModeShadow`, который делает внутренние тени `LavaDome` доступными извне.

Разумеется, это НЕБЕЗОПАСНО и делает `LavaDome` полностью уязвимым, однако имеет смысл использовать только в целях тестирования/отладки — обязательно убедитесь, что этот параметр никогда не включён в production!```javascript
new LavaDomeJavaScript(root, {
    unsafeOpenModeShadow: isThisTestingEnv, // boolean
}).text('123456');
LavaDomeDebug.getTextByRoot(root) === '123456'; // true

stripDistractionFromText()

При использовании веб-драйверов для тестирования и указании им извлекать внутренний текст корневого элемента экземпляра LavaDome, они возвращают строку, содержащую как секрет, так и отвлекающий текст LavaDome.

Отвлекающий текст важен для безопасности (см. Security(side-channeling)), но из-за него веб-драйвер извлекает символы, которые на самом деле не являются частью секрета.

Чтобы решить эту проблему, stripDistractionFromText() принимает текст, полученный веб-драйвером, и удаляет из него отвлекающий текст, оставляя только ту точную строку, которую ваши тесты ожидают найти.

Не беспокойтесь об отвлекающем тексте: он никогда не будет видимым или интерактивным для пользователя в вашем приложении, но он должен существовать по соображениям безопасности.```javascript new LavaDomeJavaScript(root).text('123456'); const element = await driver.findElement('#ROOT'); // driver const text = await element.getText(); // driver LavaDomeDebug.stripDistractionFromText(text) === '123456'; // true

root@kitploit:~
## Разработка

Чтобы настроить локальную сборочную версию **`LavaDome`**, клонируйте этот репозиторий и выполните одну из следующих команд:```bash
npm install && npm install --global serve

I don't see any content to translate — the input after "INPUT:" is empty. Please provide the chunk text you'd like translated.```bash yarn install && yarn global add serve

root@kitploit:~
## Решение

Веб-API [`ShadowDom`](https://web.dev/articles/`ShadowDom`-v1) позволяет нам изолировать и инкапсулировать узлы DOM. Хотя он [не задумывался как средство безопасности](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` хорошо подходит для изоляции поддеревьев DOM от JavaScript и CSS, выполняющихся в других местах страницы.

Базовый подход **`LavaDome`** заключается в использовании `ShadowDom` с тщательным устранением его [потенциальных пробелов в безопасности](https://blog.ankursundara.com/shadow-dom/).

**[LavaDome](https://github.com/lavamoat/lavadome/)** задуман как **средство безопасности в наборе инструментов LavaMoat** для реализации компонентов только на стороне фронтенда, которые допускают исключительно взаимодействие с пользователем и доверенным кодом, блокируя при этом попытки доступа со стороны недоверенного JavaScript и CSS-кода в приложении.

> Отдельная благодарность [@arxenix](https://github.com/arxenix) за его [исследование](https://blog.ankursundara.com/shadow-dom/) безопасности `ShadowDom`, которое послужило основой для значительных улучшений безопасности, реализованных в **`LavaDome`**.

## Цели

Проект **`LavaDome`** руководствуется следующими основными принципами:

### Безопасность

Наш главный приоритет — обеспечение абсолютной безопасности. Мы дополнили API `ShadowDom` расширенными свойствами безопасности, чтобы сделать его безопасным для использования при отображении конфиденциальной информации.

Посетите раздел [Безопасность](#Security), чтобы узнать больше об этой работе.

### DX

Мы стремимся обеспечить удобство работы разработчиков. Для этого мы планируем:

1. Поддерживать как можно больше популярных фреймворков (React, Angular и т. д.);
2. Сделать API лёгким и простым в использовании.

### Режим только чтения

На данном этапе мы не планируем поддерживать режим записи, то есть **`LavaDome`** будет принимать для защиты только содержимое в виде обычного текста (plaintext) и ничего более сложного.

Это связано с тем, что поддержка режима записи потребует реализации нетривиальной изолированной DOM, что влечёт за собой множество осложнений в области безопасности, к которым мы пока не готовы, например:

1. Безопасность обработчиков событий — предотвращение перехвата внешним кодом ввода, предназначенного для внутренних узлов LavaDome.
2. Безопасность оверлеев — предотвращение наложения вредоносным кодом фишинговой DOM-разметки поверх **`LavaDome`**, чтобы заставить пользователя передавать конфиденциальные данные не тому получателю.

## Проектирование

Сложность проектирования этого проекта невысока. Однако выполнение совокупных требований реализуемых в нём принципов безопасности — нетривиальная задача (см. [Безопасность](#Security)).

**`LavaDome`** состоит из следующих пакетов:

### [Core](https://github.com/lavamoat/lavadome/blob/main/packages/core)

Реализует базовый уровень API, который обеспечивает взаимодействие между потребителем и защищённым изолированным компонентом. API стремится допускать как можно больше внешних манипуляций с изолированным компонентом, не предоставляя при этом реальных DOM-узлов изнутри него никому — даже потребителю LavaDome, — чтобы поддерживать максимально возможный уровень безопасности.

Кроме того, на него возлагается реализация всех необходимых мер по усилению безопасности, чтобы использование возможностей `ShadowDom` было по-настоящему безопасным, в отличие от его исходной природы, в которой он по умолчанию не является средством безопасности (см. [Безопасность](#Security)).

> Помните: пакет core не предназначен для использования в производстве!

### [JavaScript](https://github.com/lavamoat/lavadome/blob/main/packages/javascript) / [React](https://github.com/lavamoat/lavadome/blob/main/packages/react) / и т. д.

Экспортируют функциональные возможности, позволяя разработчикам использовать **`LavaDome`** так, как им удобно, — будь то через JavaScript или в виде React-компонента (или на любой другой платформе — [спрашивайте!](https://github.com/lavamoat/lavadome/issues/new?title=**`LavaDome`**+misses+support+for+...))

> ПРИМЕЧАНИЕ: Поддержка **`LavaDome`** для фреймворков предполагает интеграцию стороннего кода, который мы не контролируем, что создаёт «слепые зоны безопасности».

> Пожалуйста, прочитайте раздел [Безопасность](#Security), чтобы узнать, как оставаться максимально защищённым при использовании **`LavaDome`** со сторонними фреймворками.

## Безопасность

Если вы планируете использовать **`LavaDome`** в своём проекте, вот аспекты безопасности, о которых следует знать:

### `ShadowDom` против `iframe`

Ещё раз: это всё ещё экспериментальный проект, но мы серьёзно обдумали это решение. Естественная альтернатива использованию `ShadowDom` — применение кросс-оригинных `iframe`. Проникнуть в кросс-оригинный `iframe` невозможно, и спецификация W3C признаёт его критически важным механизмом безопасности. Это означает, что если взлом всё же происходит, он рассматривается как уязвимость безопасности и срочно устраняется производителями браузеров.

Однако недостаток этого подхода в том, что интеграция решения на основе iframe значительно сложнее с точки зрения UI/UX/DX, особенно для инструмента, ориентированного на массовое внедрение.

**`LavaDome`** должен обеспечивать плавный и естественный опыт разработчика и при этом способствовать безопасной интеграции инкапсулированных узлов теневого DOM в родительское дерево DOM, а `ShadowDom` — это DOM-ориентированный API, созданный именно для этой цели. Это сделало его более подходящим для наших целей.

Хотя создатели `ShadowDom` официально не одобряют его как средство безопасности, его реализация отличается высоким уровнем безопасности и не допускает утечки какой-либо инкапсулированной информации из дерева теневого DOM, за исключением весьма специфических сценариев.

Мы считаем, что, тщательно проработав именно эти сценарии, `ShadowDom` можно усовершенствовать до защищённого API инкапсуляции DOM (попробовать стоит).

### Угрозы

Важно рассмотреть текущие угрозы безопасности, характерные для решений на основе `ShadowDom`, таких как `LavaDome`.

#### 1. Инъекция

Разработчики могут передавать **`LavaDome`** HTML/JS/CSS-содержимое, которое при загрузке может случайно или намеренно привести к утечке DOM-узлов из `ShadowDom`, например за счёт динамического добавления JavaScript-кода во время выполнения.

Прочитайте [исследование](https://blog.ankursundara.com/shadow-dom/#contenteditable-or-css-injection) [@arxenix](https://github.com/arxenix), чтобы узнать больше об этом приёме.

Чтобы исключить такую возможность, **`LavaDome`** вообще не принимает DOM-узлы в дерево теневого DOM и поддерживает инкапсуляцию только обычного текста. Это избавляет нас от необходимости бороться с проблемами безопасности, присущими доверию к пользовательскому HTML/JS/CSS-содержимому.

В будущем мы хотели бы пересмотреть это решение, когда найдём стабильный и безопасный способ поддержки ввода DOM-узлов и поддеревьев.

#### 2. Обнаруживаемость

API [find()](https://developer.mozilla.org/en-US/docs/Web/API/Window/find) позволяет разработчикам находить и извлекать DOM-узлы, выполняя поиск по содержащемуся в них тексту. На данный момент это единственный известный API, которому успешно удаётся извлекать DOM-узлы из `ShadowDom`.

<details>
<summary>
    В Firefox, после того как текст найден, можно использовать API <code>getSelection()</code>, чтобы извлечь DOM-узлы из `ShadowDom`, поставив под угрозу всю задумку: <i>(нажмите, чтобы развернуть)</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);
});
`ShadowDom` обход Firefox

Прочитайте исследование от @arxenix, чтобы узнать больше об этом методе.

Чтобы защититься от этой атаки, потребитель LavaDome не должен передавать предсказуемое содержимое в API LavaDome. Хотя это может звучать очевидно, разработчики могут легко поддаться искушению передать LavaDome входные данные, которые выглядят примерно так: The secret is: ldsjf9304rjdkn, что полностью скомпрометирует безопасность LavaDome. Несмотря на то, что часть ldsjf9304rjdkn невозможно угадать, фиксированная фраза "The secret is: " может быть использована для раскрытия секрета, особенно если она ранее была раскрыта в DOM.

Поэтому при использовании LavaDome разработчики ОБЯЗАНЫ передавать на вход только 100% непредсказуемый текст.

Chromium защищён от описанной выше атаки. Однако, если выбранный узел DOM внутри `ShadowDom` является content-editable, злоумышленники могут использовать document.execCommand('insertHTML', ...) для выполнения произвольного кода во внутренней области видимости `ShadowDom` и использовать это для доступа к инкапсулированным узлам DOM. (нажмите, чтобы развернуть) ```js // defender const secret = 'AN UNPREDICTABLE SECRET'; const opts = { mode:'closed' }; const root = document.body.firstElementChild.firstElementChild; const div = document.createElement('div'); const shadow = root.attachShadow(opts); shadow.append(div); const p = document.createElement('p'); p.innerText = 'Secret is: ' + secret; div.appendChild(p); div.setAttribute('contenteditable', 'true');

// 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); });

root@kitploit:~
<div align="center"><img width="800" src="https://assets.kitploit.com/production/public/readmes/48843/b3f770ae9d6ea6070e8ed984e33a2f4df5112128d21d3c01000dd66ee1143733.png" alt="`ShadowDom` bypass Chromium"/></div>
</details>

Чтобы защититься от этого вектора атаки, **`LavaDome`** удаляет все атрибуты стиля из своих пользовательских элементов, используя атрибут стиля с наивысшим приоритетом (`-webkit-user-modify: unset;`). Это гарантирует, что его элементы не уязвимы для инъекции вредоносного внешнего CSS, применяющего атрибут `-webkit-user-modify:read-write`, который делает элементы `ShadowDom` редактируемыми (`contenteditable`).

Вторая техника — использование `contenteditable` в качестве атрибута — в настоящее время не актуальна, поскольку **`LavaDome`** не поддерживает приём DOM-узлов.

#### 3. Возможность выделения и разделение секрета

Описанные выше векторы атаки не так полезны, если нейтрализовать [`getSelection`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection). Сделав текст внутри **`LavaDome`** невыделяемым, мы усилим защиту от возможной инъекции, как показано выше. Это хорошо работает в Chromium, но мы устраняем некоторые проблемы с Firefox.

Если атакующему удастся угадать подмножество секрета, он сможет скомпрометировать весь секрет (при условии, что `getSelection` захватывает узлы внутри их области видимости, как во Firefox). Это происходит потому, что поиск подмножества раскроет текстовый узел, содержащий это подмножество секрета, что даст атакующему доступ ко всему секрету.

В качестве контрмеры **`LavaDome`** хранит каждый символ секрета в собственном `ShadowDom`, гарантируя, что компрометация подмножества секрета не приведёт к компрометации остальной его части. Эта защита даёт дополнительное преимущество: чем длиннее секрет и чем больше возможных вариантов символов он потенциально включает, тем экспоненциально сложнее атакующим раскрыть весь секрет.

Утечка по-прежнему возможна, но только если атакующий переберёт все возможные символы по одному, раскроет все найденные им тени, а затем синхронно расставит их в правильном порядке, чтобы они соответствовали своим позициям внутри главного хоста **`LavaDome`**.

#### 4. Побочные каналы

Ещё одна хорошо известная атака — раскрытие содержимого ShadowDOM на удалённый сервер посимвольно с использованием наследуемых CSS-свойств, таких как `@font-face`.

Рассмотрим следующее [исследование](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html) атаки, задокументированное [@masatokinugawa](https://github.com/masatokinugawa).

Чтобы решить эту проблему, LavaDome добавляет в родительскую тень все возможные символы, так что такая попытка утечки запутывается при поиске всех возможных символов, что делает эту атаку бесполезной (см. https://github.com/LavaMoat/LavaDome/issues/16).

Конечно, утечки по побочным каналам принимают множество форм, некоторые из которых сложнее устранить, например [исследование](https://research.securitum.com/stealing-data-in-great-style-how-to-use-css-to-attack-web-application/) [@securityMB](https://github.com/securityMB), в котором он использует лигатурные шрифты (эксплойт от [@masatokinugawa](https://github.com/masatokinugawa) @ https://github.com/LavaMoat/LavaDome/issues/40).

Чтобы решить эту проблему, разработчики, внедряющие LavaDome, должны задавать строгую CSP-политику `font-src`, чтобы гарантировать невозможность утечки через шрифты на неуправляемые удалённые серверы.

Стоит отметить, что это (теоретически) не сработает в Safari, где эта атака может быть выполнена с использованием локального SVG для формирования шрифтов, что позволяет атакующим оставаться независимыми от CSP (см. WIP @ https://github.com/LavaMoat/LavaDome/issues/40#issuecomment-2090318009).

Ещё один отличный пример атак по побочным каналам — на этот раз без использования шрифтов — использование текстовых фрагментов (см. [эксплойт](https://github.com/LavaMoat/LavaDome/issues/35) от [@masatokinugawa](https://github.com/masatokinugawa)).

#### 5. Защитное программирование

Безопасное решение требует практик защитного программирования.

- С этой целью все нативные API, которые мы используем, кэшируются для внутреннего использования, чтобы предотвратить перенастройку глобальных API атакующими с целью сорвать поток выполнения **`LavaDome`**.

- Если вы замечаете нетрадиционные стилистические решения в исходном коде, вполне вероятно, что они продиктованы принципами защитного программирования.

- **Крайне важно** подключать **`LavaDome`** в приложение до любых недоверенных скриптов, а в идеале — до ВСЕХ скриптов!

- При использовании фреймворковых версий **`LavaDome`** следует исходить из того, что эти фреймворки не написаны с учётом защитного программирования и что используемые нативные API не защищены от вредоносного вмешательства. Имейте в виду: безопасность внешнего кода находится вне контроля **`LavaDome`**.

Поэтому мы рекомендуем всегда интегрировать такие решения безопасности с технологией [SES](https://github.com/endojs/endo/tree/master/packages/ses#ses), разработанной [@agoric](https://github.com/agoric). Это практика безопасности, которой следуют в [LavaMoat](https://github.com/lavamoat/lavamoat) и [MetaMask](https://github.com/MetaMask/metamask-extension).

#### 6. Утечка при внутренней обработке React

Ещё один повод для беспокойства (особенно в контексте React) — тот факт, что входные данные, передаваемые компонентам React, активно утекают через него в глобальный объект, что делает их доступными для недоверенных сущностей, работающих в приложении (что полностью подрывает цель `LavaDome`).

Обратитесь к [открытию](https://github.com/LavaMoat/LavaDome/pull/23#issue-2093459897) от [naugtur](https://github.com/naugtur), чтобы узнать больше.

Чтобы сбалансировать наше намерение поддерживать React и невозможность доверить ему наш секрет, пакет `LavaDomeReact` экспортирует минимальный (но безопасный) функционал для обмена секрета на специальный токен перед передачей его в React, при этом единственной сущностью, способной обменять этот токен обратно на секрет, является сам `LavaDome`.

Несмотря на всю мощь этого подхода, он, к сожалению, требует, чтобы пользователи React самостоятельно выполняли обмен перед передачей секрета в `LavaDomeReact`.

Если пользователь получает что-либо иное, кроме известного токена, генерируется исключение `LavaDome`, чтобы заставить разработчиков безопасно использовать `LavaDomeReact`. 

## Отказ от ответственности

Если вы прочитали всё вышеописанное, у вас должно сложиться хорошее понимание того, почему **`LavaDome`** всё ещё является очень экспериментальным. Делать функцию, не предназначенную для безопасности, безопасной — это по своей сути рискованно, но поскольку в этой области нет хороших готовых решений, мы считаем, что эта попытка — шаг в правильном направлении.

Мы по-прежнему рекомендуем использовать **`LavaDome`**, поскольку это однозначное улучшение по сравнению с опорой только на текущие веб-стандарты. Просто помните: наше решение сделает ваш код "безопаснее", но не "безопасным".

Кроме того, пожалуйста, помните: LavaDome помогает безопасно доставить секрет в DOM. Был ли секрет скомпрометирован до передачи в LavaDome — вне зоны ответственности LavaDome.

Это означает, что именно вы несёте ответственность за сохранность секрета вплоть до момента передачи его в LavaDome.

Лучший способ добиться этого — работать в изолированной среде с использованием [SES](https://github.com/endojs/endo/tree/master/packages/ses#ses) / [LavaMoat](https://github.com/lavamoat/lavamoat).
Скачать инструмент