В статье разбираемся, как возникают уязвимости при обработке данных, к чему они приводят и как правильно проверять и очищать входные данные, чтобы защитить приложение от атак и утечек информации.
Если приложение не проверяет их на корректность и безопасность, оно остается уязвимым для SQL-инъекций, XSS, CSRF и других угроз. С их помощью злоумышленник может обойти авторизацию, получить доступ к данным пользователей или выполнить произвольный код на сервере, что приведет к полному захвату системы.
Любые данные от пользователя или внешней системы могут стать инструментом атаки.

Манипуляции с входными данными: как хакеры используют уязвимости и как защитить приложение

16 июля 2025
15 минут
эксперт в информационной безопасности в Start X
Андрей Жаркевич
автор, дипломированный айтишник, люблю объяснять сложное простыми словами
Никита Барышников
автор, дипломиро­ванный айтишник, люблю объяснять сложное простыми словами
Никита Барышников
эксперт в информационной безопасности в Start X
Андрей Жаркевич

Что такое обработка входных данных и зачем она нужна

Обработка входных данных защищает систему от вредоносной информации, которую может передать пользователь или внешняя система.

Это помогает избежать атак, при которых злоумышленник пытается изменить поведение системы с помощью вредоносного кода или специальных символов.

Обработка данных помогает:

Проверять корректность данных. Приложение должно убедиться, что данные заданы в нужном формате, типе и диапазоне, иначе система не сможет с ними работать.

Например, если в поле «возраст» вместо числа ввести текст, приложение не сможет правильно рассчитать скидку или проверить возраст для доступа к сервису.

Предотвращать ошибки. Некорректные данные могут привести к сбоям, ошибкам обработки или неправильному отображению информации на сайте.

Например, если вместо числа в поле передали текст, система может выдать ошибку или сломать верстку.

Защищать от атак. Недостаточная проверка данных может привести к эксплуатации уязвимостей, таких как SQL-инъекции и межсайтовый скриптинг (XSS).

Представьте, что пользователь вводит данные в поле поиска, и приложение добавляет их в SQL-запрос без обработки. Если злоумышленник введет строку «1 OR 1», система выполнит запрос, который вернет все записи из базы данных вместо нужного результата. Это классический пример SQL-инъекции, одной из самых распространенных уязвимостей веб-приложений.
Скачайте карту знаний и навыков по безопасной разработке
В ней — 13 уязвимостей и технологий, которые нужно знать разработчику, чтобы писать безопасный код

Основные уязвимости при обработке входных данных

Если не проверять данные от пользователей или внешних систем, злоумышленник сможет менять поведение системы. Рассмотрим основные типы атак, которые эксплуатируют такие уязвимости, и их последствия.
SQL-инъекции (SQL Injection)
SQL-инъекция — атака, при которой злоумышленник вставляет вредоносный SQL-код в поля ввода, чтобы получить доступ к базе данных. Это позволяет ему читать, изменять или удалять данные, а также выполнять административные операции.

Пример SQL-инъекции:
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1';
Здесь условие «OR '1'='1'» всегда истинно, что позволяет злоумышленнику проверку пароля и получить доступ к системе.
Межсайтовый скриптинг (XSS)
XSS — атака, при которой злоумышленник вставляет вредоносный JavaScript в веб-страницу. Когда другой пользователь открывает эту страницу, скрипт запускается в его браузере.

Пример XSS-атаки:
<script>alert('XSS Attack');</script>
Если приложение не проверяет ввод, такой код может быть встроен в страницу, например, через поле комментария. Это позволяет украсть cookie, перенаправить пользователя на опасный сайт или выполнить действия от его имени.
Инъекции команд (Command Injection)
Эта атака позволяет злоумышленнику выполнить произвольные команды на сервере через уязвимые поля ввода.

Например, если приложение вставляет данные пользователя в команду операционной системы, например, для запуска скрипта, злоумышленник может добавить свои команды, которые система выполнит.

Пример инъекции команд:
; rm -rf /
Если приложение не проверяет ввод, такая команда приведет к удалению всех файлов на сервере.
Подмена данных (Data Tampering)
Эта атака позволяет злоумышленнику изменить данные, передаваемые между клиентом и сервером, чтобы обойти проверки или получить несанкционированный доступ. Например, изменить параметры в URL, скрытых полях формы или теле запроса.

Пример подмены данных:
Если в URL заменить user_id=123 на user_id=admin, злоумышленник может получить доступ к чужим данным.

Если система не проверяет, кто делает запрос, это приведет к обходу авторизации и утечке данных.
Атаки через файлы (File Upload Vulnerabilities)
Эта атака позволяет злоумышленнику загрузить на сервер вредоносный файл, если приложение не проверяет тип и содержимое загружаемых данных. Например, можно загрузить исполняемый PHP-скрипт вместо изображения.

Пример атаки:
Если злоумышленник загрузит файл malicious. php с вредоносным кодом, он сможет выполнить его на сервере и получить доступ к системе.

Без проверок и ограничений на загрузку такие файлы могут использоваться для полного захвата сервера.
Подделка межсайтовых запросов (CSRF)
CSRF — атака, при которой злоумышленник заставляет пользователя выполнить действия на сайте, где тот уже авторизован. Например, сменить пароль или перевести деньги на счет злоумышленника.

Пример CSRF-атаки:
<img src="https://bank.com/transfer?amount=1000&to=attacker" />
Если пользователь авторизован в интернет-банке, такой запрос может автоматически выполниться при открытии страницы.

Без защиты от CSRF мошенник получает возможность действовать от имени пользователя.

Телеграм-канал Start X

Подписаться
Наши разборы мошеннических схем поймет даже бабушка

