SQL в приложениях: параметризованные запросы и SQL-инъекции
Как настоящие программы безопасно отправляют SQL -- и как злоумышленники ломают те, что делают это неправильно
- описать, как приложение подключается к базе данных и отправляет SQL,
- объяснить, почему построение запросов через конкатенацию строк опасно,
- разобрать анатомию атаки SQL-инъекции (обход входа и кража данных через UNION),
- написать параметризованный запрос / подготовленное выражение, нейтрализующее атаку,
- применить принцип наименьших привилегий, чтобы взломанный запрос нанёс как можно меньше вреда.
1. Как приложение отправляет SQL
Раньше вы выполняли SQL вручную в клиенте. Веб- или мобильное приложение делает то же самое, только программно. Оно открывает соединение с базой через драйвер (библиотеку вроде mysql2 для Node.js, JDBC для Java или psycopg для Python), отправляет запрос как текст и читает строки обратно.
База данных вообще не знает, что существует какой-то "пользователь". Она получает строку, разбирает её в запрос, выполняет и возвращает набор строк. В этом суть всей темы: база доверяет любому SQL-тексту, который ей передали. Если ваш код позволяет постороннему влиять на этот текст, посторонний фактически пишет SQL на вашем сервере.
Всё, что ниже, использует одну маленькую базу магазина. Создадим её один раз.