MySQL SQL in’yeksiyasi
SQL in’ektsiyasi
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’ektsiyalari - bu tajovuzkorlar foydalanuvchi kiritish maydonlariga zararli SQL kodini kiritganda va shu bilan ma’lumotlar bazasidagi maxfiy ma’lumotlarni o‘qish, o‘zgartirish yoki o‘chirish mumkin.
SQL in’ektsiyalari odatda foydalanuvchidan foydalanuvchi nomi/foydalanuvchi identifikatori kabi kiritishni so‘raganingizda sodir bo‘ladi va tajovuzkor ism/idni berish o‘rniga ma’lumotlar bazasida biror narsani bajaradigan SQL buyrug‘ini kiritadi.
O‘zgaruvchini (txtUserId) so‘rov stringiga qo‘shish orqali SELECT buyrug‘ini yaratadigan quyidagi misolga qarang. O‘zgaruvchi foydalanuvchi kiritgan ma’lumotdan olinadi (getRequestString):
Misol
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = " + txtUserId;
Ushbu bobning qolgan qismida SQL iboralarida foydalanuvchi ma’lumotlaridan foydalanishning mumkin bo‘lgan xavflari tasvirlangan.
Keyingi bobda Tayyor operatorlar yordamida SQL in’ektsiyalarining oldini olishning eng samarali metodlari ko‘rsatilgan.
Doim rost bo‘ladigan 1=1 shartiga asoslangan SQL in’eksiyasi
Yuqoridagi misolga yana qarang. SQL kodining asl maqsadi ma’lum foydalanuvchi identifikatoriga ega foydalanuvchini tanlash edi.
Agar foydalanuvchining "noto‘g‘ri" kiritishiga to‘sqinlik qiladigan hech narsa bo‘lmasa, foydalanuvchi quyidagi kabi "aqlli" kiritishni kiritishi mumkin:
Foydalanuvchi IDsi:
Keyin, SQL operatori quyidagicha ko‘rinadi:
SELECT * FROM Users WHERE UserId = 105 OR 1=1;
Yuqoridagi SQL to‘g‘ri va "Users" jadvalidagi BARCHA qatorlarni qaytaradi, chunki OR 1=1 har doim TRUE.
Yuqoridagi misol xavfli ko‘rinadimi? Agar "Foydalanuvchilar" jadvalida nomlar va parollar mavjud bo‘lsa-chi?
Xaker ma’lumotlar bazasidagi barcha foydalanuvchi nomlari va parollariga kirish maydoniga oddiygina 105 YOKI 1=1 kiritish orqali kirishi mumkin.
YOKI ""="" asosidagi SQL in’ektsiyasi har doim to‘g‘ri
Mana, veb-saytga foydalanuvchi kirishiga misol:
Foydalanuvchi nomi:
Parol:
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 oddiygina " YOKI ""=" kiritish orqali ma’lumotlar bazasidagi foydalanuvchi nomlari va parollariga kirishi mumkin:
Foydalanuvchi nomi:
Parol:
Endi SQL operatori quyidagicha ko‘rinadi:
Natija
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
Yuqoridagi SQL to‘g‘ri va "Users" jadvalidagi BARCHA satrlarni qaytaradi, chunki OR ""="" har doim TRUE bo‘ladi.
Paketli SQL operatorlaridan SQL in’ektsiyasi
To‘plamli SQL iboralari nuqta-vergul bilan ajratilgan ikki yoki undan ortiq SQL operatorlari guruhidir.
Quyidagi SQL operatori "Foydalanuvchilar" jadvalidagi barcha qatorlarni qaytaradi, so‘ngra "Ta’minotchilar" jadvalini o‘chiradi.
Misol
SELECT * FROM Users; DROP TABLE Suppliers;
Quyidagi misolga qarang:
Misol
txtUserId = getRequestString("UserId");
txtSQL = "SELECT *
FROM Users WHERE UserId = " + txtUserId;
Va quyidagi kirish:
Foydalanuvchi IDsi:
To‘g‘ri SQL operatori quyidagicha ko‘rinadi:
Natija
SELECT * FROM Users WHERE
UserId = 105; DROP TABLE Suppliers;
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
