Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
PreparedStatement
PreparedStatement — это механизм в JDBC (Java Database Connectivity), который позволяет безопасно выполнять SQL-запросы с параметрами. Хотя это концепция Java, в Python используются аналогичные инструменты для защиты от SQL-инъекций.
Назначение PreparedStatement
Предварительно подготовленные запросы решают две главные задачи:
- Безопасность — защита от SQL-инъекций
- Производительность — кеширование скомпилированного плана запроса
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 код отделён от данных
- Безопасность — гарантированная защита при пользовательском вводе