MySQL sql in'ektsiyasini qanday oldini oladi? SQL in'ektsiya printsipi va oldini olish

MySQLSQL in'ektsiyasini qanday oldini olish mumkin? SQL in'ektsiyasi printsipi va oldini olish

MySQL va SQL in'ektsiyasi

Agar siz foydalanuvchi tomonidan kiritilgan ma'lumotlarni veb-sahifa orqali olib, uni aMySQL ma'lumotlar bazasi, keyin SQL in'ektsiyasi xavfsizligi bilan bog'liq muammolar bo'lishi mumkin.

Ushbu bobda SQL in'ektsiyasining oldini olish va skriptlar orqali SQLda kiritilgan belgilarni filtrlash usullari ko'rib chiqiladi.

SQL in'ektsiyasi deb ataladigan narsa domen nomi yoki sahifa so'rovining so'rovlar qatorini yuborish yoki kiritish uchun veb-shaklga SQL buyruqlarini kiritish orqali zararli SQL buyruqlarini bajarish uchun serverni aldashdir.

Biz hech qachon foydalanuvchi ma'lumotlariga ishonmasligimiz kerak, foydalanuvchi kiritgan ma'lumotlar xavfsiz emas deb taxmin qilishimiz kerak va barchamiz foydalanuvchi kiritish ma'lumotlarini filtrlashimiz kerak.

Quyidagi misolda kiritilgan foydalanuvchi nomi harflar, raqamlar va pastki chiziqdan iborat boʻlishi kerak va foydalanuvchi nomi 8 dan 20 tagacha belgidan iborat boʻlishi kerak:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

Hech qanday maxsus belgilar filtrlanmaganda yuzaga keladigan SQL holatini ko'rib chiqamiz:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Yuqoridagi in'ektsiya bayonotida biz $name o'zgaruvchisini filtrlamadik va bizga kerak bo'lmagan SQL operatori $name ichiga kiritildi, bu foydalanuvchilar jadvalidagi barcha ma'lumotlarni o'chirib tashlaydi.

PHP da mysqli_query() bir nechta SQL bayonotlarini bajarishga ruxsat etilmaydi, biroq SQLite va PostgreSQL bir vaqtning o'zida bir nechta SQL bayonotlarini bajarishi mumkin, shuning uchun biz ushbu foydalanuvchilarning ma'lumotlarini qat'iy tekshirishimiz kerak.

SQL in'ektsiyasining oldini olish uchun biz quyidagi fikrlarga e'tibor qaratishimiz kerak:

  • 1. Hech qachon foydalanuvchi kiritishiga ishonmang.Foydalanuvchi kiritgan ma'lumotlarni tekshiring, siz oddiy iboralardan foydalanishingiz yoki uzunlikni cheklashingiz mumkin; bitta qo'shtirnoq va ikkita "-" va hokazolarni o'zgartiring.
  • 2. Hech qachon dinamik yig'ish sql dan foydalanmang, siz parametrlangan sql dan foydalanishingiz yoki ma'lumotlar so'rovi va kirish uchun bevosita saqlangan protseduralardan foydalanishingiz mumkin.
  • 3. Hech qachon administrator imtiyozlari bilan ma'lumotlar bazasi ulanishlaridan foydalanmang, har bir ilova uchun cheklangan imtiyozlarga ega alohida ma'lumotlar bazasi ulanishlaridan foydalaning.
  • 4. Maxfiy ma'lumotlarni to'g'ridan-to'g'ri saqlamang, parollar va maxfiy ma'lumotlarni shifrlamang yoki xesh bilan chiqarmang.
  • 5. Ilovaning istisno ma'lumotlari iloji boricha kamroq maslahatlar berishi kerak va asl xato ma'lumotlarini o'rash uchun maxsus xato ma'lumotlaridan foydalanish yaxshidir.
  • 6. Sql in'ektsiyasini aniqlash usuli odatda yordamchini qabul qiladiDasturiy ta'minotYoki aniqlash uchun veb-sayt platformasi, dasturiy ta'minot odatda jsky sql in'ektsiyani aniqlash vositasidan foydalanadi va veb-sayt platformasida Yisi veb-sayt xavfsizligi platformasini aniqlash vositasi mavjud. MDCSOFT SCAN va boshqalar.MDCSOFT-IPS-dan foydalanish SQL in'ektsiyasi, XSS hujumlari va boshqalardan samarali himoyalanishi mumkin.

SQL in'ektsiyasini oldini olish

Perl va PHP kabi skript tillarida siz SQL in'ektsiyasini oldini olish uchun foydalanuvchi tomonidan kiritilgan ma'lumotlardan qochishingiz mumkin.

PHP uchun MySQL kengaytmasi maxsus kirish belgilaridan qochish uchun mysqli_real_escape_string() funksiyasini taqdim etadi.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Like bayonotlarida in'ektsiya

Agar foydalanuvchi "_" va "%" bilan qiymatlarni kiritsa, bu kabi so'rovlar sodir bo'ladi: foydalanuvchi dastlab "abcd_" ni so'rashni xohlagan, ammo so'rov natijalari "abcd_", "abcde" va "abcdf" ni o'z ichiga oladi. " Va hokazo; muammo foydalanuvchi "30%" ni so'rashni xohlaganida ham paydo bo'ladi (eslatma: o'ttiz foiz).

PHP skriptida biz quyidagi misoldagi kabi yuqoridagi vaziyatni hal qilish uchun addcslashes() funksiyasidan foydalanishimiz mumkin:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

addcslashes() funktsiyasi belgilangan belgidan oldin teskari chiziq qo'shadi.

Sintaksis formati:

addcslashes(string,characters)
parametrtavsif
stringMajburiy.Tekshirish uchun qatorni belgilaydi.
belgilarIxtiyoriy.addcslashes() tomonidan ta'sirlangan belgi yoki belgilar oralig'ini belgilaydi.

Umid qilamanki, Chen Veyliang blogi ( https://www.chenweiliang.com/ ) "MySQL sql in'ektsiyasini qanday oldini oladi? sql in'ektsiya printsipi va oldini olish", bu sizga yordam beradi.

Ushbu maqolaning havolasini baham ko'rish uchun xush kelibsiz:https://www.chenweiliang.com/cwl-500.html

Eng so'nggi yangiliklardan xabardor bo'lish uchun Chen Veyliang blogining Telegram kanaliga xush kelibsiz!

🔔 Birinchi bo'lib kanalning yuqori katalogida qimmatli "ChatGPT Content Marketing AI vositasidan foydalanish bo'yicha qo'llanma"ni qo'lga kiriting! 🌟
📚 Ushbu qo'llanmada katta ahamiyatga ega, 🌟Bu kamdan-kam imkoniyat, uni qo'ldan boy bermang! ⏰⌛💨
Baham ko'ring va yoqsa like!
Sizning baham ko'rish va yoqtirishlaringiz bizning doimiy motivatsiyamizdir!

 

发表 评论

Sizning elektron pochta manzilingiz e'lon qilinmaydi. 必填 项 已 用 * Yorliq

tepaga aylantiring