Запит SQL, побудований з джерел, підконтрольних користувачу

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

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

У хорошому прикладі SQL-запит створюється з використанням параметрів. Це допомагає безпечно додавати значення до запиту, уникати SQL-ін'єкцій і динамічно будувати запити за допомогою об'єкта QueryDefinition.

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

Замість того, щоб використовувати змінні для створення SQL-запитів, рекомендується прямо включати значення в запит, як показано в останньому прикладі, щоб уникнути поміток про вразливості.

Перекладено з: SQL query built from user-controlled sources