NullByteCat

Разбираем кибербезопасность по битам

Что такое SQL-инъекция? Объясняем на котиках

Привет! Давай разберемся с одной из самых известных уязвимостей — SQL-инъекцией. И помогут нам в этом коты.

Аналогия

Представь, что у тебя есть очень послушный кот-робот. Ты даешь ему команды, и он их выполняет. Например, ты говоришь ему: "Принеси мне: игрушечную мышь". Кот идет и приносит мышь.

А теперь представь, что рядом стоит злоумышленник. Он видит, как ты даешь команды, и решает вмешаться. Когда ты отвлекся, он добавляет к твоей команде свою часть. И теперь команда звучит так: "Принеси мне: игрушечную мышь' ИЛИ '1'='1".

Для кота-робота, который понимает команды буквально, часть "ИЛИ '1'='1'" — это условие, которое всегда истинно. В итоге он приносит тебе не только мышь, но и вообще все предметы, которые у него есть, потому что команда, по сути, превратилась в "Принеси всё".

Как это работает в реальности?

Сайты хранят данные (имена пользователей, пароли) в базах данных (БД). Чтобы получить данные, программа отправляет в БД запрос на языке SQL. Например, чтобы найти пользователя по имени, запрос может выглядеть так:

SELECT * FROM users WHERE username = 'Mursik';

Здесь 'Mursik' — это то, что ввел пользователь. А теперь представим, что вместо 'Mursik' злоумышленник вводит в поле логина вот это:

' OR '1'='1' --

Тогда запрос к базе данных превращается в:

SELECT * FROM users WHERE username = '' OR '1'='1' --';

Часть '1'='1' всегда верна, а -- комментирует остаток строки. В результате база данных отдает программе данные всех пользователей, потому что условие стало истинным для каждой записи. Так злоумышленник может получить доступ к чужим аккаунтам.

Как защититься?

Главный способ — никогда не доверять данным от пользователя и не вставлять их в запрос "как есть". Используются специальные "подготовленные выражения" (prepared statements), которые четко отделяют саму команду от данных. Это все равно что положить данные от пользователя в специальный контейнер, который не позволяет им превратиться в часть команды для нашего кота-робота.