Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: SQL injection, security, database, prepared statements, input validation

Что такое SQL-инъекции и как с ними бороться?

Вопрос проверяет понимание уязвимостей безопасности, связанных с внедрением SQL-кода, и знание методов их предотвращения, что критически важно для защиты данных приложения.

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

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

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

SQL-инъекция — это одна из самых распространённых и опасных уязвимостей веб-приложений. Она позволяет атакующему вмешиваться в запросы, которые приложение отправляет к базе данных. Это может привести к краже, изменению или удалению данных, обходу аутентификации и даже к полному контролю над сервером базы данных.

Как это работает?

Проблема возникает, когда приложение конкатенирует (склеивает) строки, введённые пользователем, с SQL-запросом, не проверяя и не экранируя их. Рассмотрим пример уязвимого кода на Python с использованием SQLite:

import sqlite3

# Уязвимая функция для аутентификации пользователя
def unsafe_login(username, password):
    conn = sqlite3.connect('app.db')
    cursor = conn.cursor()
    # Пользовательский ввод напрямую подставляется в запрос!
    query = f"SELECT * FROM users WHERE name='{username}' AND password='{password}'"
    cursor.execute(query)
    return cursor.fetchone()

# Если злоумышленник введёт в поле пароля: ' OR '1'='1
# Итоговый запрос станет:
# SELECT * FROM users WHERE name='admin' AND password='' OR '1'='1'
# Условие '1'='1' всегда истинно, поэтому запрос вернёт всех пользователей, обойдя проверку пароля.

Основные методы защиты

  • Параметризованные запросы (Prepared Statements): Самый эффективный способ. Механизм СУБД сам различает код запроса и передаваемые данные, что исключает возможность их интерпретации как команд.
  • Валидация и санация ввода: Проверяйте, что введённые данные соответствуют ожидаемому формату (например, email, число).
  • Принцип минимальных привилегий: Учётная запись приложения для работы с БД должна иметь только необходимые права (например, только SELECT, INSERT, но не DROP).
  • Экранирование специальных символов: Используйте функции экранирования, предоставляемые фреймворком или библиотекой (но это менее надёжно, чем параметризованные запросы).

Пример безопасного кода

Исправленный вариант с использованием параметризованного запроса:

def safe_login(username, password):
    conn = sqlite3.connect('app.db')
    cursor = conn.cursor()
    # Используем параметризованный запрос. ? — это placeholder для данных.
    query = "SELECT * FROM users WHERE name=? AND password=?"
    cursor.execute(query, (username, password))  # Данные передаются отдельным аргументом
    return cursor.fetchone()
# Теперь, какие бы символы ни ввёл пользователь, они будут обработаны как данные, а не как часть SQL-кода.

Вывод: Параметризованные запросы — это обязательная и самая надёжная практика для предотвращения SQL-инъекций. Их следует применять всегда при работе с динамическими SQL-запросами, особенно когда в них участвуют данные, введённые пользователем. Это фундаментальный навык для любого разработчика, работающего с базами данных.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • SQL

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

#SQL injection

#security

#database

#prepared statements

#input validation

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