Вопрос проверяет понимание уязвимости SQL-инъекций и важности использования параметризованных запросов для безопасности приложений.
Когда вы формируете SQL-запрос путем склеивания строк, вы смешиваете код запроса с данными, полученными от пользователя. Если пользователь введет специальные символы, такие как кавычки, он может изменить логику запроса. Например, вместо простого поиска имени он может выполнить удаление данных или получить доступ к чужим записям.
Рассмотрим код на Python с использованием библиотеки sqlite3:
user_input = "' OR '1'='1"
query = "SELECT * FROM users WHERE name = '" + user_input + "'"
cursor.execute(query)В результате запрос станет: SELECT * FROM users WHERE name = '' OR '1'='1'. Условие OR '1'='1' всегда истинно, поэтому будут возвращены все пользователи. Это простейшая SQL-инъекция.
Параметризованные запросы (prepared statements) передают данные отдельно от кода запроса. База данных обрабатывает их как данные, а не как часть SQL-команды. Пример:
user_input = "' OR '1'='1"
query = "SELECT * FROM users WHERE name = ?"
cursor.execute(query, (user_input,))Теперь даже если пользователь введет вредоносную строку, она будет воспринята как литерал, а не как часть SQL. Символы экранируются автоматически.
Параметризованные запросы поддерживаются всеми современными базами данных и языками программирования: Python (sqlite3, psycopg2), Java (JDBC PreparedStatement), C# (SqlCommand с параметрами), PHP (PDO), JavaScript (node-postgres) и другими.
Использование строковой конкатенации в SQL-запросах категорически не рекомендуется из-за риска SQL-инъекций. Всегда применяйте параметризованные запросы или ORM, которые автоматически экранируют ввод. Это защищает данные и целостность базы данных.