Научете как се извършва атаката с SQL инжектиране и как да избегнете SQL инжектиране с помощта на Node.js
Ние създаваме прототипи на софтуерни приложения по бърз начин. Много големи приложения ще бъдат помолени да създадат за по-малко дни/месеци от клиенти. Днес живеем в бързо развиващ се свят. Ако обмисляте да създадете приложение на едно място, някой на друго място вече е започнал да прави същото приложение като вашето. Всеки ден се предлагат нови идеи. И идеите ще бъдат насочени към създаване на приложение.
Така че организациите/разработчиците нямат време да направят всички тестове на приложението. Особено тестове за сигурност. Сигурността играе много важна роля в разработването на софтуерни приложения. Ако приложението е компрометирано, тогава ще загубим информацията за клиентите си и доверието на клиента в нас. Така че трябва да обърнем повече внимание на сигурността на приложението. Дори ние можем да наемем някои експерти по сигурността и да ги помолим да атакуват нашето приложение и да открият уязвимостите в приложението.
Популярните атаки за сигурност са изброени по-долу.
- Атаки чрез SQL инжектиране
- Междусайтов скрипт
- Несигурна десериализация
- Нарушено удостоверяване
- Атаки за фалшифициране на междусайтови заявки
- Излагане на чувствителни данни
- DDOS
В този урок ще разгледаме следните теми.
- Какво е SQL инжектиране?
- Как можем да тестваме URL адреса за SQL инжектиране?
- Как да избегнете 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.
- Това е REST API. Той ще произведе изхода, когато подадем правилния потребителски идентификатор.
- Да приемем, че предаваме потребителския идентификатор от браузъра, както е показано по-долу.
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 инжектиране.
- Вземете името на базата данни, като използвате долната 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
- Не свързвайте низовете на SQL заявката. Това е мястото, където хакерите ще манипулират SQL заявката, за да изложат данните. Така че никога не правете конкатенацията на SQL заявка.
- Винаги използвайте подхода на подготвеното изявление (подхода на въпросителен знак).
- Предимството на използването на въпросителен знак е, че той ще съпостави сравнението на данните само с конкретната колона. Дори хакерите да променят входа, модифицираната входна стойност ще бъде сравнена само с една колона. Така че не излага данните.
- Научете съществуващите възможни модели на атаки чрез SQL инжектиране и се опитайте да избегнете тези модели, когато разработвате вашето приложение.
Заключение
Трябва да обърнем повече внимание на тестовете за сигурност на приложението. Има много пропуски в сигурността. Трябва да образоваме всички разработчици и програмисти за съществуващите пропуски в сигурността. И ние трябва да избегнем съществуващите пропуски в сигурността, докато пишем новото приложение. Трябва да поддържаме актуална информация за тестовете за сигурност, използвайки уебсайта на OWASP. OWASP е фондация с нестопанска цел, която работи за подобряване на сигурността на софтуера. В този урок обясних само атаката с SQL инжектиране, използвайки само MySQL ad Node.js. Същата превантивна мярка може да се приложи към всеки език за програмиране и база данни.
Разработчиците на предния край, разработчиците на пълен стек и разработчиците на REST API трябва да са наясно с това SQL инжектиране. Защо, защото те са основните играчи, които ще работят върху нещата, свързани със сигурността в едно приложение и отговарят за разработването на по-добро приложение.
Благодаря ви, че прочетохте тази статия.
Ако имате въпроси, моля коментирайте.
Допълнителна литература: