Чи є в Postgres підготовлені запити та визначені користувачем функції, еквівалентні механізму захисту від введення SQL ?
Чи є в одному підході особливі переваги над іншими?
Чи є в Postgres підготовлені запити та визначені користувачем функції, еквівалентні механізму захисту від введення SQL ?
Чи є в одному підході особливі переваги над іншими?
Відповіді:
Це залежить.
З LANGUAGE sql
, як правило , відповідь " так" .
Пасовані параметри трактуються як значення, а ін'єкція SQL неможлива - до тих пір, поки ви не будете викликати небезпечні функції з тіла та не передавати параметри.
З LANGUAGE plpgsql
, відповідь зазвичай так .
Однак PL / pgSQL дозволяє динамічний SQL, де передані параметри (або частини) об'єднуються в рядок запиту і виконуються з EXECUTE
. Це може конвертувати введення користувача в SQL-код і робить можливим введення SQL . Ви не можете сказати ззовні, чи функціонує функціональний орган правильно. Інструменти надаються.
Використовуйте динамічний SQL лише там, де вам це потрібно. Звичайні оператори SQL, використовуючи параметри як значення, захищені від ін'єкції SQL, як функції SQL
Для динамічного SQL бажано передавати значення у вигляді значень із:
USING
становище. Приклад .Унеможливлює ін'єкцію SQL принципово.
Якщо ви об'єднали значення в рядку SQL, використовуйте:
Оберіть рядки в одинарні лапки , тим самим уникнути помилок синтаксису та інжекції SQL.
Параметри процесу, які слід розглядати як ідентифікатори в рядку SQL за допомогою:
format()
із специфікатором формату%I
. Приклад .quote_ident()
. Приклад .regclass
для імен таблиць: _tbl::regclass
. Приклад .Укладає рядки в подвійних лапках безпечно , де потрібно , що дозволяє уникнути синтаксичних помилок і SQL ін'єкції.
Пов'язані:
Ніколи не будуйте рядок із введення та виконання файлу користувача. Сюди входять ідентифікатори, безпосередньо передані користувачем або отримані з системного каталогу. До створення всіх динамічних SQL потрібно звертатися як до введення користувачів та цитувати їх безпечно!
Детальніше про наслідки щодо продуктивності у цій відповіді:
Основи введення SQL:
Подібні міркування стосуються інших мов на сервері, які дозволяють динамічно використовувати SQL.
USING
пункт для передачі значень, EXECUTE
коли це можливо. Ви можете викликати функцію PL / pgSQL в межах функції SQL та передавати параметри. Отже, щоб бути абсолютно правильним, ви в безпеці до тих пір, поки не будете викликати небезпечні функції прямо чи опосередковано. Якщо всі ваші функції виконані належним чином, цього не може статися.