Вопрос проверяет знание методов защиты от SQL-инъекций, которые позволяют предотвратить внедрение вредоносного кода в запросы к базе данных.
SQL-инъекция — это атака, при которой злоумышленник вставляет или "инъецирует" вредоносный SQL-код через пользовательский ввод, который затем выполняется базой данных. Это может привести к краже, изменению или удалению данных. Защита строится на разделении кода (команд SQL) и данных (пользовательского ввода).
Это самый эффективный метод. Место для данных в запросе обозначается параметром (например, ? или @name). Драйвер базы данных гарантирует, что переданное значение будет обработано только как данные, а не как часть команды SQL.
// Пример на Python с sqlite3
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# НЕПРАВИЛЬНО: уязвимый запрос
# user_input = "' OR '1'='1"
# cursor.execute(f"SELECT * FROM users WHERE login = '{user_input}'")
# ПРАВИЛЬНО: параметризованный запрос
user_input = "' OR '1'='1"
cursor.execute("SELECT * FROM users WHERE login = ?", (user_input,))
# Драйвер безопасно подставит значение, инъекция не сработает.Библиотеки ORM (например, SQLAlchemy для Python, Hibernate для Java, Sequelize для Node.js) автоматически генерируют параметризованные запросы, что минимизирует риск ошибки разработчика.
# Пример с SQLAlchemy (Python)
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///test.db')
with engine.connect() as conn:
# Безопасный запрос через text() и параметры
stmt = text("SELECT * FROM users WHERE login = :login")
result = conn.execute(stmt, {'login': user_input})Хотя это не заменяет параметризованные запросы, валидация полезна как дополнительный барьер.
mysqli_real_escape_string() в PHP), но полагаться только на них небезопасно.Вывод: Параметризованные запросы (prepared statements) — это обязательный и основной метод защиты от SQL-инъекций на уровне кода. ORM предоставляет удобную и безопасную абстракцию. Валидация ввода и настройка прав БД служат важными дополнительными слоями безопасности.