\n```\n\nИли Web Worker:\n\n```javascript\n// main.js\nconst worker = new Worker('untrusted-worker.js');\n\nworker.onmessage = (event) => {\n console.log('Result:', event.data);\n};\n\nworker.postMessage({ input: userInput });\n\n// untrusted-worker.js\n// Выполняется в полностью изолированном контексте\n// Не имеет доступа к DOM, localStorage, fetch и т.д.\nself.onmessage = (event) => {\n // Может только вычислять и отправлять результат\n const result = process(event.data.input);\n self.postMessage(result);\n};\n```\n\n## Принцип defense in depth (защита в глубину)\n\n```javascript\n// Уровень 1: На краю — валидация и санитизация\nconst input = sanitize(userInput);\n\n// Уровень 2: Минимальные привилегии функций\nconst processData = (() => {\n // Замыкание ограничивает доступ\n const cache = new Map();\n return (data) => cache.get(data);\n})();\n\n// Уровень 3: CSP блокирует опасные операции\n// (браузер, не JavaScript)\n\n// Уровень 4: Изоляция критичного кода\nconst criticalService = new Proxy(originalService, {\n set: () => {\n throw new Error('Cannot modify critical service');\n }\n});\n\n// Уровень 5: Мониторинг и логирование\nconst handler = {\n set(target, prop, value) {\n if (suspiciousPattern(prop, value)) {\n reportSecurityEvent({ prop, value });\n }\n return Reflect.set(target, prop, value);\n }\n};\n```\n\n## Шифрование и хеширование чувствительных данных\n\n```javascript\n// Никогда не храни токены в plain text в localStorage\n// Вместо этого используй httpOnly cookies (серверная сторона)\n\n// На клиенте:\nfetch('/api/auth/login', { \n credentials: 'include' // Автоматически отправляет httpOnly cookies\n});\n\n// На сервере (Express):\nres.cookie('authToken', token, {\n httpOnly: true, // JS не может получить доступ\n secure: true, // Только по HTTPS\n sameSite: 'strict' // Защита от CSRF\n});\n```\n\n## Проверка зависимостей и supply chain\n\n```bash\n# Регулярно проверяй уязвимости в зависимостях\nnpm audit\n\n# Обновляй пакеты\nnpm update\n\n# Используй лок-файлы для reproducible builds\n# git commit package-lock.json\n```\n\nВывод: безопасность это не о предотвращении всех уязвимостей (невозможно), а о защите от их последствий. Используй многоуровневую защиту: валидация, изоляция, CSP, минимальные привилегии, мониторинг.","dateCreated":"2026-04-03T11:41:09.952186","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Как защитить уязвимость чтобы она эксплуатировалась но злоумышленник не мог ничего сделать?

2.0 Middle🔥 131 комментариев
#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Security: невредоносность за счёт изоляции

Это хитрый вопрос о защите в глубину (defense in depth). Идея: даже если уязвимость будет найдена и эксплуатирована, её влияние должно быть минимальным. Это не о предотвращении уязвимостей, а о контроле ущерба.

Принцип наименьших привилегий

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

// ДА: изолированная функция с минимальными привилегиями
function processUserInput(input) {
  // 1. Валидация и санитизация
  const sanitized = DOMPurify.sanitize(input);
  
  // 2. Ограничиваем scope и доступ
  const result = computeInWorker(sanitized);
  
  // 3. Возвращаем только необходимое
  return { status: 'ok', data: result };
}

// НЕТ: функция с полным доступом
function dangerousProcessing(input) {
  // Имеет доступ ко всему объекту window
  console.log(localStorage); // Уязвимо
  fetch('/api/admin'); // Уязвимо
}

Принцип разделения ответственности и изоляции

Разделяй код на компоненты с чётко определёнными границами. Если один скомпрометирован, ущерб ограничивается его scope:

// Архитектура с изоляцией
const AuthService = {
  // Единственное место, которое может изменять токены
  setToken(token) {
    if (!this.isValidToken(token)) throw new Error('Invalid token');
    this.token = token; // Private
  },
  
  // Другие части кода не могут напрямую менять токен
  getToken() {
    return this.token;
  }
};

