Beans html модули php име. Jdoc:include - метод за показване на съдържание на страницата

Chrome е окончателната обработка на html кода на модула преди вмъкването му в основния шаблон на сайта. Има няколко предварително дефинирани стила на Chrome (table, horz, xhtml, rounded, outline), но това, което е налично, не винаги е подходящо за решаване на текущи проблеми.

За да определите свой собствен стил на показване в шаблона, трябва да създадете файл "modules.php" в директорията "html". Тоест, за шаблон с име "my_template" файлът трябва да се намира тук - "templates/my_template/html/modules.php".

В този файл трябва да дефинирате функция, наречена "modChrome_STYLE", където STYLE е името на вашия стил. Тази функция ще приеме три аргумента - $module, &$params и &$attribs, както е показано по-долу:

функция modChrome_STYLE ($module, &$params, &$attribs) ( /* обработка и извеждане на html код на модул */ )

В тази функция можете да използвате всеки PHP код, като също така ще имате достъп до всички параметри на самия модул, неговите свойства и всички данни, записани в базата данни на Joomla. По принцип ви трябва само следното

  • $module->content - съдържанието на самия модул, директният html код.
  • $module->title - името на модула, указано в контролния панел в мениджъра на модули.
  • $module->showtitle - флаг дали да се покаже заглавието или не (true или false).

Функцията modChrome_STYLE е обикновена PHP функция; тук можете да използвате абсолютно всеки PHP код. По-долу е даден пример, ако показването на заглавката е активирано в настройките на модула, тогава текстът на заглавката ще се показва преди съдържанието на модула.

