В КУРСЕ?

Разбираемся в теме

SQL-инъекция начинается там, где данные становятся командой

Приложение принимает имя, название товара или номер заказа и обращается к базе данных. Опасность появляется, когда полученный текст начинает менять структуру SQL-команды. Это основа SQL-инъекции. Для начинающего тестировщика полезнее сначала понять границу между командой и данными, чем собирать случайные проверочные строки. Ниже приведён защитный разбор и бумажное упражнение на вымышленном каталоге, без обращения к чужим системам.

Имя должно оставаться значением

В каталоге может находиться автор с фамилией O'Connor. Апостроф является частью обычного имени. Если приложение склеивает SQL из фрагментов текста и пользовательского ввода, специальные символы могут повлиять на разбор команды. Параметризованный запрос задаёт структуру отдельно, а значение передаёт через предусмотренный интерфейс работы с базой. Смысл защиты заключается в разделении ролей. Простая замена нескольких символов или запрет всех апострофов ненадёжны как общая стратегия и одновременно портят корректные данные. Поддержка параметров должна использоваться правильно в конкретном драйвере; название метода само по себе ещё не доказывает безопасность всей цепочки.

Не каждый фрагмент SQL является значением

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

Защита запроса не заменяет проверку прав

Допустим, запрос к заказу правильно параметризован, но приложение отдаёт любой заказ по указанному номеру. SQL-инъекции здесь может не быть, однако остаётся нарушение доступа к чужим данным. Поэтому отдельно проверяют право текущего пользователя видеть конкретную запись. Учётная запись приложения в базе также должна иметь только необходимые полномочия. Такие меры ограничивают последствия ошибок, но не исправляют небезопасное построение SQL. Для проверки используют согласованную тестовую среду и искусственные данные. Ответ с технической ошибкой способен подсказать проблему, однако отсутствие видимой ошибки не доказывает отсутствие уязвимости.

Попробуйте на практике

Разберите проект безопасного поиска в учебном каталоге на бумаге. В нём разрешены поиск по фамилии и сортировка по названию или году. Никакие запросы выполнять не нужно.

  1. Создайте три карточки ввода: обычная фамилия Иванов, фамилия O'Connor и пустая строка. Для каждой заранее опишите ожидаемое поведение поиска.
  2. Нарисуйте две отдельные области: неизменная структура SQL и передаваемое значение фамилии. Убедитесь, что все символы фамилии относятся ко второй области.
  3. Составьте соответствие двух разрешённых вариантов сортировки известным полям каталога. Для неизвестного варианта запишите отказ с понятным сообщением без технических подробностей.
  4. Добавьте отдельный сценарий просмотра заказа: пользователь пытается открыть запись другого владельца. Укажите проверку прав независимо от способа передачи номера.
  5. Сравните найденные требования: корректная обработка данных, сохранение структуры команды и ограничение доступа. Не объединяйте их в один признак отсутствия ошибки.

Как проверить результат. Апостроф не удаляется из допустимой фамилии, значения отделены от команды, сортировка ограничена известными вариантами, а чужой заказ защищён отдельной проверкой прав. Пустая строка имеет заранее определённое поведение.

Частые вопросы

Достаточно ли проверять ввод только в браузере?

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

Параметризованный запрос устраняет все ошибки базы данных?

Нет. Он решает определённую задачу разделения команды и значений при корректном применении. Ошибки прав, бизнес-логики, транзакций и раскрытия технических сведений требуют собственных проверок.

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

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов