Санитизация пользовательского ввода — это процесс очистки данных, введённых пользователем, для предотвращения потенциально опасных действий, таких как XSS-атаки, внедрение SQL-кода или нарушение логики приложения. В JavaScript санитизация особенно актуальна при работе с DOM, AJAX-запросами и динамическим контентом.
Ключевые задачи санитизации:
Для предотвращения XSS важно преобразовывать специальные символы HTML в безопасные сущности. Наиболее часто экранируемыми символами являются:
| Символ | Экранирование |
|---|---|
| & | & |
| < | < |
| > | > |
| ” | ” |
| ’ | ’ |
Пример функции экранирования в Jav * aScript:
function escapeHTML(str) {
return str.replace(/[&<>"']/g, function(match) {
const escape = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return escape[match];
});
}
const userInput = '<script>alert("XSS")</script>';
const safeInput = escapeHTML(userInput);
console.log(safeInput); // <script>alert("XSS")</script>
Важная часть санитизации — проверка типа данных. Например, если ожидается число, входные данные нужно явно преобразовать и проверить:
function sanitizeNumber(input) {
const num = Number(input);
if (isNaN(num)) throw new Error('Некорректное число');
return num;
}
const userAge = sanitizeNumber('25'); // 25
Для строк можно использовать регулярные выражения для фильтрации нежелательных символов:
function sanitizeString(input) {
return input.replace(/[^a-zA-Z0-9\s.,!?-]/g, '');
}
const cleanString = sanitizeString("Привет! <script>alert('XSS')</script>");
// Результат: "Привет! alertXSS"
Для проверки email применяются стандартные регулярные выражения:
function sanitizeEmail(email) {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!regex.test(email)) throw new Error('Некорректный email');
return email;
}
Для URL проверка включает протокол и домен:
function sanitizeURL(url) {
try {
const parsed = new URL(url);
return parsed.href;
} catch {
throw new Error('Некорректный URL');
}
}
Для сложных случаев рекомендуется использовать проверенные библиотеки:
Пример использования DOMPurify:
import DOMPurify from 'dompurify';
const unsafeHTML = '<img src=x oner ror=alert(1)//>';
const safeHTML = DOMPurify.sanitize(unsafeHTML);
document.getElementById('content').innerHTML = safeHTML;
Санитизация включает контроль размера данных, чтобы избежать атак типа buffer overflow или излишней нагрузки на сервер:
function truncateInput(input, maxLength) {
return input.length > maxLength ? input.slice(0, maxLength) : input;
}
const safeText = truncateInput("Очень длинный текст...", 50);
При передаче данных на сервер важно проверять типы и значения:
function sanitizeJSON(data, schema) {
const sanitized = {};
for (const key in schema) {
if (schema[key] === 'string') {
sanitized[key] = sanitizeString(data[key] || '');
} else if (schema[key] === 'number') {
sanitized[key] = sanitizeNumber(data[key] || 0);
}
}
return sanitized;
}
const userData = { name: "<script>", age: "30" };
const schema = { name: 'string', age: 'number' };
const cleanData = sanitizeJSON(userData, schema);
Систематическое применение этих методов минимизирует риск внедрения вредоносного кода и сохраняет целостность приложения.