← Назад к вопросам

Что такое PreparedStatement?

2.3 Middle🔥 131 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

PreparedStatement

PreparedStatement — это механизм в JDBC (Java Database Connectivity), который позволяет безопасно выполнять SQL-запросы с параметрами. Хотя это концепция Java, в Python используются аналогичные инструменты для защиты от SQL-инъекций.

Назначение PreparedStatement

Предварительно подготовленные запросы решают две главные задачи:

  1. Безопасность — защита от SQL-инъекций
  2. Производительность — кеширование скомпилированного плана запроса

SQL-инъекции без PreparedStatement

Без защиты опасно конкатенировать строки:

# ОПАСНО! Уязвимо для SQL-инъекций
user_input = "admin' OR '1'='1"
query = f"SELECT * FROM users WHERE username = '{user_input}'"
# Результат: SELECT * FROM users WHERE username = 'admin' OR '1'='1'

Злоумышленник может передать строку, которая изменит логику запроса.

Как работает PreparedStatement (аналог в Python)

В Python используются параметризованные запросы с драйверами БД. Вот правильный подход:

import sqlite3

connection = sqlite3.connect(":memory:")
cursor = connection.cursor()

# Правильно: используем параметр ?
user_input = "admin' OR '1'='1"
query = "SELECT * FROM users WHERE username = ?"
cursor.execute(query, (user_input,))
results = cursor.fetchall()

С другими БД драйверами

# PostgreSQL с psycopg2
import psycopg2

conn = psycopg2.connect("dbname=test")
cur = conn.cursor()

user_id = 42
query = "SELECT * FROM users WHERE id = %s"
cur.execute(query, (user_id,))

ORM и автоматическая защита

Современные ORM (SQLAlchemy, Django ORM) автоматически используют подготовленные запросы:

# SQLAlchemy
from sqlalchemy import select
from sqlalchemy.orm import Session

session = Session(engine)
user_email = "attacker@example.com"
query = select(User).where(User.email == user_email)
results = session.execute(query).scalars()

Преимущества PreparedStatement

  • Защита от SQL-инъекций — параметры трактуются как данные
  • Производительность — план запроса компилируется один раз
  • Читаемость — SQL код отделён от данных
  • Безопасность — гарантированная защита при пользовательском вводе
Что такое PreparedStatement? | PrepBro