Web Security

Защита от основных атак

  • XSS: экранировать вывод пользовательских данных; Content-Security-Policy (CSP)
  • CSRF: CSRF-токены или SameSite=Strict для cookies
  • SQL Injection: только параметризованные запросы / ORM
  • Clickjacking: X-Frame-Options: DENY

Что такое TLS и чем отличается от SSL?

SSL (Secure Sockets Layer) — старый протокол шифрования, который давно признан небезопасным. Последняя версия SSL 3.0 была выпущена в 1996 году.

TLS (Transport Layer Security) — современный преемник SSL. Когда сегодня говорят “SSL-сертификат” или “включить SSL” — почти всегда имеют в виду TLS.

SSLTLS
СтатусУстаревший, небезопасныйАктуальный стандарт
Актуальная версия3.0 (1996)TLS 1.3 (2018)
ИспользованиеНе рекомендуетсяИспользуется везде

Путаница возникает потому, что индустрия привыкла к термину “SSL”, хотя фактически речь о TLS.


Хранение паролей — bcrypt, argon2

bcrypt и Argon2 — это алгоритмы специально разработанных функций хеширования паролей. Они намеренно медленные (в отличие от MD5/SHA), чтобы перебор паролей занимал много времени.

  • bcrypt — проверенный алгоритм с настройкой “стоимости” (work factor); создан в 1999 году, до сих пор надёжен
  • Argon2 — победитель Password Hashing Competition (2015), рекомендован OWASP; более гибкий — настраивается память, потоки и итерации
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash('myPassword', 10); // 10 = work factor

Аутентификация и общие практики

  • HTTPS везде — обязательно
  • JWT: короткий TTL + refresh token; хранить в httpOnly cookie, не в localStorage
  • Rate limiting на эндпоинты авторизации
  • Зависимости: регулярно обновлять, использовать npm audit
  • CORS настроить строго (не * для API с авторизацией)
  • Скрывать стек-трейсы и версии в ответах сервера
  • Заголовки: Strict-Transport-Security, X-Content-Type-Options

Как усложнить отладку JS-кода на клиенте?

  1. Минификация + обфускацияjavascript-obfuscator, Terser с включённым mangle (в т.ч. toplevel, mangle.properties)
  2. Переименование переменных в бессмысленные имена (a, b, _0x3f2a)
  3. Строковые шифрования — строки хранятся в зашифрованном виде, декодируются в рантайме
  4. Анти-DevTools детектор:
setInterval(() => {
  const start = Date.now();
  debugger; // если DevTools открыты — здесь задержка
  if (Date.now() - start > 100) location.reload();
}, 1000);
  1. Self-defending code — код, который ломает себя при изменении
  2. Не публиковать source maps в продакшн

⚠️ Всё это замедляет, но не предотвращает реверс-инжиниринг. Критическую логику держи на сервере.

См. также

  • csp — Content Security Policy и security-заголовки