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.
| SSL | TLS | |
|---|---|---|
| Статус | Устаревший, небезопасный | Актуальный стандарт |
| Актуальная версия | 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; хранить в
httpOnlycookie, не вlocalStorage - Rate limiting на эндпоинты авторизации
- Зависимости: регулярно обновлять, использовать
npm audit - CORS настроить строго (не
*для API с авторизацией) - Скрывать стек-трейсы и версии в ответах сервера
- Заголовки:
Strict-Transport-Security,X-Content-Type-Options
Как усложнить отладку JS-кода на клиенте?
- Минификация + обфускация —
javascript-obfuscator, Terser с включённымmangle(в т.ч.toplevel,mangle.properties) - Переименование переменных в бессмысленные имена (
a,b,_0x3f2a) - Строковые шифрования — строки хранятся в зашифрованном виде, декодируются в рантайме
- Анти-DevTools детектор:
setInterval(() => {
const start = Date.now();
debugger; // если DevTools открыты — здесь задержка
if (Date.now() - start > 100) location.reload();
}, 1000);- Self-defending code — код, который ломает себя при изменении
- Не публиковать source maps в продакшн
⚠️ Всё это замедляет, но не предотвращает реверс-инжиниринг. Критическую логику держи на сервере.
См. также
- csp — Content Security Policy и security-заголовки