Отраслевая программа «ИТ-компания» · курс «Безопасная разработка» · модуль 1 из 3

Проверка и обработка входных данных

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

Цель модуля

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

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

Недоверенные данные — это всё, что формируется вне доверенной части продукта и может быть изменено третьим лицом. К ним относятся: поля форм, параметры адресной строки, заголовки запросов и значения печенья, содержимое загружаемых файлов, данные из внешних служб, сообщения из очередей и даже значения, которые предыдущий модуль системы записал в хранилище без проверки.

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

Типовые атаки на входные данные

АтакаСутьЧто закрывает
Внедрение команд языка запросовНедоверенный фрагмент попадает в текст запроса к базе данных и меняет его смыслПараметризованные запросы и подготовленные выражения, отказ от сборки запроса склейкой строк
Внедрение команд оболочкиДанные пользователя попадают в строку запуска системной командыОтказ от запуска оболочки, передача аргументов списком, разрешающий список допустимых значений
Межсайтовое выполнение сценариевСохранённый текст выводится в страницу как разметка и исполняется в браузере другого пользователяЭкранирование вывода по контексту, безопасная работа с разметкой
Обход пути к файлуВ имени файла передаются последовательности перехода по каталогамПриведение имени к известному виду, проверка итогового пути по разрешённому каталогу
Подделка запросаБраузер пользователя выполняет действие без его намеренияПроверка источника запроса, одноразовые метки форм

Как выстроить проверку входных данных

  1. Определите для каждого поля тип, допустимый диапазон, длину и формат — и запишите это правило явно.
  2. Проверяйте данные на стороне сервера, независимо от того, что уже проверил браузер.
  3. Применяйте разрешающий список допустимых значений вместо запрещающего списка запрещённых.
  4. Не собирайте запросы и команды склейкой строк: разделяйте код запроса и данные.
  5. Экранируйте данные при выводе в тот контекст, куда они попадают: разметка, атрибут, сценарий, файл, журнал.
  6. При отказе проверки возвращайте понятное общее сообщение и записывайте подробность в журнал, но не раскрывайте внутреннее устройство системы.

Типовые ошибки разработчика

Проверка при разборе кода

При проверке кода коллега обязан спросить: откуда пришли эти данные, что произойдёт при самом худшем их значении, где именно они проверяются и где выводятся. Если ответ «проверка не нужна, источник доверенный», требуется явное обоснование и ссылка на модуль, который формирует эти данные под контролем.

Проверочный список перед выходом на работу

Вопросы для самопроверки

  1. Почему проверка в браузере не считается защитой? Её можно обойти, отправив запрос напрямую в обход страницы; сервер обязан проверять данные сам.
  2. Что делать, если поле раньше приходило от внутренней службы? Уточнить, попадает ли оно туда из внешнего интерфейса, и всё равно проверять на границе системы.
  3. Как одним правилом закрыть внедрение команд языка запросов? Использовать параметризованные запросы: код запроса и данные передаются раздельно.

Основание и что делать при сомнении

Модуль опирается на: ГОСТ Р 56939-2016 «Защита информации. Разработка безопасного программного обеспечения», приказ ФСТЭК России от 11.02.2013 № 17.

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