Почему prepared statements
в AJAX-эндпоинте повышают безопасность
Мы работаем на Joomla с 2009 года и видели десятки взломов через AJAX-эндпоинты. Классика: параметр из URL подставляется в SQL напрямую. Разбираем, как prepared statements в Reemake AJAX Content закрывают эту угрозу.
Угроза
Что такое SQL-инъекция
Если параметр из URL подставляется в SQL напрямую, злоумышленник может добавить свой код. Например, вместо offset=6 отправить offset=6 OR 1=1. Без защиты это вернёт все материалы, а в худшем случае — позволит прочитать содержимое таблиц.
Конкатенация строк
«SELECT ... WHERE id = $id» — опасно. Параметр может содержать всё что угодно.
Prepared statements
Значения передаются отдельно от SQL — безопасно. MySQL валидирует тип автоматически.
Код
Как это выглядит в Reemake AJAX Content
$db = Factory::getContainer()->get(DatabaseInterface::class);
$query = $db->getQuery(true);
$query->select(['id', 'title', 'introtext'])
->from($db->quoteName('#__content'))
->where($db->quoteName('catid') . ' = :catid')
->order($db->quoteName('created') . ' DESC')
->bind(':catid', $catid, ParameterType::INTEGER);
$db->setQuery($query, 0, $limit);Ключевое — ->bind() с явным типом. Не «строка», не «число», а именно ParameterType::INTEGER. MySQL отвергнет любой нечисловой ввод. Никакой возможности вставить код.
Кейс · ГТРК «Брянск»
Медиа: блокировали попытку инъекции
Задача: ГТРК «Брянск» (Россия 1) — новостной портал на Joomla 6. Федеральный медиа-ресурс с большой аудиторией. Каждая утечка — репутационный риск. До перехода на Reemake AJAX Content использовали legacy-модуль с конкатенацией SQL — уязвимость.
Что сделали: заменили на Reemake AJAX Content Endpoint с prepared statements. Все параметры (offset, module_id, limit) — через bind с явными типами. Проверили безопасность: penetration-тест с попытками инъекций — все провалились на уровне БД.
Результат: за 8 месяцев — ни одной попытки инъекции не прошло. Логи WAF показали 3 атаки — все отсечены. Команда безопасности медиа подтвердила: решение соответствует требованиям корпоративной защиты.
Вопросы и ответы
От лица клиента
«У меня простая форма — зачем переплачивать за безопасность?»
AJAX-эндпоинт — публичная точка входа. Даже простая форма может стать шлюзом для инъекции. Prepared statements — стандарт, а не роскошь. Стоимость — по составу работ после аудита.
«Замедляет ли это запрос?»
Нет, наоборот — prepared statements чуть быстрее при повторных запросах. MySQL кеширует план выполнения.
«Как проверить, что мой текущий модуль безопасен?»
Проведём аудит: посмотрим код, попробуем инъекции на тестовом стенде. Бесплатно в рамках первого обращения.
«Что если параметр целочисленный?»
Модуль всё равно использует prepared statements — это стандарт для любых параметров. Даже для чисел.
Закажите аудит безопасности
Проверим ваш AJAX-эндпоинт на инъекции. Найдём уязвимости. Предложим решение. Бесплатный аудит — без обязательств.
Закажите аудит →




Messenger Max