Reemake Digital Agency · Безопасность AJAX

Почему 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-эндпоинт на инъекции. Найдём уязвимости. Предложим решение. Бесплатный аудит — без обязательств.

Закажите аудит →
8 (950) 442-49-00 reemake@inbox.ru Max Messenger Max

с 8:00 до 20:00 (МСК)

г. Пермь