На одну сторінку
Безпека вебзастосунків: шпаргалка
Те, що варто тримати під рукою. Якщо рядок незрозумілий, повернись у відповідний урок курсу.
Відкрити курс: Безпека вебзастосунківІн'єкції
| Що | Як |
|---|---|
| SQL зі значенням | pool.query("... WHERE id = $1", [id]) |
| Колонка чи сортування | білий список, не плейсхолдер |
| Prisma, сирий SQL | $queryRaw`...${x}`, не $queryRawUnsafe |
| Зовнішня програма | execFile("cmd", [arg]), не exec |
| Фільтр MongoDB | typeof value === "string" |
XSS і CSRF
| Що | Як |
|---|---|
| Вивести текст | textContent, не innerHTML |
| Потрібен HTML | DOMPurify.sanitize(html) |
| CSP | script-src 'nonce-...' 'strict-dynamic'; object-src 'none' |
| Cookie сесії | HttpOnly; Secure; SameSite=Lax |
| Форма зі зміною стану | CSRF-токен + перевірка Origin |
Автентифікація і секрети
| Що | Як |
|---|---|
| Хеш пароля | Argon2id: 19 MiB, t=2, p=1 |
| Порівняння секретів | crypto.timingSafeEqual(a, b) |
| Ліміт входу | за акаунтом і за IP |
| Найкращий другий фактор | passkey (WebAuthn) |
| Секрет витік | відкликати, видати новий, перевірити журнали |
| Ротація ключів JWT | kid у заголовку, два ключі на перехід |
Заголовки, SSRF, залежності
| Що | Як |
|---|---|
| Лише HTTPS | Strict-Transport-Security: max-age=63072000 |
| Не вгадувати тип | X-Content-Type-Options: nosniff |
| Без iframe | frame-ancestors 'none' |
| CORS з cookie | білий список Origin + Vary: Origin |
| URL від користувача | білий список хостів, без редиректів |
| Встановлення в CI | pnpm install --frozen-lockfile |