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 подскажет развёрнутый ответ в реальном времени.