Код 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
  1. Значения никогда не попадают в текст запроса, только в values.
  2. Идентификаторы нельзя параметризовать: для них только белый список.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме