🔐 Web Security — захист від вразливостей
⚠️ Чому Security критична?
- 💰 Data breaches: середня вартість — $4.24 млн
- 🚨 43% кібератак націлені на малий бізнес
- ⚖️ GDPR штрафи: до 20 млн € або 4% річного обороту
- 📉 Репутація: втрата довіри користувачів
Частина 1: OWASP Top 10 (2021)
| Вразливість |
Опис |
Приклад |
| A01: Broken Access Control |
Порушення авторизації |
Доступ до чужих даних |
| A02: Cryptographic Failures |
Слабке шифрування |
Паролі в plain text |
| A03: Injection |
SQL/NoSQL/OS injection |
SQL Injection атаки |
| A04: Insecure Design |
Архітектурні проблеми |
Відсутність rate limiting |
| A05: Security Misconfiguration |
Неправильна конфігурація |
Дефолтні паролі |
| A06: Vulnerable Components |
Застарілі бібліотеки |
NPM packages з вразливостями |
| A07: Authentication Failures |
Слабка автентифікація |
Brute-force attacks |
| A08: Software & Data Integrity |
Недовірений код |
CDN з backdoor |
| A09: Logging Failures |
Недостатнє логування |
Не зафіксовано атаку |
| A10: SSRF |
Server-Side Request Forgery |
Доступ до internal APIs |
Частина 2: XSS (Cross-Site Scripting)
Типи XSS
- Stored XSS: код зберігається в БД (коментарі, профілі)
- Reflected XSS: код в URL параметрах
- DOM-based XSS: маніпуляція DOM на клієнті
Приклад атаки
// ❌ ВРАЗЛИВИЙ КОД
const username = params.get('name');
document.getElementById('welcome').innerHTML = `Hello, ${username}!`;
// Атака: ?name=
// Результат: виконається JavaScript, викрадання cookies!
Захист від XSS
// ✅ БЕЗПЕЧНО: Escape HTML entities
function escapeHTML(str) {
const div = document.createElement('div');
div.textContent = str; // textContent автоматично eccape-ить
return div.innerHTML;
}
const username = escapeHTML(params.get('name'));
document.getElementById('welcome').innerHTML = `Hello, ${username}!`;
// Або краще — textContent
document.getElementById('welcome').textContent = `Hello, ${username}!`;
Content Security Policy (CSP)
Частина 3: CSRF (Cross-Site Request Forgery)
Приклад атаки
Захист: CSRF Tokens
// Backend перевіряє token
app.post('/transfer', (req, res) => {
if (req.body.csrf_token !== req.session.csrf_token) {
return res.status(403).send('Invalid CSRF token');
}
// Process transfer
});
SameSite Cookies
// Set-Cookie header
Set-Cookie: session=abc123; SameSite=Strict; Secure; HttpOnly
// SameSite=Strict — cookie НЕ відправиться на cross-site requests
// SameSite=Lax — відправиться тільки на GET (navigation)
// SameSite=None — завжди відправиться (потрібен для CORS)
Частина 4: SQL Injection
Приклад атаки
// ❌ ПОГАНО: Vulnerable to SQL Injection
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
// Атака: username = admin' OR '1'='1' --
// Query стає: SELECT * FROM users WHERE username='admin' OR '1'='1' --' AND password=''
// '1'='1' завжди TRUE → authentication bypassed!
Захист: Prepared Statements
// ✅ БЕЗПЕЧНО: Prepared statements (PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
$user = $stmt->fetch();
// Параметри автоматично escape-ються
// ✅ Node.js (MySQL2)
const [rows] = await connection.execute(
'SELECT * FROM users WHERE username = ? AND password = ?',
[username, password]
);
Частина 5: Security Headers
Рекомендовані headers
# Nginx configuration
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
# HSTS (якщо HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# CSP
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-cdn.com" always;
| Header |
Призначення |
X-Frame-Options: SAMEORIGIN |
Заборонити iframe з інших доменів (захист від clickjacking) |
X-Content-Type-Options: nosniff |
Заборонити MIME-type sniffing |
X-XSS-Protection: 1; mode=block |
Увімкнути XSS фільтр браузера (legacy) |
Referrer-Policy |
Контролювати Referer header |
Permissions-Policy |
Контролювати browser features (camera, microphone) |
Частина 6: Input Validation
Никогда не довіряйте user input!
// ❌ ПОГАНО: Без валідації
app.post('/email', (req, res) => {
sendEmail(req.body.email, req.body.message);
});
// ✅ ДОБРЕ: Validation + Sanitization
const validator = require('validator');
app.post('/email', (req, res) => {
const email = req.body.email;
// Validate email format
if (!validator.isEmail(email)) {
return res.status(400).send('Invalid email');
}
// Sanitize message (remove HTML tags)
const message = validator.escape(req.body.message);
sendEmail(email, message);
});
Whitelist approach
// ✅ Дозволити тільки певні значення
const allowedCategories = ['math', 'physics', 'chemistry'];
if (!allowedCategories.includes(req.params.category)) {
return res.status(400).send('Invalid category');
}
Частина 7: CORS (Cross-Origin Resource Sharing)
Налаштування CORS
// Express.js — дозволити CORS
const cors = require('cors');
// ❌ НЕБЕЗПЕЧНО: дозволити всі origins
app.use(cors());
// ✅ БЕЗПЕЧНО: whitelist origins
const allowedOrigins = ['https://scientific-calculators.com'];
app.use(cors({
origin: function (origin, callback) {
if (!origin || allowedOrigins.includes(origin)) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
},
credentials: true // дозволити cookies
}));
Частина 8: Rate Limiting
Захист від Brute Force
// Express Rate Limit
const rateLimit = require('express-rate-limit');
const loginLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 5, // 5 спроб
message: 'Too many login attempts, try again later'
});
app.post('/login', loginLimiter, (req, res) => {
// Login logic
});
Висновок
Web Security Checklist:
- ✅ XSS захист: escape HTML, CSP headers, textContent
- ✅ CSRF захист: CSRF tokens, SameSite cookies
- ✅ SQL Injection: prepared statements, параметризовані запити
- ✅ Security headers: X-Frame-Options, CSP, HSTS
- ✅ Input validation: whitelist approach, sanitization
- ✅ HTTPS: обов'язково (Let's Encrypt безкоштовно)
- ✅ Secure cookies: HttpOnly, Secure, SameSite=Strict
- ✅ Rate limiting: захист від brute force
- ✅ Dependencies: оновлювати NPM packages (
npm audit)
Як користуватися шпаргалкою
Ця шпаргалка зосереджує найважливіші формули, правила та визначення теми в компактному форматі для швидкого пошуку та підготовки до іспитів. Матеріал систематизований від базових понять до просунутих результатів.
Ефективне використання
Використовуйте шпаргалку поряд з розв'язуванням задач — не для списування, а як довідник формул. Спершу спробуйте пригадати формулу самостійно, потім звіртеся з довідником. Регулярне повторення формує стійку пам'ять.