Валідація вводу та ін'єкції
Кожне значення, яке надходить ззовні, - поле форми, рядок запиту, заголовок, завантажений файл, URL, який ти запитуєш, - вважається ворожим, доки не доведено протилежне. Ін'єкція відбувається тоді, коли це значення трактується як код або структура, а не як дані.
Чек-лист
- Завжди використовуй параметризовані запити. Ніколи не будуй SQL конкатенацією рядків. Використовуй прив'язані параметри або ORM, який прив'язує їх за тебе. Це закриває SQL-ін'єкції. Те саме правило стосується NoSQL і shell-команд.
- Екрануй вивід залежно від контексту. Покладайся на фреймворк шаблонів або UI, який екранує за замовчуванням (наприклад, React). Будь дуже обережним з будь-яким механізмом "вивести сирий HTML". Саме так у застосунок потрапляє cross-site scripting (XSS).
- Перевіряй за списком дозволеного, а не за списком заборонених. Визнач, як виглядає допустиме значення, і відхиляй усе інше, замість того щоб намагатися занести погані дані до чорного списку.
- Захищай серверні запити (SSRF). Якщо сервер запитує URL, наданий користувачем, перевіряй його і блокуй внутрішні діапазони та адресу метаданих хмари (169.254.169.254). Використовуй сувору перевірку хоста і фіксуй DNS, щоб протидіяти DNS rebinding.
- Ніколи не десеріалізуй недовірені дані в код. Уникай pickle, нативної десеріалізації Java чи PHP та подібних механізмів над байтами, які контролює зловмисник. Вони виконують код.
- Захищай завантаження файлів. Перевіряй реальний вміст (magic bytes), а не
лише розширення чи оголошений тип. Встанови жорстке обмеження розміру. Зберігай
файли поза веб-коренем, під випадковою або id-базованою назвою, ніколи під
назвою файлу користувача. Віддавай їх з правильним типом вмісту та
X-Content-Type-Options: nosniff. Якщо можеш, скануй на наявність шкідливого ПЗ. - Перевіряй тіла запитів за схемою. Відхиляй невідомі поля замість того, щоб пропускати їх (див. mass assignment у API та запитах).
Як тестувати
- Вставляй
' OR 1=1 --,<script>alert(1)</script>і${7*7}у кожне поле та переконайся, що вони зберігаються і відображаються як звичайний текст. - Вказуй
http://169.254.169.254/іhttp://localhost/у кожному полі з URL. - Завантаж HTML-файл, перейменований на
.png, і переконайся, що його відхилено або віддано в нешкідливому вигляді.