функция modChrome_STYLE ($module, &$params, &$attribs) ( if ($module->showtitle) ( echo "

" .$module->title ."

"; ) echo $module->content; )

Има възможност за достъп до всякакви параметри на модула. Например, нека рамкираме модула с класа

">

Можете също да добавите свои собствени атрибути, които се използват в Chrome, към кода на позицията. За да направите това, в тага позиция добавете свои собствени атрибути. Имената на допълнителни атрибути могат да бъдат зададени произволно; всички те ще бъдат прехвърлени в асоциативния масив $attribs.

Практически пример за функция на Chrome:

функция modChrome_custom($module, $params, $attribs) ( if (isset($attribs["headerLevel"])) ( $headerLevel = $attribs["headerLevel"]; ) else ( $headerLevel = 3; ) if (isset ($attribs["background"])) ( $background = $attribs["background"]; ) else ( $background = "blue"; ) ехо "

"; if ($module->showtitle) ( echo " " .$module->title .""; ) ехо "
"; echo $module->content; echo "
"; ехо"
"; }

Практически примери за използване на функцията "modChrome_custom".

Едно от страхотните неща на PHP е начинът, по който работи с HTML формуляри. Основното нещо тук е, че всеки елемент от формата автоматично става достъпен за вашите PHP програми. За подробна информация относно използването на формуляри в PHP прочетете раздела. Ето примерен HTML формуляр:

Пример #1 Най-простият HTML формуляр

Твоето име:

Твоята възраст:

Няма нищо особено в тази форма. Това е обикновен HTML формуляр без специални тагове. Когато потребителят попълни формуляра и щракне върху бутона за изпращане, ще бъде извикана страницата action.php. Този файл може да има нещо като:

Пример #2 Показване на данни от формуляр

Здравейте, .
За тебгодини.

Примерен резултат от тази програма:

Здравей, Сергей. Вие сте на 30 години.

Ако не вземете предвид парчетата код с htmlspecialchars()И (int), принципът на работа на този код трябва да е прост и разбираем. htmlspecialchars()Гарантира, че „специалните“ HTML символи са правилно кодирани, така че злонамерен HTML или Javascript да не се вмъкнат във вашата страница. Полето за възраст, за което знаем, че трябва да е число, можем просто да го конвертираме цяло число, което автоматично ще се отърве от нежеланите знаци. PHP също може да направи това автоматично с помощта на разширението за филтър. Променливите $_POST["name"] и $_POST["age"] се задават автоматично за вас от PHP. Преди използвахме суперглобалната променлива $_SERVER, но тук също използваме суперглобалната променлива $_POST, която съдържа всички POST данни. забележи това метод на изпращане(метод) на нашата форма е POST. Ако използвахме метода ВЗЕМЕТЕ, тогава нашата информация за формата ще бъде в суперглобалната променлива $_GET. Като алтернатива можете да използвате променливата $_REQUEST, ако източникът на данни няма значение. Тази променлива съдържа смес от данни GET, POST, COOKIE.

преди 15 години

Съгласно HTTP спецификацията, трябва да използвате метода POST, когато използвате формуляра, за да промените състоянието на нещо в края на сървъра. Например, ако дадена страница има формуляр, който позволява на потребителите да добавят свои собствени коментари, като този страница тук, формулярът трябва да използва POST Ако щракнете върху „Презареди“ или „Refresh“ на страница, до която сте стигнали чрез POST, това почти винаги е грешка -- не трябва да публикувате един и същ коментар два пъти -- поради което тези страници не са маркирани или кеширани.

Трябва да използвате метода GET, когато вашият формуляр извлича нещо от сървъра и всъщност не променя нищо. Например формулярът за търсачка трябва да използва GET, тъй като търсенето в уеб сайт не трябва да променя нищо, от което клиентът може да се интересува, а маркирането или кеширането на резултатите от заявка в търсачката е също толкова полезно, колкото маркирането или кеширането статична HTML страница.

Преди 2 години

Струва си да се изясни:

POST не е по-сигурен от GET.

Причините за избора на GET срещу POST включват различни фактори като намерението на заявката („изпращате“ ли информация?), размера на заявката (има ограничения за дължината на URL адреса и GET параметрите се изпращат URL-а) и колко лесно искате действието да може да се споделя -- Например, търсенията в Google са GET, защото улесняват копирането и споделянето на заявката за търсене с някой друг просто чрез споделяне на URL адреса.

Сигурността тук е само съображение поради факта, че GET е по-лесен за споделяне от POST. Пример: не искате парола да бъде изпратена от GET, защото потребителят може да сподели получения URL адрес и по невнимание да разкрие паролата си.

Въпреки това, GET и POST са еднакво лесни за прихващане от добре позициониран злонамерен човек, ако не внедрите TLS/SSL, за да защитите самата мрежова връзка.

Всички формуляри, изпратени през HTTP (обикновено порт 80), са несигурни и днес (2017 г.) няма много основателни причини публичен уебсайт да не използва HTTPS (което всъщност е HTTP + сигурност на транспортния слой).

Като бонус, ако използвате TLS, вие минимизирате риска вашите потребители да получат код (ADs), инжектиран във вашия трафик, който не е поставен там от вас.

Елементът em представлява пасаж от текст с ударение. Можете да го използвате, за да привлечете вниманието на читателя към значението на изречение или абзац. Ще ви кажа какво означава това след , което описва елемента em.

Таблица 8-6: em елемент
Фигура 8-3:Използване на елемента em

В този пример поставям ударение върху I (I) в началото на изречението. Ако мислим за елемента em, когато изричаме изречение на глас, ние имаме предвид факта, че изречението е отговор на въпрос. Например, представете си, че попитах: „Кой обича ябълки и портокали?“ Вашият отговор ще бъде: „Обичам ябълки и портокали.“ (Когато го кажете на глас и поставите ударението върху I, вие ясно показвате, че сте човек, който харесва тези плодове).

Но ако попитах: „Харесвате ли ябълки и какво друго?“ Можете да отговорите: „Обичам ябълки и портокали.“ В този случай акцентът ще бъде върху последната дума, като се подчертава, че портокалите са друг плод, който харесвате. Тази опция в HTML би изглеждала така:

Харесвам ябълки и портокали .

Определение на чужди думи и технически термини

Елементът i обозначава част от текст, която е от различно естество от околното съдържание. Това е доста неясно определение, но често срещаните примери включват думи от други езици, технически или научни термини и дори човешки мисли (за разлика от речта). Елементът i е описан.

Таблица 8-7:Елемент i
Фигура 8-5:Използване на елемента s

Идентифициране на важен текст

Силният елемент обозначава пасаж от текст, който е важен. Този елемент е описан в.

Таблица 8-9:Силен елемент
Фигура 8-7:Използване на елемента u

Добавяне на малък шрифт

Малкият елемент означава дребен шрифт и често се използва за уточнения и пояснения. B представлява малкия елемент.

Таблица 8-11:Малък елемент
Фигура 8-8:Използване на малкия елемент

Добавяне на горен и долен индекс

Можете да използвате елементите sub и sup, за да обозначите съответно горен и долен индекс. Горните индекси се използват за писане на думи в някои езици, а горният и долният индекс се използват в прости математически изрази. Тези елементи са представени в.

Таблица 8-12: Sub и sup елементи
Фигура 8-9:Използване на елементите sub и sup

Това е често срещана уязвимост на PHP-включващия клас. Но човекът, за когото направих одита, ми каза, че тази уязвимост не може да се използва, така че не се брои. Трябваше да споря с него

Какво е PHP-include

Нека проведем малка образователна програма за тази уязвимост. PHP-include е уязвимост, която ви позволява да „включите“ произволен файл, например този код:

$module=$_REQUEST["module"]; включват ("модули/".$модул);

И тъй като обикновено няма PHP тагове във файла „/etc/passwd“ (), тогава ще се покаже в браузъра, точно както html кодът ще се покаже зад php таговете в обикновен php скрипт. Разбира се, четенето на файлове е само една от възможните реализации на тази атака. Основното е включването на необходимите файлове с необходимия PHP код.

Да се ​​върнем към примера. Нека го усложним:

$module=$_REQUEST["module"]; include("modules/".$module."/module.class.php");

$module = $_REQUEST [ "module" ] ;

включване ("modules/". $module. "/module.class.php" ) ;

Както можете да видите, сега към нашата променлива е добавен ред в края, което ни пречи да включим какъвто и да е файл. Така че много PHP функции не са двоично безопасни, т.е. такива функции считат NULL байт за край на низ. Осъществяваме достъп до скрипта по следния начин:

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

И ако директивата magic_quotes е деактивирана, тогава отново ще видим съдържанието на /etc/passwd

Има ли уязвимост?

Да се ​​върнем към нашия код:

$module=добавя наклонени черти($_REQUEST["module"]); include("modules/".$module."/module.class.php");

$module = добавя наклонени черти ($_REQUEST [ "module" ] );

включване ("modules/". $module. "/module.class.php" ) ;

Както можете да видите, нашата променлива е принудена да премине през „addslashes“ и ако се опитаме да използваме NULL байт, той ще бъде преобразуван в „\0“ и включването няма да работи.

Но прогресът не стои неподвижен! Оказва се, че някои момчета от USH откриха интересна функция в PHP: PHP вектори за атака на файловата система. За да обобщим накратко същността на статията, php обработва пътища, използвайки няколко функции:

  • Отрязване на пътя- php съкращава низа на пътя до определената дължина MAXPATHLEN (На Windows до 270 знака, на NIX - обикновено 4096, на BSD - обикновено 1024)
  • Нормализация на пътя— php обработва пътя по специален начин, като премахва допълнителните знаци „/“ и „/“. и различните им комбинации
  • Редукция до канонична форма— премахват се ненужните преходи, например „dir1/dir2/../dir3“ се преобразува в „dir1/dir3/“, докато съществуването на директорията „dir2“ не се проверява, и други подобни трансформации (т.е. продължаване на нормализацията )

Сега, по ред, какво се случва с изминатия път:

  1. Ако пътят е относителен, първо се заместват стойностите от директивата include_path
  2. След това пътеката се подрязва до определена дължина в зависимост от платформата
  3. Пътеката се нормализира
  4. Пътят е сведен до канонична форма

Сега нека се опитаме да използваме това. Нека се опитаме да включим определен файл “test.php”, който се намира в директорията “modules/”. За да направите това, добавете символа “/.” в края. така че общата дължина, заедно с името на файла и стойността от include_path, очевидно е по-голяма от 4096 знака.
script.php?module=test.php/././.[...]/././.

В този случай трябва да познаете, така че целият низ на пътя (вече подрязан) да завършва с точка (важно!), а не с наклонена черта. За да направите това, можете да добавите една наклонена черта по следния начин:

И една от тези опции определено ще работи.

Анализирам

Нека да разгледаме по ред какви трансформации ще се случат с пътя
modules/test.php//././.[...]/./././module.class.php
4200 знака

Първото нещо, което се случва с реда е, че стойността от include_path се добавя към него:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 знака

След това низът се съкращава до MAXPATHLEN (да кажем 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 знака

Тук можете да видите защо е необходимо да добавите още една наклонена черта (в противен случай линията щеше да бъде отрязана до наклонената черта). Сега този ред е нормализиран, като първо се премахват допълнителните наклонени черти:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 знака

В резултат на това получаваме правилния път до файла, от който се нуждаем, и този път вече ще бъде прехвърлен към включването и файлът, от който се нуждаем, ще бъде включен.

Това е начинът, по който ще включим успешно нашия файл „test.php“.
script.php?module=test.php//././.[...]/././.

Това означава, че уязвимостта не е теоретична. В резултат на това клиентът ми загуби залога, а аз спечелих залога и 10-те рубли, на които заложихме. Разбира се, освен 10 рубли, спечелих и доверие и уважение в очите на клиента, което също е важно.

Бележки

Тук ще разгледам няколко интересни характеристики на използването на тази уязвимост.

Изход от директорията

Помислете за този код:

) ;

Нека пропуснем точката, че можете да използвате RFI и да вмъкнете файл от отдалечен сървър. Да кажем „allow_url_include=OFF“ на сървъра.

Нека разгледаме ситуация, когато трябва да включим файл от директорията по-долу:
script.php?module=../test.php/././.[...]/././.

Такава заявка ще генерира грешка като файлът не е намерен. И за да заобиколим това, трябва да го наречем така:
script.php?module=blabla/../../test.php/././.[...]/././.

Не напразно описах канонизирането на пътищата. Благодарение на него директорията „blabla“ не трябва да съществува.

Добавяне на прости наклонени черти

Внимателен читател вероятно е забелязал, че в описанието на нормализацията съм написал, че допълнителните наклонени черти „/“ и точките с наклонени черти „/“ са премахнати, така че защо просто да не използвате наклонени черти, за да избегнете ненужна караница с точката, завършваща в края.

Всичко е свързано с алгоритмите, тоест наклонена черта с точка “/.” се премахва напълно. Но с обикновените наклонени черти ситуацията е малко по-сложна по време на нормализиране, всеки две наклонени черти се заменят с една, докато остане само една (!) наклонена черта, например:

/home/site/public_html/modules/test.php/////////////////////
57 знака

/home/site/public_html/modules/test.php/////////
48 знака

/home/site/public_html/modules/test.php/////
44 знака

/home/site/public_html/modules/test.php///
42 знака

/home/site/public_html/modules/test.php//
41 знака

/home/site/public_html/modules/test.php/
40 знака

Малко отклонение:

Освен това, ако обърнете внимание на много популярни ресурси за хакване, ще забележите тази грешка. Доколкото разбирам, тази грешка започна със статия от определен Raz0r, където той предложи вектор:
index.php?act=../../../../../etc/passwd/////[…]/////

И обърнете внимание дори на списанието [акер повтори тази грешка в статията си. Освен това, дори в оригиналната статия на USH беше ясно написано, че не е препоръчително да се използват само наклонени черти, а е необходимо да се остави знак точка в края преди нормализиране. Но простите наклонени черти (дори без точка в края) работят само в PHP със Suhosin.

Тоест, използвайте наклонена черта с точка "/." - по-универсален метод, тъй като, за разлика от наклонените черти “/”, работи за всички версии на php.

Заключение

Надявам се, че тази статия ще ви помогне да разберете, че не трябва да оставяте дори най-малките уязвимости в скриптовете си, тъй като рано или късно можете да разработите свой собствен вектор на атака за тях, което може да доведе до сериозни последствия.



Свързани публикации