Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: SQL injection, prepared statements, parameterized queries, input validation, ORM

Какие способы защиты от SQL-инъекций существуют на уровне кода и запросов?

Вопрос проверяет знание методов защиты от SQL-инъекций, которые позволяют предотвратить внедрение вредоносного кода в запросы к базе данных.

Короткий ответ

Основной способ защиты — использование параметризованных запросов (prepared statements), когда данные передаются отдельно от команды SQL. Также важно проводить валидацию и санацию (экранирование) пользовательского ввода. Использование ORM (Object-Relational Mapping) автоматически защищает от многих инъекций, так как генерирует безопасные запросы. Дополнительно можно применять принцип минимальных привилегий для учётных записей БД.

Длинный ответ

SQL-инъекция — это атака, при которой злоумышленник вставляет или "инъецирует" вредоносный SQL-код через пользовательский ввод, который затем выполняется базой данных. Это может привести к краже, изменению или удалению данных. Защита строится на разделении кода (команд SQL) и данных (пользовательского ввода).

1. Параметризованные запросы (Prepared Statements)

Это самый эффективный метод. Место для данных в запросе обозначается параметром (например, ? или @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,))
# Драйвер безопасно подставит значение, инъекция не сработает.

2. Использование ORM

Библиотеки 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})

3. Валидация и санация ввода

Хотя это не заменяет параметризованные запросы, валидация полезна как дополнительный барьер.

  • Белы списки: Разрешать только определённые, ожидаемые символы (например, только цифры для ID).
  • Экранирование: Использовать функции экранирования, предоставляемые драйвером БД (например, mysqli_real_escape_string() в PHP), но полагаться только на них небезопасно.

4. Прочие меры на уровне приложения и БД

  • Принцип минимальных привилегий: Учётная запись приложения не должна иметь прав на удаление таблиц или выполнение административных команд.
  • Хранимые процедуры: Могут помочь, но только если они корректно реализованы с параметрами.
  • Регулярное обновление ПО: Обновлять драйверы БД и фреймворки для устранения известных уязвимостей.

Вывод: Параметризованные запросы (prepared statements) — это обязательный и основной метод защиты от SQL-инъекций на уровне кода. ORM предоставляет удобную и безопасную абстракцию. Валидация ввода и настройка прав БД служат важными дополнительными слоями безопасности.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • SQL

Ключевые слова

#SQL injection

#prepared statements

#parameterized queries

#input validation

#ORM

Подпишись на Python Developer в телеграм