SQL in’yeksiyasi


baham ko'ring

SQL Injection (SQL Inyeksiya xavfi)

SQL in’ektsiyasi - bu ma’lumotlar bazasini yo‘q qilishi mumkin bo‘lgan kodni kiritish usuli. SQL in’ektsiyalari keng tarqalgan veb-xakerlik texnikasidir.

SQL in’yeksiyalari - bu hujumchilar foydalanuvchi ma’lumot kiritadigan maydonlarga zararli SQL kodini kiritib, shu yo‘l bilan ma’lumotlar bazasidagi maxfiy ma’lumotlarni o‘qishi, o‘zgartirishi yoki o‘chirishi mumkin bo‘lgan holatdir.

SQL in’yeksiyalari odatda siz foydalanuvchidan foydalanuvchi nomi yoki identifikatori (username/userid) kabi ma’lumotni kiritishni so‘raganingizda, hujumchi esa ism/id o‘rniga ma’lumotlar bazangizda biror narsani bajaradigan SQL buyrug‘ini kiritganda sodir bo‘ladi.

So‘rov stringiga (select string) o‘zgaruvchi (txtUserId) qo‘shish orqali SELECT buyrug‘ini hosil qiladigan quyidagi misolga qarang. O‘zgaruvchi foydalanuvchi kiritgan ma’lumotdan (getRequestString) olinadi:

Misol

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

Ushbu bobning qolgan qismida foydalanuvchi kiritgan ma’lumotlarni SQL buyruqlarida ishlatishning potensial xavflari tasvirlangan.

Keyingi boblarda SQL Parameters va SQL Prepared Statements yordamida SQL in’ektsiyalarining oldini olishning eng samarali usullari ko‘rsatilgan.


1=1 har doim rost bo‘lishiga asoslangan SQL in’yeksiyasi

Yuqoridagi misolga yana qarang. SQL kodining asl maqsadi berilgan foydalanuvchi identifikatoriga ega foydalanuvchini tanlash edi.

Agar foydalanuvchining "noto‘g‘ri" ma’lumot kiritishiga hech narsa to‘sqinlik qilmasa, foydalanuvchi quyidagi kabi "aqlli" ma’lumot kiritishi mumkin:

UserId:

Shunda SQL buyrug‘i quyidagicha ko‘rinadi:

SELECT * FROM Users WHERE UserId = 105 OR 1=1;

Yuqoridagi SQL sintaktik jihatdan to‘g‘ri va barcha qatorlarni "Users" jadvalidan qaytaradi, chunki OR 1=1 har doim TRUE bo‘ladi.

Yuqoridagi misol xavfli ko‘rinadimi? Agar "Foydalanuvchilar" jadvalida nomlar va parollar mavjud bo‘lsa-chi?

Xaker kiritish maydoniga shunchaki 105 OR 1=1 ni kiritib, ma’lumotlar bazasidagi barcha foydalanuvchi nomlari va parollariga kirish huquqini qo‘lga kiritishi mumkin.



YOKI ""="" asosidagi SQL in’ektsiyasi har doim to‘g‘ri

Mana, veb-saytga foydalanuvchi kirishiga misol:

Username:

Password:

Misol

uName = getRequestString("username");
uPass = getRequestString("userpassword");

sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'

Natija

SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"

Xaker foydalanuvchi nomi yoki parol matn maydoniga shunchaki " OR ""=" ni kiritib, ma’lumotlar bazasidagi foydalanuvchi nomlari va parollariga kirishi mumkin:

User Name:

Password:

Endi SQL buyrug‘i quyidagicha ko‘rinadi:

Natija

SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""

Yuqoridagi SQL yaroqli va "Users" jadvalidagi BARCHA qatorlarni qaytaradi, chunki OR ""="" har doim TRUE bo‘ladi.


Paketli SQL buyruqlari orqali SQL in’yeksiyasi

To‘plamli SQL iboralari nuqta-vergul bilan ajratilgan ikki yoki undan ortiq SQL operatorlari guruhidir.

Quyidagi SQL buyrug‘i "Users" jadvalidagi barcha qatorlarni qaytaradi, so‘ng "Suppliers" jadvalini o‘chirib tashlaydi.

Misol

SELECT * FROM Users; DROP TABLE Suppliers;

Quyidagi misolga qarang:

Misol

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

Va quyidagi kirish:

User id:

Yaroqli SQL buyrug‘i quyidagicha ko‘rinadi:

Natija

SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;

W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!