Способы защиты при работе с входными данными

Чтобы избежать атак из-за неправильной обработки входных данных, нужно тщательно проверять и очищать данные. Рассказываем про основные методы, которые помогут защитить веб-приложение от уязвимостей.
Валидация данных
Валидация — проверка данных на соответствие ожидаемым форматам, типам и значениям. Она должна выполняться как на стороне клиента, так и на стороне сервера.

Есть три типа валидации данных:

Синтаксическая проверка. Данные должны иметь правильный формат. Например, email должен содержать символ «@» и корректное доменное имя.

Семантическая проверка. Данные должны логично вписываться в контекст. Например, дата начала должна быть раньше даты окончания.

Проверка длины и диапазона. Строки не должны быть слишком длинными, а числа выходить за допустимые пределы. Например, пароль не короче 8 символов, возраст — от 18 до 99 лет.

Вот как может выглядеть проверка email в коде:
function validateEmail(email) {
  const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return regex.test(email);
}
Очистка данных (Data Sanitization)
Очистка данных — удаление или экранирование вредоносных символов и конструкций из входных данных. Это особенно важно для предотвращения атак, таких как XSS и SQL-инъекции.

Есть два метода очистки:

Экранирование спецсимволов. Замена символов <, >, & и другие на безопасные HTML-коды: &lt ;, &gt ;, &amp ; предотвращает выполнение вредоносного кода в браузере.

Использование специальных библиотек. Например, DOMPurify очищает HTML от опасных элементов, а validator. js помогает проверить и обработать строки.

Вот как может выглядеть очистка HTML в коде:
const cleanHTML = DOMPurify.sanitize(userInput);
Параметризованные запросы
Чтобы предотвратить SQL-инъекции, используют параметризованные запросы или подготовленные выражения (prepared statements). Они разделяют данные и SQL-код, чтобы не дать злоумышленнику внедрить вредоносный код.

Пример параметризованного запроса:
SELECT * FROM users WHERE username = ? AND password = ?;
Параметры передаются отдельно:
db.query("SELECT * FROM users WHERE username = ? AND password = ?", [username, password]);
Белые списки (Whitelisting)
Это подход, при котором разрешаются только заранее определенные значения. Это безопаснее, чем «черные списки», так как злоумышленникам сложнее обойти ограничения.

Пример использования белого списка:
const allowedCountries = ["USA", "Canada", "Germany"];
if (allowedCountries.includes(userCountry)) {
  // Разрешенное значение
} else {
  // Запрещенное значение
}
Белые списки полезны, когда нужно строго контролировать допустимые значения — например, страну, роль пользователя или формат файла.
Регулярные выражения (Regex)
Регулярные выражения помогают проверять структурированные данные, например, номера телефонов, почтовые индексы или даты. Но при этом важно не использовать слишком сложные шаблоны: они могут стать уязвимостью и привести к ReDoS-атакам.

Пример проверки номера телефона:
const phoneRegex = /^\+?\d{10,15}$/;
if (phoneRegex.test(phoneNumber)) {
  // Номер телефона корректен
}
Старайтесь использовать простые и понятные регулярки, чтобы не допустить перегрузки системы на сложных входных данных.

Что еще помогает защититься от атак через входные данные

Вот еще несколько рекомендаций, которые усиливают защиту от атак через входные данные.
Не доверять пользовательскому вводу
Любые данные от пользователей или внешних систем нужно считать потенциально опасными. Даже если проверка на стороне клиента есть, злоумышленник может ее обойти и отправить вредоносные данные напрямую на сервер.

Обязательно проверяйте все входные данные на сервере, используйте параметризованные запросы для защиты от SQL-инъекций и очищайте данные перед использованием.

Пример очистки POST-запроса в PHP:
$message = filter_var($_POST['message'], FILTER_SANITIZE_STRING);
$message = htmlentities($message, ENT_QUOTES, 'UTF-8');
Проверять MIME-тип файла
MIME-тип определяет формат содержимого файла. Например, изображение JPEG имеет MIME-тип image/jpeg, а текстовый файл — text/plain. Проверка MIME-типа помогает убедиться, что загружаемый файл соответствует ожидаемому формату, даже если злоумышленник изменил расширение.

Для определения MIME-типа используйте специальные библиотеки. Например, в Python можно применить python-magic:
import magic
mime_type = magic.from_file("file.jpg", mime=True)
if mime_type != "image/jpeg":
    raise ValueError("Недопустимый тип файла")
Переименовывать файлы для предотвращения коллизий
Переименование файлов помогает избежать перезаписи при совпадении имен. Кроме того, это снижает риск атак с предсказуемыми именами файлов, которые злоумышленники могут использовать для доступа к загруженным данным.

Для этого используйте уникальные идентификаторы в именах файлов. Например, в PHP можно применить функцию uniqid ():
$filename = uniqid() . "_" . $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'], "uploads/" . $filename);
Если сразу писать безопасный код и правильно обрабатывать входные данные, не придется откладывать релиз из-за уязвимостей и тратить время на их исправление. На платформе Start EDU на практике учим устранять уязвимости в коде в зависимости от стека технологий и сценариев работы с данными. Запишитесь на бесплатное демо, и наш эксперт расскажет, как Start EDU помогает продуктовым командам предотвращать уязвимости и сразу писать безопасный код.

Что еще почитать

Мужчина в кресле с ноутбуком

Подпишитесь на дайджест Start X

Еженедельная подборка материалов и аналитики про цифровые атаки на людей, технологии защиты, безопасность инфраструктуры и приложений
Нажимая кнопку «Отправить заявку» вы соглашаетесь с политикой обработки персональных данных.