Код Middle Безопасность бэкенда обновлено
Безопасный INSERT: параметры и белый список колонок
Условие
Напиши buildInsert(table, row, allowed): строит параметризованный запрос для PostgreSQL.
allowedобъекттаблица → массив разрешённых колонок. Если таблицы нет вallowed, броситьErrorс сообщениемtable not allowed.- Колонки берутся из ключей
rowв порядке ключей; ключ не из белого списка: броситьErrorс сообщениемcolumn not allowed: <ключ>. Пустойrow:Error('empty row'). - Имена таблицы и колонок в двойных кавычках, значения только через плейсхолдеры
$1, $2, ....
Верни { text, values }, например { text: 'INSERT INTO "users" ("email", "name") VALUES ($1, $2)', values: ['a@b.ru', 'Аня'] }.
Что проверяют тесты
обычная вставка
инъекция в значении остаётся данными
колонка не из белого списка
инъекция в имени колонки
таблица не из белого списка
пустая строка
null и числа как значения
Как подойти
Подсказки: 2
- Значения никогда не попадают в текст запроса, только в
values. - Идентификаторы нельзя параметризовать: для них только белый список.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.