Проверяет понимание подготовленных запросов и их роли в защите от SQL-инъекций и оптимизации повторяющихся запросов.
Подготовленные запросы (prepared statements) — это способ выполнения SQL-запросов, при котором структура запроса (шаблон) отправляется в базу данных отдельно от данных (параметров). База данных компилирует шаблон один раз, а затем многократно выполняет его с разными значениями параметров. Это фундаментальный механизм для безопасной работы с БД, особенно при обработке пользовательского ввода.
Процесс состоит из двух этапов: подготовка и выполнение. На этапе подготовки сервер БД разбирает и компилирует SQL-запрос, заменяя места для параметров специальными плейсхолдерами (например, ? в MySQL или $1 в PostgreSQL). На этапе выполнения клиент отправляет только значения параметров, которые подставляются в уже готовый план. Ключевое отличие от обычной конкатенации строк — параметры никогда не смешиваются с кодом SQL, поэтому вредоносный ввод не может изменить структуру запроса.
Главная причина использования подготовленных запросов — безопасность. Если вы строите запрос через конкатенацию строк, злоумышленник может передать значение, которое закроет кавычку и добавит свой SQL-код. Например, ввод ' OR '1'='1 превратит запрос в условие, которое всегда истинно. При использовании подготовленных запросов такой ввод будет воспринят как обычная строка, а не как часть команды.
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
# Подготовка запроса с плейсхолдером %s
cur.execute("SELECT * FROM users WHERE email = %s", (user_email,))
# Параметр передается отдельно, безопасно
rows = cur.fetchall()const { Pool } = require('pg');
const pool = new Pool();
// Параметры передаются массивом
const result = await pool.query(
'INSERT INTO products (name, price) VALUES ($1, $2)',
[productName, price]
);Помимо безопасности, подготовленные запросы ускоряют работу, если один и тот же запрос выполняется многократно с разными параметрами. База данных компилирует план выполнения один раз и переиспользует его, экономя ресурсы на парсинге и оптимизации. Однако для разовых запросов накладные расходы на подготовку могут быть незначительными, поэтому их стоит применять там, где запросы повторяются.
Подготовленные запросы — обязательный стандарт для любого приложения, работающего с SQL-базами данных. Они защищают от SQL-инъекций и повышают производительность при повторяющихся операциях. Используйте их всегда, когда в запрос подставляются внешние данные, и предпочитайте их динамической конкатенации строк.
Уровень
Рейтинг:
5
Сложность:
3
Навыки
JavaScript
SQL
Ключевые слова
Подпишись на Golang Developer в телеграм