Yangi boshlanuvchilar uchun Php in'ektsiyalari. PHP zaifligi va PHP in'ektsiyasidan himoya
Misol
... $module = $_GET [ "module" ] ; include ($module . ".php" ) ; ... ?>
Bu skript zaif, chunki ".php" oddiygina $module o'zgaruvchisi tarkibiga qo'shiladi va fayl natijada paydo bo'lgan yo'lga biriktiriladi.
Xaker o'z veb-saytida PHP kodini o'z ichiga olgan fayl yaratishi mumkin (http://hackersite.com/inc.php) va http://mysite.com/index.php?module=http:/ kabi havola orqali saytga kirishi mumkin. /hackersite.com/inc har qanday PHP buyruqlarini bajaradi.
Himoya qilish usullari
Bunday hujumdan himoya qilishning bir necha yo'li mavjud:
- $module o'zgaruvchisida begona belgilar mavjudligini tekshiring:
... $module = $_GET [ "module" ] ; if (strpbrk ($module , ".?/:" ) ) die ("Blocked" ) ; include $module . ".php" ; ... ?>
- $ moduliga tegishli qiymatlardan biri tayinlanganligini tekshiring:
... $module = $_GET [ "module" ] ; $arr = array ("main" , "about" , "links" , "forum" ) ; if (! in_array ($module , $arr ) ) $module = $arr [ 0 ] ; include $module . ".php" ; ... ?>
Bu usul yanada samarali, chiroyli va toza.
PHP, shuningdek, masofaviy fayllardan foydalanishni o'chirish imkoniyatini beradi, bu php.ini server konfiguratsiya faylida allow_url_fopen opsiyasi qiymatini Off ga o'zgartirish orqali amalga oshiriladi.
Ta'riflangan zaiflik sayt uchun katta xavf tug'diradi va PHP skriptlari mualliflari buni unutmasliklari kerak.
Shuningdek qarang
Havolalar
Wikimedia fondi. 2010 yil.
Boshqa lug'atlarda "PHP injection" nima ekanligini ko'ring:
- ... Vikipediya
- ... Vikipediya
Bu atamaning boshqa maʼnolari ham bor, qarang: PHP (maʼnolari). PHP semantikasi: ko'p paradigma... Vikipediya
Elektron pochtani kiritish - bu to'g'ri tasdiqlanmagan foydalanuvchi kiritishidan IMAP/SMTP ifodalarini yaratish orqali pochta serverlari va pochta ilovalaridan foydalanish uchun ishlatiladigan hujum usuli. Turiga qarab... ... Vikipediya
SQL in'ektsiyasi ma'lumotlar bazalari bilan ishlaydigan veb-saytlar va dasturlarni buzishning eng keng tarqalgan usullaridan biri bo'lib, so'rovga o'zboshimchalik bilan SQLni kiritishga asoslangan, foydalaniladigan ma'lumotlar bazasi turiga va amalga oshirish shartlariga, ... ... Vikipediya.
SQL in'ektsiyasi ma'lumotlar bazalari bilan ishlaydigan veb-saytlar va dasturlarni buzishning eng keng tarqalgan usullaridan biri bo'lib, so'rovga o'zboshimchalik bilan SQLni kiritishga asoslangan, foydalaniladigan ma'lumotlar bazasi turiga va amalga oshirish shartlariga, ... ... Vikipediya.
PHP semantikasi: koʻp paradigma Bajarish turi: Kompilyatsiya tipidagi tarjimon Chiqarilgan yili: 1995 yil Muallif(lar): Rasmus Lerdorf Soʻnggi versiya: 4 ... Vikipediya
So'zning tor ma'nosida, bu ibora hozirda "Xavfsizlik tizimiga urinish" degan ma'noni anglatadi va keyingi atama, Cracker hujumi ma'nosiga ko'proq moyil. Bu "hacker" so'zining o'zi ma'nosining buzilishi tufayli sodir bo'ldi. Xaker... ...Vikipediya
Veb-dasturchilar uchun eng muhim muammolardan biri bu PHP skriptlarining xavfsizligi. Barcha dasturchilar, u yoki bu darajada, o'z loyihalarini himoya qilish uchun turli usullardan foydalanadilar, ammo, afsuski, ko'p hollarda, bir nechta zaifliklardan himoyalanish qo'llaniladi, boshqa muammoli joylar esa hisobga olinmaydi.
Ushbu maqolada PHP zaifliklarining asosiy turlari keltirilgan va ulardan himoyalanish yo‘llari ko‘rib chiqiladi.
PHP zaifliklarining turlari
- Foydalanuvchiga xatolarni ko'rsatish
Ma'nosi: agar kodda xatolik bo'lsa, foydalanuvchiga sodir bo'lgan xato haqida ma'lumot ko'rsatiladi. Bu muhim zaiflik emas, lekin bu tajovuzkorga server tuzilishi va ishlashi haqida qo'shimcha ma'lumot olish imkonini berishi mumkin. - Foydalanuvchi uchun tizim xususiyatlari to'g'risidagi ma'lumotlarning mavjudligi
Ma'nosi: Foydalanuvchi tizim haqida tushuncha beradigan ma'lumotlarga kirishi mumkin. Bu muhim zaiflik emas, lekin bu tajovuzkorga server tuzilishi va ishlashi haqida qo'shimcha ma'lumot olish imkonini berishi mumkin. Ushbu zaiflikning sababi dasturchining xatolari va "nazoratlari". Masalan, umumiy mulkda bir xil nomdagi funksiyaga ega phpinfo.php faylining mavjudligi. - Foydalanuvchiga dastur kodi haqidagi ma'lumotlarning mavjudligi
Ma'nosi: foydalanuvchi php dan boshqa kengaytmaga ega bo'lgan modullarning dastur kodlariga kirishi mumkin. Bu juda muhim zaiflikdir, chunki u tajovuzkorga server tuzilishi va ishlashi haqida etarlicha to'liq ma'lumot olish va uning zaif tomonlarini aniqlash imkonini beradi. - Ma'muriy sahifalarga kirish uchun oddiy parollar
Ma'nosi: tajovuzkor ma'muriy sahifa uchun oddiy parolni taxmin qilishi mumkin, bu unga xakerlik qilish uchun ko'proq imkoniyatlar beradi. Bu juda muhim zaiflik, chunki u tajovuzkorga server ishiga ta'sir qilish imkonini beradi. - Global o'zgaruvchilarni o'rnatish qobiliyati
Ma'nosi: PHP sozlamalari noto'g'ri bo'lsa, so'rovlar qatori orqali global skript o'zgaruvchilarini o'rnatish mumkin. Bu juda muhim zaiflik, chunki tajovuzkor skriptning rivojlanishiga uning foydasiga ta'sir qilishi mumkin. - PHP in'ektsiyasi
Ma'nosi: uchinchi tomon dastur kodiga havola yoki kodning o'zi PHP fayllar yoki dastur kodi bilan qanday ishlashini aniqlaydigan parametrga uzatiladi. Bu juda muhim zaiflik, chunki tajovuzkor o'z skriptlarini serverda bajarishi mumkin. Kodning bajarilishi quyidagi funksiyalar yordamida amalga oshiriladi: eval(), preg_replace(), require_once(), include_once(), include(), require(), create_function(), readfile(), dir(), fopen(). - Fayl yuklash orqali PHP in'ektsiyasi
Ma'nosi: agar global o'zgaruvchilarni o'rnatish mumkin bo'lsa, serverga yuklangan faylni belgilaydigan parametrga uchinchi tomon dastur kodiga yoki serverdagi maxfiy faylga havola uzatiladi. Bu juda muhim zaiflik, chunki tajovuzkor serverda skriptlarni bajarishi yoki maxfiy ma'lumotlarga kirish huquqiga ega bo'lishi mumkin. Ushbu zaiflik faqat global o'zgaruvchilarni o'rnatish va faylni yuklash mexanizmining noto'g'ri tashkil etilishi mumkin bo'lganda mumkin. - elektron pochta yuborish
Ma'nosi: uchinchi tomon dastur kodiga havola yoki kodning o'zi PHP elektron pochta xabarlari bilan qanday ishlashini aniqlaydigan parametrga uzatiladi. Bu juda muhim zaiflik, chunki tajovuzkor o'z skriptlarini serverda bajarishi yoki foydalanuvchi tomonidan saqlangan ma'lumotlarga kirish huquqiga ega bo'lishi mumkin. - SQL in'ektsiyasi
Ma'nosi: SQL so'rovini belgilaydigan parametr shaxsiy ma'lumotlarga kirish uchun so'rovni tashkil etuvchi ma'lumotlarni o'z ichiga oladi. Bu juda muhim zaiflik, chunki tajovuzkor ma'lumotlar bazasida saqlangan maxfiy ma'lumotlarni olishi mumkin. So‘rovni o‘zgartirish uchun tajovuzkor quyidagi konstruksiyalardan foydalanishi mumkin: SELECT, UNION, UPDATE, INSERT, OR, AND. - Saytlararo skript yoki XSS
Ma'nosi: uchinchi tomon dastur kodi foydalanuvchiga ko'rsatiladigan ma'lumotlarni aniqlaydigan parametrga uzatiladi. Bu juda muhim zaiflik, chunki tajovuzkor mijozning brauzerida saqlangan maxfiy ma'lumotlarni olishi mumkin. Buzg'unchi so'rovni o'zgartirish uchun HTML teglaridan foydalanadi.
PHP da xavfsiz kod yozish qoidalari
- Bloklash xatosi chiqishi
Buning uchun dastur kodida error_reporting(0) ni o‘rnating yoki .htaccess fayliga php_flag error_reporting 0 qatorini qo‘shing. - Ma'muriy sahifalarga kirish uchun murakkab parollardan foydalanish
Buning uchun semantik ma'noga ega bo'lmagan ko'p qiymatli parollardan foydalanish kifoya (masalan, K7O0iV98dq). - Muhim foydalanuvchi harakatlarini qayd qilish
To'g'ridan-to'g'ri himoyani ta'minlamaydi, lekin xakerlarni aniqlash va ular foydalangan zaifliklarni aniqlash imkonini beradi. Buning uchun foydalanuvchining harakatlari va u tomonidan uzatiladigan tizim ishlashining muhim daqiqalariga tegishli ma'lumotlar oddiy matn faylida qayd etilishi uchun etarli.
Ro'yxatga olish funktsiyasi va uning ishlashiga misol:
funktsiya writelog($typelog, $log_text) (
$log = fopen("logs/".$typelog.".txt","a+");
fwrite($log, "$log_matn\r\n");
fclose($log);
}
writelog("avtorizatsiya", sana("y.m.d H:m:s")."\t".$_SERVER["REMOTE_ADDR"]."\tKirish muvaffaqiyatli"); - Sayt modullariga kirishni yopish
Ularning mazmunini ko'rish yoki bajarishga urinishlardan himoya qiladi. Buning uchun FilesMatch va Files konstruksiyalari yordamida .htaccess faylidagi modul fayllariga kirishni sozlash kifoya.
Masalan, biz capcha.php faylidan tashqari php kengaytmali barcha modullarga kirishni bloklaymiz: - Global o'zgaruvchilarni o'rnatish imkoniyatini o'chirish
Buning uchun server sozlamalarida register_globals = off; ni o'rnatish kifoya. yoki .htaccess faylida php_flag register_globals off qatorini qo'shing. ini_set dan foydalanish("register_globals",0); Skript ishga tushishidan oldin o'zgaruvchilarni o'rnatish bilan muammo hal etilmaydi. - O'chirilgan fayllardan foydalanish imkoniyatini o'chirish
Buning uchun server sozlamalarida allow_url_fopen = off ni o'rnatish kifoya. . Bu PHP in'ektsiyasidan qisman himoyani ta'minlaydi, ammo to'liq emas, chunki tajovuzkor dastur kodi bo'lgan faylga havolani emas, balki dastur kodini o'zi yuborishi mumkin. PHP in'ektsiyasidan to'liq himoya qilish uchun siz qo'shimcha ravishda kiruvchi ma'lumotlarni filtrlashdan foydalanishingiz kerak. Ba'zan ushbu himoya chorasini loyihaning tabiati tufayli ishlatib bo'lmaydi (siz masofaviy fayllarga kirishingiz kerak). - Kiruvchi ma'lumotlarni filtrlash
Ko'pgina zaifliklardan himoya qiladi. Universal yechim yo'q. Belgilarning "oq" ro'yxatiga qarshi chekni taqiqlangan so'zlarni tekshirish bilan birgalikda ishlatish tavsiya etiladi. "Oq" - ruxsat etilgan belgilar ro'yxati. Ushbu ro'yxatga xavfli belgilar kiritilmasligi kerak, masalan. Taqiqlangan so'zlarga quyidagilar kiradi: skript, http, SELECT, UNION, UPDATE, exe, exec, INSERT, tmp, shuningdek, html teglari.
Kiruvchi ma'lumotlarni filtrlash misoli:
// Oq ro'yxatga qarshi tekshiring. Faqat rus va lotin harflari, raqamlar va belgilarga ruxsat beriladi _-
agar (preg_match("/[^(\w)|(A-Yaa-ya-)|(\s)]/",$matn)) (
$matn = "";
}
// Xavfli so'zlarni filtrlash
agar (preg_match("/script|http|||SELECT|UNION|UPDATE|exe|exec|INSERT|tmp/i",$matn)) (
$matn = "";
} - HTTP POST yordamida fayl yuklanishi tekshirilmoqda
Fayllarni yuklash orqali PHP in'ektsiyasidan himoya qiladi. Bunga ishonch hosil qilish uchun serverga yuklangan fayllar is_uploaded_file() funksiyasi bilan tekshirilishi yoki move_uploaded_file() funksiyasi bilan koʻchirilishi kerak. Agar global o'zgaruvchilarni o'rnatish imkoniyati o'chirilgan bo'lsa, ushbu turdagi himoyadan foydalanib bo'lmaydi. - Ma'lumotlar bazasiga uzatilgan ma'lumotlardagi tirnoq belgilaridan qochish
SQL in'ektsiyasidan himoya qiladi. Eng maqbul usul mysql_real_escape_string() funksiyasidan foydalangan holda barcha kiruvchi noraqamli ma'lumotlarni qayta ishlashdir. Shuningdek, siz kiruvchi ma'lumotlarni avtomatik tekshirishdan foydalanishingiz mumkin. Buni amalga oshirish uchun .htaccess fayliga php_value magic_quotes_gpc qatorini qo'shing, lekin bu usul ishonchli emas, chunki bu ikki marta qochishga olib kelishi mumkin.
mysql_real_escape_string() funksiyasidan foydalanib tirnoqlardan qochishga misol:
agar (!is_numeric($matn)) (
$textrequest = mysql_real_escape_string($matn);
} - Chiqarishdan oldin maxsus belgilarni html ob'ektlariga aylantirish
XSS dan himoya qiladi. Buning uchun foydalanuvchi kiritgan, unda keraksiz html teglari boʻlishi mumkin boʻlgan maʼlumotlar htmlspecialchars() funksiyasi yordamida chiqishda oddiygina qayta ishlanadi. Agar kiruvchi ma'lumotlarni filtrlash xavfli HTML teglarini yo'q qilsa, ushbu turdagi himoyadan foydalanish mumkin emas.
Ko'rib turganingizdek, puxta o'ylangan skript xavfsizligi tizimini yaratish ko'rinadigan darajada ko'p vaqt talab qilmaydi.
Ushbu maqola skript xavfsizligi bo'yicha darslik bo'lish uchun mo'ljallanmagan, ammo umid qilamanki, u PHP dasturchilarini yanada puxta o'ylangan xavfsizlik usullaridan foydalanishga undaydi.
Muvaffaqiyatli hujumni amalga oshirish uchun tajovuzkor hech bo'lmaganda ma'lumotlar bazasi tuzilishi haqida ma'lumotga ega bo'lishi kerakligi aniq bo'lsa-da, bu ma'lumotni olish ko'pincha juda oddiy. Misol uchun, agar ma'lumotlar bazasi ochiq manbali yoki standart o'rnatishga ega bo'lgan boshqa umumiy foydalanish mumkin bo'lgan dasturiy ta'minot paketining bir qismi bo'lsa, bu ma'lumotlar butunlay ochiq va foydalanish mumkin. Ushbu ma'lumotlarni yopiq loyihadan, hatto kodlangan, murakkab yoki kompilyatsiya qilingan bo'lsa ham, hatto xato xabarlarini ko'rsatish orqali shaxsiy kodingizdan ham olish mumkin. Boshqa usullarga umumiy (taxmin qilish oson) jadval va ustun nomlaridan foydalanish kiradi. Masalan, "ID", "foydalanuvchi nomi" va "parol" ustun nomlari bilan "foydalanuvchilar" jadvalidan foydalanadigan kirish shakli.
Ko'pgina muvaffaqiyatli hujumlar tegishli xavfsizlik talablarisiz yozilgan kodga asoslangan. Hech qanday ma'lumotga ishonmang, ayniqsa u mijozdan kelgan bo'lsa, hatto formadagi ro'yxatlar, yashirin maydonlar yoki cookie fayllari. Berilgan birinchi misol bunday so'rovlar qanday qilib falokatga olib kelishi mumkinligini ko'rsatadi.
- Hech qachon ma'lumotlar bazasi egasi yoki superuser hisobi yordamida ma'lumotlar bazasiga ulamang. Har doim eng cheklangan huquqlarga ega maxsus yaratilgan foydalanuvchilardan foydalanishga harakat qiling.
- bog'langan o'zgaruvchilar bilan tayyorlangan ifodalardan foydalaning. Bu imkoniyat PDO kengaytmalari, MySQLi va boshqa kutubxonalar tomonidan taqdim etiladi.
- Har doim siz kiritgan ma'lumotlar kutilgan turdagi ekanligini tekshiring. PHP ma'lumotlarni tekshirish uchun turli funktsiyalarga ega, ular o'zgaruvchilar bilan ishlash uchun oddiy funktsiyalardan tortib, belgilar turini aniqlash funktsiyalarigacha (masalan, is_numeric() Va ctype_digit() mos ravishda) va Perl-mos keladigan muntazam iboralar bilan tugaydi.
- Agar bog'langan o'zgaruvchilar ma'lumotlar bazasi darajasida qo'llab-quvvatlanmasa, siz foydalanayotgan ma'lumotlar bazasiga xos bo'lgan maxsus qochish funktsiyalaridan foydalangan holda ma'lumotlar bazasi so'rovlarida ishlatiladigan har qanday noaniq ma'lumotlardan har doim qochib qutuling (masalan, mysql_real_escape_string(), sqlite_escape_string() va hokazo.). kabi umumiy xususiyatlar qo'shimcha chiziqlar() faqat ma'lum holatlarda foydalidir (masalan, NO_BACKSLASH_ESCAPES o'chirilgan bir baytli kodlashda MySQL), shuning uchun ulardan foydalanishdan qochish yaxshidir.
- Hech qanday holatda ma'lumotlar bazasi haqida, ayniqsa uning tuzilishi haqida hech qanday ma'lumot ko'rsatilmaydi. Shuningdek, hujjatlarning tegishli bo'limlarini o'qing: "Xato xabarlari" va "Xatolarni qayta ishlash va ro'yxatga olish funktsiyalari".
- Foydalanuvchilarga ma'lumotlar va ko'rinishlarga to'g'ridan-to'g'ri kirish huquqini bermasdan ma'lumotlar bilan ishlash uchun saqlangan protseduralar va oldindan belgilangan kursorlardan foydalanishingiz mumkin, ammo bu yechimning o'ziga xos qiyinchiliklari bor.
Agar ilova raqamli kiritishni kutsa, funksiyadan foydalaning ctype_digit() kiritilgan ma'lumotlarni tekshirish uchun, yoki yordamida uning turini belgilash majbur settype(), yoki oddiygina funktsiyadan foydalanib, raqamli ko'rinishdan foydalaning sprintf().
5-misol Sahifalash navigatsiyasini xavfsizroq amalga oshirish
settype ($offset, "integer");
$so'rov = “TANLASH identifikatori, mahsulotlardan ism TARTIB OLISH BY NOMI LIMIT 20 OFSET$ofset;" ;
// %d formatiga e'tibor bering, %s dan foydalanish befoyda
$query = sprintf ( "Tanlash identifikatori, mahsulotlar FROM nomi TARTIB BY NOMI LIMIT 20 OFFSET %d;",
$ofset);
?>
Yuqorida aytilganlarning barchasiga qo'shimcha ravishda, agar u qo'llab-quvvatlasa, so'rovlarni skriptingizda yoki ma'lumotlar bazasi darajasida qayd etishingiz mumkin. Shubhasiz, ro'yxatga olish zararni oldini olmaydi, lekin u buzilgan dasturni kuzatishda yordam beradi. Jurnal fayli o'zida emas, balki uning tarkibidagi ma'lumotlarda foydalidir. Bundan tashqari, ko'p hollarda barcha mumkin bo'lgan tafsilotlarni qayd etish foydali bo'ladi.