// Даже если XSS попадёт в UI компонент,
// она не сможет напрямую украсть токен благодаря инкапсуляции

Content Security Policy (CSP)

CSP — это браузерная политика безопасности, которая определяет, откуда могут загружаться ресурсы и что может исполняться:

// На сервере (Express, Nextjs, etc)
app.use((req, res, next) => {
  res.setHeader('Content-Security-Policy', `
    default-src 'self';
    script-src 'self' 'unsafe-inline' cdnjs.cloudflare.com;
    style-src 'self' 'unsafe-inline';
    img-src 'self' data: https:;
    font-src 'self' fonts.googleapis.com;
    connect-src 'self' https://api.example.com;
    frame-ancestors 'none';
    base-uri 'self';
    form-action 'self';
  `);
  next();
});

// Эффект:
// - Если XSS выполнит eval() — не сработает
// - Если XSS попытается загрузить данные с чужого сервера — заблокируется
// - Если попытается открыть iframe — не сработает

Sandbox для untrusted кода

Для выполнения потенциально опасного пользовательского кода используй Web Workers или iframe с sandbox:

<!-- Изолированный iframe без привилегий -->
<iframe
  id="sandbox"
  sandbox="allow-scripts"
  src="untrusted-content.html"
></iframe>

<script>
// Этот iframe не может:
// - Получить доступ к localStorage родителя
// - Выполнить fetch с credentials
// - Открыть новые окна
// - Получить доступ к localStorage
// - Выполнить плагины

// Единственный способ общения — postMessage
const frame = document.getElementById('sandbox');
frame.contentWindow.postMessage({ type: 'init', data: {} }, '*');
</script>

Или Web Worker:

// main.js
const worker = new Worker('untrusted-worker.js');

worker.onmessage = (event) => {
  console.log('Result:', event.data);
};

worker.postMessage({ input: userInput });

// untrusted-worker.js
// Выполняется в полностью изолированном контексте
// Не имеет доступа к DOM, localStorage, fetch и т.д.
self.onmessage = (event) => {
  // Может только вычислять и отправлять результат
  const result = process(event.data.input);
  self.postMessage(result);
};

Принцип defense in depth (защита в глубину)

// Уровень 1: На краю — валидация и санитизация
const input = sanitize(userInput);

// Уровень 2: Минимальные привилегии функций
const processData = (() => {
  // Замыкание ограничивает доступ
  const cache = new Map();
  return (data) => cache.get(data);
})();

// Уровень 3: CSP блокирует опасные операции
// (браузер, не JavaScript)

// Уровень 4: Изоляция критичного кода
const criticalService = new Proxy(originalService, {
  set: () => {
    throw new Error('Cannot modify critical service');
  }
});

// Уровень 5: Мониторинг и логирование
const handler = {
  set(target, prop, value) {
    if (suspiciousPattern(prop, value)) {
      reportSecurityEvent({ prop, value });
    }
    return Reflect.set(target, prop, value);
  }
};

Шифрование и хеширование чувствительных данных

// Никогда не храни токены в plain text в localStorage
// Вместо этого используй httpOnly cookies (серверная сторона)

// На клиенте:
fetch('/api/auth/login', { 
  credentials: 'include' // Автоматически отправляет httpOnly cookies
});

// На сервере (Express):
res.cookie('authToken', token, {
  httpOnly: true,    // JS не может получить доступ
  secure: true,      // Только по HTTPS
  sameSite: 'strict' // Защита от CSRF
});

Проверка зависимостей и supply chain

# Регулярно проверяй уязвимости в зависимостях
npm audit

# Обновляй пакеты
npm update

# Используй лок-файлы для reproducible builds
# git commit package-lock.json

Вывод: безопасность это не о предотвращении всех уязвимостей (невозможно), а о защите от их последствий. Используй многоуровневую защиту: валидация, изоляция, CSP, минимальные привилегии, мониторинг.

Как защитить уязвимость чтобы она эксплуатировалась но злоумышленник не мог ничего сделать? | PrepBro