Введення SQL у функції Postgres порівняно з підготовленими запитами


Відповіді:


36

Це залежить.

Функції SQL

З LANGUAGE sql, як правило , відповідь " так" .

Пасовані параметри трактуються як значення, а ін'єкція SQL неможлива - до тих пір, поки ви не будете викликати небезпечні функції з тіла та не передавати параметри.

PL / pgSQL функції

З LANGUAGE plpgsql, відповідь зазвичай так .

Однак PL / pgSQL дозволяє динамічний SQL, де передані параметри (або частини) об'єднуються в рядок запиту і виконуються з EXECUTE. Це може конвертувати введення користувача в SQL-код і робить можливим введення SQL . Ви не можете сказати ззовні, чи функціонує функціональний орган правильно. Інструменти надаються.

Використовуйте динамічний SQL лише там, де вам це потрібно. Звичайні оператори SQL, використовуючи параметри як значення, захищені від ін'єкції SQL, як функції SQL

Для динамічного SQL бажано передавати значення у вигляді значень із:

Унеможливлює ін'єкцію SQL принципово.

Якщо ви об'єднали значення в рядку SQL, використовуйте:

Оберіть рядки в одинарні лапки , тим самим уникнути помилок синтаксису та інжекції SQL.

Параметри процесу, які слід розглядати як ідентифікатори в рядку SQL за допомогою:

Укладає рядки в подвійних лапках безпечно , де потрібно , що дозволяє уникнути синтаксичних помилок і SQL ін'єкції.

Пов'язані:

Ніколи не будуйте рядок із введення та виконання файлу користувача. Сюди входять ідентифікатори, безпосередньо передані користувачем або отримані з системного каталогу. До створення всіх динамічних SQL потрібно звертатися як до введення користувачів та цитувати їх безпечно!

Детальніше про наслідки щодо продуктивності у цій відповіді:

Основи введення SQL:

Подібні міркування стосуються інших мов на сервері, які дозволяють динамічно використовувати SQL.


Отже, у підсумку: Якщо 1) я використовую лише мову sql, я безпечний, 2) якщо я використовую plpgslq, але не виконую, я в безпеці, 3) якщо я використовую plpgsql та виконую, але немає ідентифікаторів і% s або% L, якщо потрібно, я в безпеці, або 4) якщо я використовую plpgsql та Execute та ідентифікатори, але% I або quo_ident, якщо це доречно, я в безпеці. Правильно?
mickeyf_supports_Monica

@mickeyf: В основному так. Крім того, використовуйте USINGпункт для передачі значень, EXECUTEколи це можливо. Ви можете викликати функцію PL / pgSQL в межах функції SQL та передавати параметри. Отже, щоб бути абсолютно правильним, ви в безпеці до тих пір, поки не будете викликати небезпечні функції прямо чи опосередковано. Якщо всі ваші функції виконані належним чином, цього не може статися.
Erwin Brandstetter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.