Вопрос проверяет понимание уязвимостей безопасности, связанных с внедрением SQL-кода, и знание методов их предотвращения, что критически важно для защиты данных приложения.
SQL-инъекция — это одна из самых распространённых и опасных уязвимостей веб-приложений. Она позволяет атакующему вмешиваться в запросы, которые приложение отправляет к базе данных. Это может привести к краже, изменению или удалению данных, обходу аутентификации и даже к полному контролю над сервером базы данных.
Проблема возникает, когда приложение конкатенирует (склеивает) строки, введённые пользователем, с SQL-запросом, не проверяя и не экранируя их. Рассмотрим пример уязвимого кода на Python с использованием SQLite:
import sqlite3
# Уязвимая функция для аутентификации пользователя
def unsafe_login(username, password):
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
# Пользовательский ввод напрямую подставляется в запрос!
query = f"SELECT * FROM users WHERE name='{username}' AND password='{password}'"
cursor.execute(query)
return cursor.fetchone()
# Если злоумышленник введёт в поле пароля: ' OR '1'='1
# Итоговый запрос станет:
# SELECT * FROM users WHERE name='admin' AND password='' OR '1'='1'
# Условие '1'='1' всегда истинно, поэтому запрос вернёт всех пользователей, обойдя проверку пароля.Исправленный вариант с использованием параметризованного запроса:
def safe_login(username, password):
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
# Используем параметризованный запрос. ? — это placeholder для данных.
query = "SELECT * FROM users WHERE name=? AND password=?"
cursor.execute(query, (username, password)) # Данные передаются отдельным аргументом
return cursor.fetchone()
# Теперь, какие бы символы ни ввёл пользователь, они будут обработаны как данные, а не как часть SQL-кода.Вывод: Параметризованные запросы — это обязательная и самая надёжная практика для предотвращения SQL-инъекций. Их следует применять всегда при работе с динамическими SQL-запросами, особенно когда в них участвуют данные, введённые пользователем. Это фундаментальный навык для любого разработчика, работающего с базами данных.