Mediumsecuritysql-injection

Что такое SQL injection и как защититься?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

SQL injection — атака, когда user input попадает в SQL без экранирования. Защита — параметризованные запросы.

# ПЛОХО: конкатенация/f-string → инъекция
name = "' OR '1'='1"
cursor.execute(f"SELECT * FROM users WHERE name = '{name}'")
# → SELECT * FROM users WHERE name = '' OR '1'='1'  (возвращает всех)

# ХОРОШО: параметризованный запрос
cursor.execute('SELECT * FROM users WHERE name = %s', (name,))

# ХОРОШО: ORM — parameterized под капотом
User.objects.filter(name=name)            # Django
session.query(User).filter(User.name == name)  # SQLAlchemy

Защита по слоям:

  • параметризованные запросы — никогда не f-string/format SQL с данными;
  • ORM безопасны по умолчанию (но raw SQL — нужно parameters);
  • Validators — проверка формата user input;
  • Principle of least privilege — DB user с минимальными правами (нет DROP);
  • WAF — дополнительный слой.

Также: NoSQL injection, command injection (subprocess shell=True).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.