Научете как се извършва атаката с SQL инжектиране и как да избегнете SQL инжектиране с помощта на Node.js

Ние създаваме прототипи на софтуерни приложения по бърз начин. Много големи приложения ще бъдат помолени да създадат за по-малко дни/месеци от клиенти. Днес живеем в бързо развиващ се свят. Ако обмисляте да създадете приложение на едно място, някой на друго място вече е започнал да прави същото приложение като вашето. Всеки ден се предлагат нови идеи. И идеите ще бъдат насочени към създаване на приложение.

Така че организациите/разработчиците нямат време да направят всички тестове на приложението. Особено тестове за сигурност. Сигурността играе много важна роля в разработването на софтуерни приложения. Ако приложението е компрометирано, тогава ще загубим информацията за клиентите си и доверието на клиента в нас. Така че трябва да обърнем повече внимание на сигурността на приложението. Дори ние можем да наемем някои експерти по сигурността и да ги помолим да атакуват нашето приложение и да открият уязвимостите в приложението.

Популярните атаки за сигурност са изброени по-долу.

  1. Атаки чрез SQL инжектиране
  2. Междусайтов скрипт
  3. Несигурна десериализация
  4. Нарушено удостоверяване
  5. Атаки за фалшифициране на междусайтови заявки
  6. Излагане на чувствителни данни
  7. DDOS

В този урок ще разгледаме следните теми.

  1. Какво е SQL инжектиране?
  2. Как можем да тестваме URL адреса за SQL инжектиране?
  3. Как да избегнете SQL инжектиране с помощта на Node.js и MySQL. Можете да приложите тази концепция, като използвате всеки език за програмиране. Тук използвам Node.js.

Какво е SQL инжектиране?

SQL Injection не е нищо друго освен обикновен недостатък/вратичка в SQL заявката, която използвате. Дефектът в SQL заявката ще причини повреда на данните или ще изложи на неоторизирани хора. Всички разработчици са помолени да преминат към концепцията за подготвен оператор вместо да използват концепцията за оператор в езика за програмиране (технически). Подготвеният оператор ще адресира SQL инжекцията. Въпреки това, ако разработчикът не знае какво е SQL инжектиране, тогава има възможност дори подготвеният оператор да изложи данни.

Да вземем пример в реално време. Създайте таблица, като използвате заявката по-долу в MySQL.

CREATE TABLE `contact_list` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `mobile` varchar(45) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  `created_date` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
);

Вмъкнете данните в горната таблица, като използвате заявката по-долу.

INSERT INTO contact_list(name,mobile,email) VALUES('RAJA',998800,'[email protected]');
INSERT INTO contact_list(name,mobile,email) VALUES('Mano',789070,'[email protected]');
INSERT INTO contact_list(name,mobile,email) VALUES('Tom',636261,'[email protected]');

Сега пиша MySQL SQL заявка, за да извлека данни на конкретен потребител, като използвам долната SQL заявка в Node.js.

  1. Това е REST API. Той ще произведе изхода, когато подадем правилния потребителски идентификатор.
  2. Да приемем, че предаваме потребителския идентификатор от браузъра, както е показано по-долу.
http://localhost:3000/get-info?id=1

Той ще върне съответните данни към потребителския идентификатор, който е равен на 1.

3. Сега изпълнете URL адреса по-долу във вашия браузър.

http://localhost:3000/get-info?id=1 or 1=1

Той ще разкрие цялата потребителска информация, вместо да върне информацията за един потребител.

Как това разкрива данните?

Когато използваме конкатенацията, за горния вход SQL заявката се изпълнява, както е показано по-долу.

SELECT * FROM contact_list WHERE id=1 or 1=1

Така операторът OR ще приеме всяка истинска стойност и ще върне всички данни.

Същият проблем ще възникне и при низовете. Да приемем, че извличаме потребителска информация, използвайки името. SQL заявката се създава по следния начин.

const query="SELECT * FROM contact_list where name='"+req.id+"'";

Тук единичният цитат може да бъде манипулиран от опитни хакери с помощта на URL адреса.

http://localhost:3000/get-info?name=Raja' or '1=1

Вижте как единичните кавички се манипулират в concatenate. Горното ще разкрие всички данни.

Възможният пример за списък с атаки чрез SQL инжектиране.

  1. Вземете името на базата данни, като използвате долната SQL заявка.
UNION SELECT DATABASE()

2. И добавете горния код в нашия съществуващ URL адрес. Той ще разкрие името на текущата база данни. Това е най-големият риск досега.

http://localhost:3000/get-info?id=1 UNION SELECT 1 id,1 name,1 mobile,1 email,DATABASE() created_date

Тук добавих 5 колони. Защо, защото знам, че изходът е 5 колони. Така че, когато използваме UNOIN, трябва да добавим 5 колони. Петата колона ще покаже текущото име на база данни.

3. Вземете потребителско име, като използвате долната SQL заявка.

UNION SELECT USER()

4. И добавете горния код в нашия съществуващ URL адрес. Ще покаже текущото потребителско име. По същия начин можем да правим много неща с SQL инжекция.

http://localhost:3000/get-info?id=1 UNION SELECT 1 id,1 name,1 mobile,1 email,USER() created_date

Тук изброих само няколко атаки. Научете повече за атаките чрез SQL инжектиране в MySQL от OWASP, като използвате връзката по-долу.



Подход с подготвени изявления за избягване на SQL инжектиране с помощта на Node.js

Използвайте кода по-долу, за да избегнете SQL инжектиране в MySQL и Node.js.

Просто използвайте въпросителния знак, за да избегнете атаката чрез SQL инжектиране. И се опитайте да дезинфекцирате входа си, преди да го поставите в SQL заявката.

Как да избегнете SQL инжектиране с помощта на Node.js

  1. Не свързвайте низовете на SQL заявката. Това е мястото, където хакерите ще манипулират SQL заявката, за да изложат данните. Така че никога не правете конкатенацията на SQL заявка.
  2. Винаги използвайте подхода на подготвеното изявление (подхода на въпросителен знак).
  3. Предимството на използването на въпросителен знак е, че той ще съпостави сравнението на данните само с конкретната колона. Дори хакерите да променят входа, модифицираната входна стойност ще бъде сравнена само с една колона. Така че не излага данните.
  4. Научете съществуващите възможни модели на атаки чрез SQL инжектиране и се опитайте да избегнете тези модели, когато разработвате вашето приложение.

Заключение

Трябва да обърнем повече внимание на тестовете за сигурност на приложението. Има много пропуски в сигурността. Трябва да образоваме всички разработчици и програмисти за съществуващите пропуски в сигурността. И ние трябва да избегнем съществуващите пропуски в сигурността, докато пишем новото приложение. Трябва да поддържаме актуална информация за тестовете за сигурност, използвайки уебсайта на OWASP. OWASP е фондация с нестопанска цел, която работи за подобряване на сигурността на софтуера. В този урок обясних само атаката с SQL инжектиране, използвайки само MySQL ad Node.js. Същата превантивна мярка може да се приложи към всеки език за програмиране и база данни.

Разработчиците на предния край, разработчиците на пълен стек и разработчиците на REST API трябва да са наясно с това SQL инжектиране. Защо, защото те са основните играчи, които ще работят върху нещата, свързани със сигурността в едно приложение и отговарят за разработването на по-добро приложение.

Благодаря ви, че прочетохте тази статия.

Ако имате въпроси, моля коментирайте.

Допълнителна литература: