В прошлом техническом посте мы:
➡️ посмотрели какие бывают инъекции
➡️ попробовали сами их по-эксплуатировать.
Возникает закономерный вопрос: и как же от них защититься?
Бремя ответственности лежит на разработчике. Но! ИМХО, это тот самый случай, когда и аналитик может заглянуть в код и оценить уровень бардака в нем. Потому что отличить нормальный запрос в базу от уязвимого, не так уж и сложно.
✔️ Самое главное правило: использовать подготовленные выражения (prepared statements) в базе данных или параметризированные запросы (parameterized queries) в коде бэкенда.
Эти термины часто употребляют как взаимозаменяемые. Это не совсем верно, но смысл у них один и тот же. В обоих случаях пользовательский ввод обрабатывается как данные (т.е. параметры), а не как часть исполняемого кода.
Пример ХОРОШЕЙ практики: в этом коде параметры представлены знаками вопроса:
cur.execute('INSERT INTO users(id, name, surname) VALUES(?, ?, ?)', (id, name, surname))
cur.execute('SELECT * FROM users WHERE login = ? AND password = ?', (login, password))В общем случае, всегда помним:
❌ не склеиваем строки конкатенацией (+ в Python, Java или || в SQL);
❌ не подставляем в SQL-запрос имена таблиц и полей, либо сами значения с помощью интерполяции/f-строками.
Пример ПЛОХОЙ практики:
cur.execute(f'INSERT INTO cars(car_id, model) VALUES({car_id}, {model})')✔️ Использовать библиотеки объектно-реляционного маппинга (ORM). Они позволяют взаимодействовать с БД через объекты и классы языка программирования, а не через SQL. ORM уже имеют встроенные механизмы параметризации.
Для Python это, например, SQLAlchemy.
Для Java, например, Hibernate.
✔️ Предусмотрите валидацию данных. Системный аналитик может предоставить данные для валидации пользовательского ввода.
Самые простые вещи, это, например, вводимый возраст:
>= 18 and <=120
✔️ Соблюдайте принцип наименьших привилегий.
Почти каждая система имеет ролевую модель. Учётки должны иметь права только на те таблицы, которые реально нужны для выполнения бизнес-операций, а не на всю базу целиком.
🐧 Понравился пост? Подписывайся, чтобы не пропустить следующий.
Артем Лещев
