Поймите, что такое SQL-инъекция и как ее предотвратить. Следите за историей о парне из колледжа, который совершает ограбление с помощью SQL-инъекций! Эта иллюстративная статья призвана помочь любому понять концепцию SQL-инъекций и способы их предотвращения.

Итак, представьте себе это…

Технически подкованный вор мечтал погасить все свои долги.

Затем он проснулся, и ему пришла в голову блестящая идея!

Поскольку хакер взаимодействует с веб-сайтом банка, все, что ему нужно сделать, это найти поле ввода на веб-сайте, которое запускает SQL-запрос, а затем ввести свой гипнотизирующий код в поле ввода.

Угадай, что? хакер смог удалить весь свой долг из базы данных банка, и все, что он сделал, это ввел свой гипнотический код на веб-сайт.

Как это произошло?

К счастью, хакер верит в открытость своей техники, поэтому давайте проанализируем, как ему удалось удалить свой долг из базы данных. Когда хакер отправил свой код гипноза, он попадает туда, где имя пользователя, введенное пользователем, должно быть в SQL-запросе банка.

Теперь давайте проанализируем, что было такого особенного в запросе, который хакер вставил в поле имени пользователя, чтобы база данных удалила свои данные. Мы разобьем запрос на 3 части, чтобы лучше его понять.

INSERT INTO bankusers VALUES('DingWall');

Сначала мы вводим поддельное имя пользователя и используем «); ’, чтобы закрыть SQL-запрос. Итак, прямо сейчас SQL-запрос INSERT считает, что это все, что ввел пользователь, поскольку вредоносное значение имени пользователя, введенное хакером, закрыло запрос.

INSERT INTO bankusers VALUES('DingWall'); DROP TABLE bankuser

Во-вторых, мы добавляем запрос пользователя банка DROP TABLE, который запускает новый запрос SQL, так как запрос INSERT был закрыт, и знаете что? бросает стол! (который удаляет все данные)

INSERT INTO bankusers VALUES('DingWall'); DROP TABLE bankuser --, 'get hacked')

Наконец, мы заканчиваем наш вредоносный запрос, который был введен в поле имени пользователя, знаком «-». Это закомментирует остальную часть запроса INSERT, что позволит нам выполнить его, не зная пароля.

Таким образом, как только хакер нажмет кнопку добавления пользователя с вредоносным запросом, таблица базы данных, содержащая все его долги, будет удалена.

Как мы можем предотвратить это?

К счастью, есть много способов предотвратить SQL-инъекции, и вот некоторые из наиболее распространенных.

Проверка ввода. Регулярные выражения (сокращенное регулярное выражение) используются для проверки того, что пользователь вводит в качестве ввода. Они идеально подходят для этой ситуации, поскольку позволяют нам контролировать и ограничивать пользователя от ввода чего-либо вредоносного. Например, взгляните на это регулярное выражение.

^[a-zA-Z0-9]*$

Это регулярное выражение позволяет пользователю вводить только символы алфавита (нижний и верхний регистр) и цифры. Это регулярное выражение поможет предотвратить SQL-инъекцию, выполненную хакером, поскольку он не сможет использовать какие-либо специальные символы.

Параметризированные запросы. Работа с параметризованными запросами заключается в том, что SQL-запрос сначала предварительно компилируется, поэтому база данных точно знает, что будет делать запрос. даже если ввод выглядит как SQL-запрос, он не будет обработан, поскольку мы уже предварительно скомпилировали наш запрос. Вот как будет выглядеть параметризованная реализация или запроса.

sqlQuery='INSERT INTO bankusers VALUES (User=? AND Password=?)'
parameters.add("User", username)
parameters.add("Password", password)

Ну, это определенно не сработало для нашего хакера, но, по крайней мере, мы узнали что-то новое!