Bu wikiHow sizga PHP -da tayyorlangan bayonotlar yordamida SQL in'ektsiyasini oldini olishni o'rgatadi. SQL in'ektsiyasi bugungi kunda veb -ilovalarning eng keng tarqalgan zaifliklaridan biridir. Tayyorlangan bayonotlar majburiy parametrlardan foydalanadi va o'zgaruvchilarni SQL satrlari bilan birlashtirmaydi, bu esa tajovuzkorga SQL bayonotini o'zgartirish imkoniyatini bermaydi.
Tayyorlangan bayonotlar o'zgaruvchini SQL tuzilishi bilan birlashtiradi, shuning uchun SQL va o'zgaruvchilar alohida yuboriladi. Keyin o'zgaruvchilar SQL satrining bir qismi emas, oddiy satrlar sifatida talqin qilinadi. Quyidagi qadamlardagi usullardan foydalangan holda, boshqa SQL in'ektsion filtrlash usullarini ishlatishning hojati yo'q, masalan mysql_real_escape_string ().
Qadamlar
2 -qismning 1 -qismi: SQL in'ektsiyasini tushunish
Qadam 1. SQL in'ektsiyasi - bu SQL ma'lumotlar bazasidan foydalanadigan ilovalardagi zaiflik turi
Xavfsizlik SQL bayonotida foydalanuvchi kiritganidan keyin paydo bo'ladi:
$ nomi = $ _GET ['foydalanuvchi nomi']; $ query = "Parolni FROM dan tanlang tbl_user WHERE name = '$ name'";
Qadam 2. Foydalanuvchining URL o'zgaruvchisiga foydalanuvchi qiymati kiritiladi $ name o'zgaruvchisiga
Keyin u to'g'ridan -to'g'ri SQL bayonotiga joylashtiriladi, bu esa foydalanuvchiga SQL bayonotini tahrir qilish imkonini beradi.
$ name = "admin 'OR 1 = 1 -"; $ query = "Parolni FROM dan tanlang tbl_user WHERE name = '$ name'";
Qadam 3. SQL ma'lumotlar bazasi SQL bayonotini quyidagicha oladi:
Parolni tanlang tbl_users WHERE name = 'admin' OR 1 = 1 - '
-
Bu haqiqiy SQL, lekin foydalanuvchi uchun bitta parolni qaytarish o'rniga, tbl_user jadvalidagi barcha parollar qaytariladi. Bu sizning veb -ilovalaringizda xohlagan narsangiz emas.
2dan 2 qism: Tayyorlangan bayonotlar yaratish uchun mySQLi -dan foydalanish
Qadam 1. mySQLi SELECT so'rovini yarating
MySQLi tayyorlangan bayonotlar yordamida jadval ma'lumotlarini tanlash uchun quyidagi koddan foydalaning.
$ nomi = $ _GET ['foydalanuvchi nomi']; if ($ stmt = $ mysqli-> tayyorgarlik $ stmt-> bind_param ("s", $ nomi); // Fikrni bajaring. $ stmt-> execute (); // O'zgaruvchilarni so'rovdan oling. $ stmt-> bind_result ($ pass); // Ma'lumotlarni oling. $ stmt-> olish (); // Ma'lumotlarni ko'rsatish. printf (" %s foydalanuvchisi uchun parol - %s / n", $ nomi, $ pass); // Tayyorlangan bayonotni yoping. $ stmt-> yopish (); }
Eslatma: $ mysqli o'zgaruvchisi mySQLi ulanish ob'ekti
2 -qadam. MySQLi INSERT so'rovini yarating
MySQLi Tayyorlangan bayonotlar yordamida jadvalga ma'lumotlarni kiritish uchun quyidagi koddan foydalaning.
$ nomi = $ _GET ['foydalanuvchi nomi']; $ parol = $ _GET ['parol']; if ($ stmt = $ mysqli-> tayyorgarlik ("INSERT INTO tbl_users (ism, parol) VALUES (?,?)"))) // parametrlarni parametr sifatida bog'lang. $ stmt-> bind_param ("ss", $ nomi, $ parol); // Fikrni bajaring. $ stmt-> execute (); // Tayyorlangan bayonotni yoping. $ stmt-> yopish (); }
Eslatma: $ mysqli o'zgaruvchisi mySQLi ulanish ob'ekti
3 -qadam. MySQLi UPDATE so'rovini yarating
MySQLi tayyorlangan bayonotlar yordamida jadvaldagi ma'lumotlarni yangilash uchun quyidagi koddan foydalaning.
$ nomi = $ _GET ['foydalanuvchi nomi']; $ parol = $ _GET ['parol']; if ($ stmt = $ mysqli-> tayyorgarlik ("UPDATE tbl_users SET password =? WHERE name =?")) {// O'zgaruvchilarni parametrlar qatoriga bog'lang. $ stmt-> bind_param ("ss", $ parol, $ nomi); // Fikrni bajaring. $ stmt-> execute (); // Tayyorlangan bayonotni yoping. $ stmt-> yopish (); }
Eslatma: $ mysqli o'zgaruvchisi mySQLi ulanish ob'ekti
Qadam 4. mySQLi DELETE so'rovini yarating
Quyidagi skriptda mySQLi tayyorlangan bayonotlar yordamida jadvaldagi ma'lumotlarni qanday o'chirish kerakligi ko'rsatilgan.
$ nomi = $ _GET ['foydalanuvchi nomi']; $ parol = $ _GET ['parol']; if ($ stmt = $ mysqli-> tayyorlash ("tbl_users WHERE nomidan o'chirish =?")) {// O'zgaruvchini parametrga qator sifatida bog'lang. $ stmt-> bind_param ("s", $ nomi); // Fikrni bajaring. $ stmt-> execute (); // Tayyorlangan bayonotni yoping. $ stmt-> yopish (); }