Инъекции: SQL, командные, LDAP, десериализация
↑ 7.4 Безопасность бэкенда · ← Предыдущая · → Следующая
Зачем это на собесе
Инъекции — общий класс: данные пользователя интерпретируются как код.
Объяснение
| Вид | Как возникает | Защита |
|---|---|---|
| SQL | конкатенация в запросе (см. Параметризованные запросы и SQL-инъекции) | параметры, ORM, белые списки для имён |
| Командные (OS) | Process.Start("sh -c " + input) | не вызывать shell, передавать аргументы массивом, allowlist |
| LDAP | подстановка в фильтр | экранирование, параметризация |
| NoSQL | JSON-операторы ({ "$ne": null }) | валидация типов, санитайзинг операторов |
| XML (XXE) | внешние сущности в XML | отключить DTD/внешние сущности (DtdProcessing.Prohibit) |
| Небезопасная десериализация | BinaryFormatter, полиморфный JSON с типами из входных данных | не десериализовать недоверенные данные в произвольные типы |
| Template injection | пользовательский шаблон | песочница, не исполнять шаблоны от пользователей |
| XSS | вывод HTML без экранирования | контекстное экранирование, CSP |
| Path traversal | ../ в путях | нормализация и проверка корня, генерация имён |
| Header/log injection | переводы строк в значениях | санитайзинг, структурные логи |
// Плохо
Process.Start("bash", $"-c \"convert {fileName} out.png\"");
// Лучше: без shell, аргументы раздельно, имя из белого списка/GUID
var psi = new ProcessStartInfo("convert") { ArgumentList = { storedPath, "out.png" }, RedirectStandardError = true };
// System.Text.Json: типы задаются кодом, а не входными данными
var dto = JsonSerializer.Deserialize<OrderDto>(json);Принцип: валидация на входе + кодирование на выходе + минимум прав.
Нюансы и подводные камни
BinaryFormatterудалён из .NET 9: не возвращайте его.- Newtonsoft
TypeNameHandling.Allна недоверенных данных приводит к RCE. - Регулярные выражения без таймаута дают ReDoS:
RegexсmatchTimeout. - Проверка расширения файла ≠ проверка содержимого.
- Права процесса: запуск не от root, минимальные права на файлы и БД.
Практика
- Найдите в проекте вызовы
Process.Startи небезопасные десериализаторы. - Защитите обработчик загрузки от path traversal.
- Добавьте таймауты ко всем
Regex.
Вопросы с ответами
Почему опасна десериализация недоверенных данных?
Десериализатор может создать произвольные объекты и вызвать код в их конструкторах/сеттерах, что приводит к RCE.
Как защититься от command injection?
Не использовать shell, передавать аргументы списком, ограничить допустимые значения.