Цей документ пояснює, як працює система захисту від XSS (Cross-Site Scripting) та CSRF (Cross-Site Request Forgery) атак у проекті.
XSS (Cross-Site Scripting) - це атака, коли зловмисний JavaScript код впроваджується на веб-сторінку через небезпечний ввід користувача.
Приклад атаки:
<!-- Користувач вводить у форму: -->
<script>alert('XSS атака!')</script>
<!-- Якщо не захищено, цей код виконається -->DOMPurify - це бібліотека, яка очищає HTML від небезпечних елементів та атрибутів.
import { sanitizeHTML } from './utils/sanitize';
// Небезпечний ввід
const dangerousInput = '<script>alert("XSS")</script><p>Безпечний текст</p>';
// Безпечний вивід (script тег видалено)
const safeOutput = sanitizeHTML(dangerousInput);
// Результат: '<p>Безпечний текст</p>'Що видаляється:
<script>теги<iframe>,<object>,<embed>- Атрибути
onclick,onerror,onload(event handlers) - Протоколи
javascript:,data:,vbscript: styleатрибути (за замовчуванням)
Що залишається:
- Безпечні теги:
<p>,<strong>,<em>,<a>,<h1-h6>, тощо - Безпечні атрибути:
href,title,class,id
import SafeHTML from './components/SafeHTML/SafeHTML';
// Безпечний рендеринг HTML
<SafeHTML
content="<p>Текст з <strong>HTML</strong></p>"
tag="div"
/>Як працює:
- Контент автоматично санітизується через DOMPurify
- Використовується
dangerouslySetInnerHTML, але з попередньо очищеним HTML - Небезпечні елементи видаляються до рендерингу
import { containsDangerousContent } from './utils/sanitize';
if (containsDangerousContent(userInput)) {
console.warn('Виявлено небезпечний контент!');
// Автоматично санітизується
}CSRF (Cross-Site Request Forgery) - це атака, коли зловмисний сайт виконує дії від імені авторизованого користувача без його відома.
Приклад атаки:
<!-- Зловмисний сайт відправляє запит: -->
<img src="https://bank.com/transfer?to=hacker&amount=1000" />
<!-- Якщо користувач залогінений у банку, запит виконається! -->import { initCSRFToken, getCSRFToken } from './utils/csrf';
// Генерує та зберігає унікальний токен
const token = initCSRFToken();
// Приклад: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"Де зберігається:
localStorage(для клієнта)- Cookie (для сервера, якщо потрібно)
import { secureFetch } from './utils/csrf';
// Автоматично додає CSRF токен до заголовків
const response = await secureFetch('/api/contact', {
method: 'POST',
body: JSON.stringify({ name: 'John', message: 'Hello' })
});
// Заголовок автоматично додається:
// X-CSRF-Token: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6Сервер повинен:
- Отримати токен з заголовка
X-CSRF-Token - Порівняти з токеном, збереженим у сесії користувача
- Відхилити запит, якщо токени не співпадають
Приклад серверної перевірки (Node.js/Express):
app.post('/api/contact', (req, res) => {
const clientToken = req.headers['x-csrf-token'];
const serverToken = req.session.csrfToken;
if (clientToken !== serverToken) {
return res.status(403).json({ error: 'Invalid CSRF token' });
}
// Безпечний запит
// ...
});1. Користувач вводить: <script>alert('XSS')</script>
2. containsDangerousContent() виявляє небезпечний контент
3. Показується попередження ⚠️
4. sanitizeHTML() видаляє <script> тег
5. SafeHTML рендерить безпечний контент
6. Результат: (пусто, бо script видалено)
1. Користувач заповнює форму
2. Всі дані санітизуються (sanitizeText, sanitizeHTML)
3. CSRF токен автоматично додається до запиту
4. secureFetch() відправляє запит з заголовком X-CSRF-Token
5. Сервер перевіряє токен
6. Якщо токен валідний - запит виконується
7. Якщо токен невалідний - запит відхиляється (403)
import SafeHTML from './components/SafeHTML/SafeHTML';
function MyComponent() {
const userContent = "<p>Мій <strong>текст</strong></p><script>alert('XSS')</script>";
return (
<SafeHTML content={userContent} />
// Рендерить: <p>Мій <strong>текст</strong></p>
// <script> автоматично видалено
);
}import { sanitizeText, sanitizeHTML } from './utils/sanitize';
function handleSubmit(e) {
e.preventDefault();
const sanitizedData = {
name: sanitizeText(formData.name), // Видаляє HTML
email: sanitizeText(formData.email), // Видаляє HTML
message: sanitizeHTML(formData.message) // Очищає від небезпечних тегів
};
// Відправка даних...
}import { secureFetch } from './utils/csrf';
async function sendData(data) {
const response = await secureFetch('/api/endpoint', {
method: 'POST',
body: JSON.stringify(data)
});
// CSRF токен автоматично додано до заголовків
return response.json();
}import { sanitizeURL } from './utils/sanitize';
const userLink = "javascript:alert('XSS')";
const safeLink = sanitizeURL(userLink);
// Результат: "" (порожній рядок, бо небезпечний протокол)
const safeLink2 = sanitizeURL("https://example.com");
// Результат: "https://example.com" (безпечний)- SQL Injection (це завдання сервера)
- CSRF (потрібні токени)
- Clickjacking (потрібні заголовки X-Frame-Options)
- Сервер перевіряє токени
- Токени генеруються унікально для кожної сесії
- Токени зберігаються безпечно
- ✅ Завжди санітизуйте ввід користувача
- ✅ Використовуйте
SafeHTMLдля рендерингу HTML - ✅ Додавайте CSRF токени до всіх POST/PUT/DELETE запитів
- ✅ Перевіряйте токени на сервері
- ✅ Використовуйте HTTPS для безпечної передачі токенів
Створено для демонстрації захисту від XSS/CSRF атак у React додатку.