Beans html moduly php meno. Jdoc:include - metóda pre zobrazenie obsahu na stránke. Pridanie jednoduchých lomítok
V krátkosti sme sa dotkli témy metód zobrazovania obsahu v tele šablóny. Poďme sa teraz bližšie pozrieť na to, čo to je a s čím sa to jedáva. Takže deklarácie metód jdoc sú prítomné v každej šablóne Joomla a zobraziť tú alebo onú informáciu v tele šablóny (to znamená na stránke lokality). Vo všeobecnosti deklarácia metódy vyzerá takto:
Tento riadok zobrazuje informácie z komponentov na stránke, napríklad články z com_content. Typ výstupných prvkov je špecifikovaný v atribúte.
1. typ - typy výstupných prvkov.
- komponent- ako som písal vyššie, zobrazuje hlavný obsah stránky. Dá sa zavolať iba raz na šablónu.
- hlavu- sa tiež oznamuje raz po úvodnom štítku . Slúži na zobrazenie štýlov, skriptov,
a metaúdaje aktuálnej stránky. - správu- zobrazuje systémové správy. Deklarované raz v tele dokumentu.
- inštalácia- nič nezobrazuje a je „návodom“ na inštaláciu.
- modul - zobrazí na stránke jeden modul. Počet inzerátov je neobmedzený.
- modulov- na rozdiel od predchádzajúceho typu umožňuje na svojej pozícii zobraziť viac ako jeden počet modulov.
Pri prvých štyroch uvedených typoch ich stačí uviesť na stránke. V prípade typu modulu sa úloha trochu skomplikuje. Aby sme mohli modul zobraziť na stránke, musíme preň najskôr vytvoriť modul modulárna pozícia s jedinečným identifikátorom (názov pozície modulu). To sa vykonáva pomocou atribútu name="position name" a povinného pridania riadku:
2. štýl - popis štýlu výstupu (mod chrome).
Vzhľad a štruktúra plášťa modulu závisí od zadaného štýlu. Vyzerá ako
:
- xhtml - zobrazí modul v bloku s funkciou názvu modChrome_xhtml($module, &$params, &$attribs)
{
if (!empty ($module->content)) : ?>
">
názov relácie != 0) : ?>
titul; ?>
obsah; ?>
} - stôl - zobrazí modul v rozložení štruktúry tabuľky
funkcia modChrome_table($module, &$params, &$attribs)
{ ?>
">
názov relácie != 0) : ?>
titul; ?>
obsah; ?>
} - horz - zobrazuje obsah modulu v bunke tabuľky, horizontálne funkcia modChrome_horz($module, &$params, &$attribs)
{ ?>
} - zaoblené- zobrazí modul v niekoľkých vnorených blokoch pre komplexný štýl v podobe grafických okrajov (napr. zaoblené rohy) funkcia modChrome_rounded($module, &$params, &$attribs)
{ ?>
">
názov relácie != 0) : ?>
titul; ?>
obsah; ?>
} - obrys- pridá prednastavené štýly css do funkcie bloku modulu modChrome_outline($module, &$params, &$attribs)
{
static $css=false;
ak (!$css)
{
$css=true;
jimport("joomla.environment.browser");
$doc = JFactory::getDocument();
$browser = JBrowser::getInstance();
$doc->addStyleDeclaration(".mod-preview-info ( výplň: 2px 4px 2px 4px; okraj: 1px plná čierna; pozícia: absolútna; farba pozadia: biela; farba: červená;)");
$doc->addStyleDeclaration(".mod-preview-wrapper ( farba pozadia:#eee; okraj: 1px bodkovaná čierna; farba:#700;)");
if ($browser->getBrowser()=="msie")
{
if ($browser->getMajor()<= 7) {
$doc->addStyleDeclaration(".mod-preview-info (filter: alpha(opacity=80);)");
$doc->addStyleDeclaration(".mod-preview-wrapper (filter: alpha(opacity=50);)");
}
inak(
$doc->addStyleDeclaration(".mod-preview-info (-ms-filter: alpha(opacity=80);)");
$doc->addStyleDeclaration(".mod-preview-wrapper (-ms-filter: alpha(opacity=50);)");
}
}
inak
{
$doc->addStyleDeclaration(".mod-preview-info (opacity: 0.8;)");
$doc->addStyleDeclaration(".mod-preview-wrapper (nepriehľadnosť: 0,5;)");
}
}
?>
position."[".$module->style."]"; ?>
obsah; ?>
} - žiadny- podobný štýlu vôbec nešpecifikovanému. Zobrazí modul bez funkcie dizajnu a názvu modChrome_none($module, &$params, &$attribs)
{
echo $module->obsah;
}
Všetky prednastavené štýly sa nachádzajú v súbore templates/system/html/modules.php. Neobmedzujeme sa však na používanie iba poskytnutých možností, ale sme celkom schopní vytvoriť si vlastné.
3. Vytvorte si vlastný režim Chrome.
Poskytnuté predvolené typy reprezentácie modulov teda nespĺňajú aktuálne požiadavky. Musíte pridať svoj vlastný štýl dizajnu. Ako príklad si vyberme pomerne často sa opakujúcu situáciu. Podľa zadania namiesto
vložte názov modulu do značky , ktorý je sémanticky neutrálny. Musíte tiež umiestniť blok obsahu modulu samostatne . Na vytvorenie vlastného štýlu výstupu modulu použijeme štandardné nástroje. Väčšina šablón Joomla má priečinok html/ (templates/názov šablóny/html/), ktorý sa používa na takzvané šablónovanie. To znamená, že ak skopírujete šablónu modulu do tohto priečinka, tak namiesto šablóny z adresára modules/my_module/tmpl/default sa vypíše súbor z templates/template name/html/my_modules/default. Komponenty sú šablónované rovnakým spôsobom. Pohodlné a praktické. V priečinku html/ vašej šablóny vytvorte súbor modules.php. Ak takýto priečinok v šablóne nie je, vytvoríme ho. Zapíšeme to do súboru function modChrome_modbox($module, &$params, &$attribs) // Volanie funkcie
{
if (!empty ($module->content)) : /* Skontrolujte, či pozícia obsahuje povolený modul */?>
">
showtitle != 0) : /* skontrolujte, či je zahrnutý názov modulu */ ?>
titul; /* Vytlačí názov */ ?>
obsah; /* Výstup obsahu modulu */ ?>
}
?> Hotovo. Teraz ho stačí zadať ako štýl výstupu. K našej pozícii priradíme modul a pozrieme sa na výsledok.
Jednou zo skvelých vecí na PHP je spôsob, akým pracuje s HTML formulármi. Hlavná vec je, že každý prvok formulára sa automaticky sprístupní vašim programom PHP. Podrobné informácie o používaní formulárov v PHP nájdete v časti. Tu je príklad HTML formulára:
Príklad č. 1 Najjednoduchší HTML formulár
Na tejto forme nie je nič zvláštne. Toto je bežný HTML formulár bez špeciálnych značiek. Keď používateľ vyplní formulár a klikne na tlačidlo Odoslať, zavolá sa stránka action.php. Tento súbor môže mať niečo ako:
Príklad č. 2 Zobrazenie údajov formulára
Ahoj,
.
Vámrokov.
Príklad výstupu tohto programu:
Dobrý deň, Sergey. Máte 30 rokov.
Ak neberiete do úvahy kúsky kódu s htmlspecialchars() A (int), princíp fungovania tohto kódu by mal byť jednoduchý a zrozumiteľný. htmlspecialchars() Zabezpečuje, že „špeciálne“ znaky HTML sú správne zakódované, aby sa na vašu stránku nevložil škodlivý kód HTML alebo Javascript. Vekové pole, o ktorom vieme, že by malo byť číslo, môžeme jednoducho previesť celé číslo, ktorý vás automaticky zbaví nechcených postáv. PHP to môže urobiť aj automaticky pomocou rozšírenia filtra. Premenné $_POST["name"] a $_POST["age"] za vás automaticky nastaví PHP. Predtým sme používali superglobálnu premennú $_SERVER, ale tu používame aj superglobálnu premennú $_POST, ktorá obsahuje všetky POST dáta. Všimni si spôsob odoslania(metóda) nášho formulára je POST. Ak by sme použili metódu GET, potom by naše informácie z formulára boli v superglobálnej premennej $_GET . Prípadne môžete použiť premennú $_REQUEST, ak na zdroji údajov nezáleží. Táto premenná obsahuje zmes údajov GET, POST a COOKIE.
pred 15 rokmi
Podľa špecifikácie HTTP by ste mali použiť metódu POST, keď používate formulár na zmenu stavu niečoho na strane servera. Ak má napríklad stránka formulár umožňujúci používateľom pridávať vlastné komentáre, ako je tento tu, formulár by mal používať POST. Ak kliknete na "Znova načítať" alebo "Obnoviť" na stránke, na ktorú ste sa dostali prostredníctvom POST, takmer vždy ide o chybu -- nemali by ste ten istý komentár uverejňovať dvakrát -- čo je dôvod, prečo tieto stránky nie sú uložené ako záložky ani vo vyrovnávacej pamäti.
Metódu GET by ste mali použiť vtedy, keď váš formulár dostáva niečo zo servera a v skutočnosti nič nemení. Napríklad formulár pre vyhľadávací nástroj by mal používať GET, pretože vyhľadávanie na webovej lokalite by nemalo meniť nič, čo by klienta mohlo zaujímať, a ukladanie výsledkov dotazu vyhľadávacieho nástroja do medzipamäte je rovnako užitočné ako vytváranie záložiek alebo ukladanie do vyrovnávacej pamäte. statická HTML stránka.
pred 2 rokmi
Stojí za to objasniť:
POST nie je bezpečnejšie ako GET.
Dôvody pre výber GET verzus POST zahŕňajú rôzne faktory, ako je zámer požiadavky ("odosielate" informácie?), veľkosť požiadavky (existujú limity na to, ako dlho môže byť URL, a parametre GET sa odosielajú v adresu URL) a ako jednoducho chcete akciu zdieľať – napríklad vyhľadávanie Google je GET, pretože uľahčuje kopírovanie a zdieľanie vyhľadávacieho dopytu s niekým iným jednoduchým zdieľaním adresy URL.
Bezpečnosť sa tu berie do úvahy len kvôli skutočnosti, že GET je jednoduchšie zdieľať ako POST. Príklad: nechcete, aby GET posielal heslo, pretože používateľ môže zdieľať výslednú adresu URL a neúmyselne odhaliť svoje heslo.
GET a POST však rovnako ľahko zachytí škodoradostná osoba, ak nenasadíte TLS/SSL na ochranu samotného sieťového pripojenia.
Všetky formuláre odoslané cez HTTP (zvyčajne port 80) sú nezabezpečené a dnes (2017) nie je veľa dobrých dôvodov na to, aby verejná webová stránka nepoužívala HTTPS (čo je v podstate HTTP + Transport Layer Security).
Ako bonus, ak používate TLS, minimalizujete riziko, že vaši používatelia dostanú kód (AD) do vašej návštevnosti, ktorý ste tam nevložili vy.
Toto je bežná zraniteľnosť triedy vrátane PHP. Ale ten, pre koho som audit robil, mi povedal, že táto zraniteľnosť sa nedá zneužiť, takže sa to nepočíta. Musel som sa s ním hádať
Čo je PHP-include
Urobme malý vzdelávací program o tejto zraniteľnosti. PHP-include je zraniteľnosť, ktorá vám umožňuje „zahrnúť“ ľubovoľný súbor, napríklad tento kód:
$modul=$_REQUEST["modul"]; include("modules/".$module);
A keďže v súbore „/etc/passwd“ zvyčajne nie sú žiadne značky PHP (), potom sa zobrazí v prehliadači, rovnako ako by sa html kód zobrazoval za php tagmi v bežnom php skripte. Čítanie súborov je samozrejme len jednou z možných implementácií tohto útoku. Hlavná vec je zahrnutie potrebných súborov s potrebným kódom PHP.
Vráťme sa k príkladu. Poďme si to skomplikovať:
$modul=$_REQUEST["modul"]; include("modules/".$module."/module.class.php");
$modul = $_ŽIADOSŤ [ "modul" ] ;
include ("modules/" . $module . "/module.class.php" );
Ako vidíte, do našej premennej je teraz na konci pridaný riadok, ktorý nám bráni zahrnúť akýkoľvek súbor. Mnohé funkcie PHP teda nie sú binárne bezpečné, to znamená, že takéto funkcie považujú bajt NULL za koniec reťazca. K skriptu pristupujeme takto:
script.php?module=../../../../../../../../../../../etc/passwd%00
A ak je direktíva magic_quotes zakázaná, potom znova uvidíme obsah /etc/passwd
Existuje nejaká zraniteľnosť?
Vráťme sa k nášmu kódu:
$module=addslashes($_REQUEST["modul"]); include("modules/".$module."/module.class.php");
$module = lomítka ($_REQUEST [ "modul" ] ) ;
include ("modules/" . $module . "/module.class.php" );
Ako môžete vidieť, naša premenná je nútená prejsť cez „pridané lomky“ a ak sa pokúsime použiť bajt NULL, skonvertuje sa na „\0“ a zahrnutie nebude fungovať.
Pokrok však nestojí! Ukázalo sa, že niektorí chlapci z USH našli zaujímavú vlastnosť v PHP: PHP filesystem attack vectors (anglicky). Aby sme stručne zhrnuli podstatu článku, php spracováva cesty pomocou niekoľkých funkcií:
- Skrátenie cesty- php skráti reťazec cesty na zadanú dĺžku MAXPATHLEN (V systéme Windows až 270 znakov, na NIX - zvyčajne 4096, na BSD - zvyčajne 1024)
- Normalizácia cesty— php spracuje cestu špeciálnym spôsobom, pričom odstráni nadbytočné znaky „/“ a „/.“ a ich rôzne kombinácie
- Redukcia na kanonickú formu— odstránia sa zbytočné prechody, napríklad „dir1/dir2/../dir3“ sa skonvertuje na „dir1/dir3/“, pričom sa nekontroluje existencia adresára „dir2“ a ďalšie podobné transformácie (t.j. pokračovanie normalizácie )
Teraz, v poradí, čo sa stane s prejdenou cestou:
- Ak je cesta relatívna, najskôr sa nahradia hodnoty z direktívy include_path
- Cesto sa potom upraví na určitú dĺžku v závislosti od platformy
- Cesta sa normalizuje
- Cesta je zredukovaná na kánonickú formu
Teraz to skúsme použiť. Skúsme vložiť určitý súbor “test.php”, ktorý sa nachádza v adresári “modules/”. Ak to chcete urobiť, pridajte symbol „/.“ na koniec. takže celková dĺžka spolu s názvom súboru a hodnotou z include_path je zjavne väčšia ako 4096 znakov.
script.php?module=test.php/././.[...]/././.
V tomto prípade musíte uhádnuť tak, aby celý reťazec cesty (už orezaný) skončil bodkou (dôležité!), a nie lomkou. Ak to chcete urobiť, môžete pridať jednu lomku takto:
A jedna z týchto možností bude určite fungovať.
Analyzuje sa
Pozrime sa v poradí, aké premeny sa stanú na ceste
modules/test.php//././.[...]/./././module.class.php
4200 znakov
Prvá vec, ktorá sa stane s riadkom, je, že sa k nemu pridá hodnota z include_path:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 znakov
Reťazec sa potom skráti na MAXPATHLEN (povedzme 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 znakov
Tu vidíte, prečo bolo potrebné pridať ďalšiu lomku (inak by bol riadok odrezaný od lomky). Teraz je tento riadok normalizovaný, najskôr sa odstránia nadbytočné lomky:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 znakov
Výsledkom je, že dostaneme správnu cestu k súboru, ktorý potrebujeme, a táto cesta už bude prenesená do include a súbor, ktorý potrebujeme, bude zahrnutý.
To znamená, že takto úspešne zahrnieme náš súbor „test.php“.
script.php?module=test.php//././.[...]/././.
To znamená, že zraniteľnosť nie je teoretická. V dôsledku toho môj klient prehral stávku a ja som vyhral stávku a 10 rubľov, na ktoré sme stavili. Samozrejme, okrem 10 rubľov som si získal aj dôveru a rešpekt v očiach klienta, čo je tiež dôležité.
Poznámky
Tu sa pozriem na niekoľko zaujímavých funkcií využívania tejto zraniteľnosti.
Ukončiť adresár
Zvážte tento kód:
)
;
Preskočme bod, že môžete použiť RFI a zahrnúť súbor zo vzdialeného servera. Povedzme „allow_url_include=OFF“ na serveri.
Uvažujme o situácii, keď potrebujeme vložiť súbor z nižšie uvedeného adresára:
script.php?module=../test.php/././.[...]/././.
Takáto požiadavka vygeneruje chybu, napríklad súbor sa nenašiel. A aby sme to obišli, musíme to nazvať takto:
script.php?module=blabla/../../test.php/././.[...]/././.
Nie nadarmo som opísal kanonizáciu ciest. Vďaka nemu nemusí existovať adresár „blabla“.
Pridanie jednoduchých lomítok
Pozorný čitateľ si zrejme všimol, že v popise normalizácie som napísal, že sú odstránené nadbytočné lomky „/“ a bodky s lomkami „/.“ tak prečo nepoužiť práve lomky, aby sme sa vyhli zbytočným trápeniam s bodkou na konci.
Je to všetko o algoritmoch, teda lomke s bodkou „/“. je úplne odstránený. Ale s jednoduchými lomkami je situácia trochu komplikovanejšia, počas normalizácie sa každé dve lomky nahradia jednou, až kým nezostane len jedna (!) lomka, príklad:
/home/site/public_html/modules/test.php////////////////////
57 znakov
↓
/home/site/public_html/modules/test.php/////////
48 znakov
↓
/home/site/public_html/modules/test.php/////
44 znakov
↓
/home/site/public_html/modules/test.php///
42 znakov
↓
/home/site/public_html/modules/test.php//
41 znakov
↓
/home/site/public_html/modules/test.php/
40 znakov
Malá odbočka:
Okrem toho, ak venujete pozornosť mnohým populárnym zdrojom hackerov, všimnete si túto chybu. Ako som pochopil, táto chyba začala článkom istého Raz0ra, kde navrhol vektor:
index.php?act=../../../../../etc/passwd/////[…]/////
A pozor aj v časopise ][aker vo svojom článku zopakoval túto chybu. Navyše aj v pôvodnom článku USH bolo jasne napísané, že nie je vhodné používať len lomky a je potrebné, aby na konci pred normalizáciou zostal dobový znak. Ale jednoduché lomky (aj bez bodky na konci) fungujú len v PHP so Suhosinom.
To znamená, že použite lomku s bodkou „/“. - univerzálnejšia metóda, pretože na rozdiel od lomiek „/“ funguje pre všetky verzie php.
Záver
Dúfam, že vám tento článok pomôže pochopiť, že vo svojich skriptoch by ste nemali ponechať ani tie najmenšie zraniteľnosti, pretože skôr či neskôr si pre ne môžete vyvinúť vlastný vektor útoku, čo môže viesť k vážnym následkom.
Prvok em predstavuje pasáž textu s dôrazom. Pomocou nej môžete upriamiť pozornosť čitateľa na význam vety alebo odseku. Čo to znamená, vám poviem po , ktorý popisuje prvok em.
Tabuľka 8-6: em prvok
Obrázok 8-3: Pomocou prvku em
V tomto príklade kladiem dôraz na I (I) na začiatku vety. Ak sa zamyslíme nad prvkom em, keď vyslovíme vetu nahlas, zvažujeme skutočnosť, že veta je odpoveďou na otázku. Predstavte si napríklad, že som sa spýtal: „Kto má rád jablká a pomaranče? Vaša odpoveď bude: "Mám rád jablká a pomaranče." (Keď to hovoríte nahlas a kladiete dôraz na JA, dávate tým jasne najavo, že ste človek, ktorý má rád tieto plody).
Ale keby som sa spýtal: "Máš rád jablká a čo ešte?" Môžete odpovedať: "Mám rád jablká a pomaranče." V tomto prípade bude dôraz kladený na posledné slovo, zdôrazňujúc, že pomaranče sú ďalším ovocím, ktoré máte radi. Táto možnosť v HTML by vyzerala takto:
Mám rád jablká a
pomaranče
.
Definícia cudzích slov a odborných výrazov
Prvok i označuje časť textu, ktorý má inú povahu ako okolitý obsah. Toto je pomerne vágna definícia, ale medzi bežné príklady patria slová z iných jazykov, technické alebo vedecké výrazy a dokonca aj ľudské myšlienky (na rozdiel od reči). Je opísaný prvok i.
Tabuľka 8-7: Prvok i
Obrázok 8-5: Použitie prvku s
![](https://i2.wp.com/storage.smarly.net/html5/8.5.png)
Identifikácia dôležitého textu
Silný prvok označuje pasáž textu, ktorá je dôležitá. Tento prvok je opísaný v.
Tabuľka 8-9: Silný prvok
Obrázok 8-7: Pomocou prvku u
![](https://i1.wp.com/storage.smarly.net/html5/8.7.png)
Pridanie malého písma
Malý prvok označuje malé písmo a často sa používa na kvalifikáciu a objasnenie. B predstavuje malý prvok.
Tabuľka 8-11: prvok malý
Obrázok 8-8: Použitie malého prvku
![](https://i1.wp.com/storage.smarly.net/html5/8.8.png)
Pridanie horného a dolného indexu
Prvky sub a sup môžete použiť na označenie horného a dolného indexu. Horný index sa používa na písanie slov v niektorých jazykoch a horný index aj dolný index sa používajú v jednoduchých matematických výrazoch. Tieto prvky sú prezentované v.
Tabuľka 8-12: Sub a sup prvky
Obrázok 8-9: Pomocou prvkov sub a sup
function modChrome_modbox($module, &$params, &$attribs) // Volanie funkcie
{
if (!empty ($module->content)) : /* Skontrolujte, či pozícia obsahuje povolený modul */?>
showtitle != 0) : /* skontrolujte, či je zahrnutý názov modulu */ ?>
titul; /* Vytlačí názov */ ?>
obsah; /* Výstup obsahu modulu */ ?>
}
?> Hotovo. Teraz ho stačí zadať ako štýl výstupu.
Jednou zo skvelých vecí na PHP je spôsob, akým pracuje s HTML formulármi. Hlavná vec je, že každý prvok formulára sa automaticky sprístupní vašim programom PHP. Podrobné informácie o používaní formulárov v PHP nájdete v časti. Tu je príklad HTML formulára:
Príklad č. 1 Najjednoduchší HTML formulár
Na tejto forme nie je nič zvláštne. Toto je bežný HTML formulár bez špeciálnych značiek. Keď používateľ vyplní formulár a klikne na tlačidlo Odoslať, zavolá sa stránka action.php. Tento súbor môže mať niečo ako:
Príklad č. 2 Zobrazenie údajov formulára
Ahoj,
.
Vámrokov.
Príklad výstupu tohto programu:
Dobrý deň, Sergey. Máte 30 rokov.
Ak neberiete do úvahy kúsky kódu s htmlspecialchars() A (int), princíp fungovania tohto kódu by mal byť jednoduchý a zrozumiteľný. htmlspecialchars() Zabezpečuje, že „špeciálne“ znaky HTML sú správne zakódované, aby sa na vašu stránku nevložil škodlivý kód HTML alebo Javascript. Vekové pole, o ktorom vieme, že by malo byť číslo, môžeme jednoducho previesť celé číslo, ktorý vás automaticky zbaví nechcených postáv. PHP to môže urobiť aj automaticky pomocou rozšírenia filtra. Premenné $_POST["name"] a $_POST["age"] za vás automaticky nastaví PHP. Predtým sme používali superglobálnu premennú $_SERVER, ale tu používame aj superglobálnu premennú $_POST, ktorá obsahuje všetky POST dáta. Všimni si spôsob odoslania(metóda) nášho formulára je POST. Ak by sme použili metódu GET, potom by naše informácie z formulára boli v superglobálnej premennej $_GET . Prípadne môžete použiť premennú $_REQUEST, ak na zdroji údajov nezáleží. Táto premenná obsahuje zmes údajov GET, POST a COOKIE.
pred 15 rokmi
Podľa špecifikácie HTTP by ste mali použiť metódu POST, keď používate formulár na zmenu stavu niečoho na strane servera. Ak má napríklad stránka formulár umožňujúci používateľom pridávať vlastné komentáre, ako je tento tu, formulár by mal používať POST. Ak kliknete na "Znova načítať" alebo "Obnoviť" na stránke, na ktorú ste sa dostali prostredníctvom POST, takmer vždy ide o chybu -- nemali by ste ten istý komentár uverejňovať dvakrát -- čo je dôvod, prečo tieto stránky nie sú uložené ako záložky ani vo vyrovnávacej pamäti.
Metódu GET by ste mali použiť vtedy, keď váš formulár dostáva niečo zo servera a v skutočnosti nič nemení. Napríklad formulár pre vyhľadávací nástroj by mal používať GET, pretože vyhľadávanie na webovej lokalite by nemalo meniť nič, čo by klienta mohlo zaujímať, a ukladanie výsledkov dotazu vyhľadávacieho nástroja do medzipamäte je rovnako užitočné ako vytváranie záložiek alebo ukladanie do vyrovnávacej pamäte. statická HTML stránka.
pred 2 rokmi
Stojí za to objasniť:
POST nie je bezpečnejšie ako GET.
Dôvody pre výber GET verzus POST zahŕňajú rôzne faktory, ako je zámer požiadavky ("odosielate" informácie?), veľkosť požiadavky (existujú limity na to, ako dlho môže byť URL, a parametre GET sa odosielajú v adresu URL) a ako jednoducho chcete akciu zdieľať – napríklad vyhľadávanie Google je GET, pretože uľahčuje kopírovanie a zdieľanie vyhľadávacieho dopytu s niekým iným jednoduchým zdieľaním adresy URL.
Bezpečnosť sa tu berie do úvahy len kvôli skutočnosti, že GET je jednoduchšie zdieľať ako POST. Príklad: nechcete, aby GET posielal heslo, pretože používateľ môže zdieľať výslednú adresu URL a neúmyselne odhaliť svoje heslo.
GET a POST však rovnako ľahko zachytí škodoradostná osoba, ak nenasadíte TLS/SSL na ochranu samotného sieťového pripojenia.
Všetky formuláre odoslané cez HTTP (zvyčajne port 80) sú nezabezpečené a dnes (2017) nie je veľa dobrých dôvodov na to, aby verejná webová stránka nepoužívala HTTPS (čo je v podstate HTTP + Transport Layer Security).
Ako bonus, ak používate TLS, minimalizujete riziko, že vaši používatelia dostanú kód (AD) do vašej návštevnosti, ktorý ste tam nevložili vy.
Toto je bežná zraniteľnosť triedy vrátane PHP. Ale ten, pre koho som audit robil, mi povedal, že táto zraniteľnosť sa nedá zneužiť, takže sa to nepočíta. Musel som sa s ním hádať
Čo je PHP-include
Urobme malý vzdelávací program o tejto zraniteľnosti. PHP-include je zraniteľnosť, ktorá vám umožňuje „zahrnúť“ ľubovoľný súbor, napríklad tento kód:
$modul=$_REQUEST["modul"]; include("modules/".$module);
A keďže v súbore „/etc/passwd“ zvyčajne nie sú žiadne značky PHP (), potom sa zobrazí v prehliadači, rovnako ako by sa html kód zobrazoval za php tagmi v bežnom php skripte. Čítanie súborov je samozrejme len jednou z možných implementácií tohto útoku. Hlavná vec je zahrnutie potrebných súborov s potrebným kódom PHP.
Vráťme sa k príkladu. Poďme si to skomplikovať:
$modul=$_REQUEST["modul"]; include("modules/".$module."/module.class.php");
$modul = $_ŽIADOSŤ [ "modul" ] ; include ("modules/" . $module . "/module.class.php" ); |
Ako vidíte, do našej premennej je teraz na konci pridaný riadok, ktorý nám bráni zahrnúť akýkoľvek súbor. Mnohé funkcie PHP teda nie sú binárne bezpečné, to znamená, že takéto funkcie považujú bajt NULL za koniec reťazca. K skriptu pristupujeme takto:
script.php?module=../../../../../../../../../../../etc/passwd%00
A ak je direktíva magic_quotes zakázaná, potom znova uvidíme obsah /etc/passwd
Existuje nejaká zraniteľnosť?
Vráťme sa k nášmu kódu:
$module=addslashes($_REQUEST["modul"]); include("modules/".$module."/module.class.php");
$module = lomítka ($_REQUEST [ "modul" ] ) ; include ("modules/" . $module . "/module.class.php" ); |
Ako môžete vidieť, naša premenná je nútená prejsť cez „pridané lomky“ a ak sa pokúsime použiť bajt NULL, skonvertuje sa na „\0“ a zahrnutie nebude fungovať.
Pokrok však nestojí! Ukázalo sa, že niektorí chlapci z USH našli zaujímavú vlastnosť v PHP: PHP filesystem attack vectors (anglicky). Aby sme stručne zhrnuli podstatu článku, php spracováva cesty pomocou niekoľkých funkcií:
- Skrátenie cesty- php skráti reťazec cesty na zadanú dĺžku MAXPATHLEN (V systéme Windows až 270 znakov, na NIX - zvyčajne 4096, na BSD - zvyčajne 1024)
- Normalizácia cesty— php spracuje cestu špeciálnym spôsobom, pričom odstráni nadbytočné znaky „/“ a „/.“ a ich rôzne kombinácie
- Redukcia na kanonickú formu— odstránia sa zbytočné prechody, napríklad „dir1/dir2/../dir3“ sa skonvertuje na „dir1/dir3/“, pričom sa nekontroluje existencia adresára „dir2“ a ďalšie podobné transformácie (t.j. pokračovanie normalizácie )
Teraz, v poradí, čo sa stane s prejdenou cestou:
- Ak je cesta relatívna, najskôr sa nahradia hodnoty z direktívy include_path
- Cesto sa potom upraví na určitú dĺžku v závislosti od platformy
- Cesta sa normalizuje
- Cesta je zredukovaná na kánonickú formu
Teraz to skúsme použiť. Skúsme vložiť určitý súbor “test.php”, ktorý sa nachádza v adresári “modules/”. Ak to chcete urobiť, pridajte symbol „/.“ na koniec. takže celková dĺžka spolu s názvom súboru a hodnotou z include_path je zjavne väčšia ako 4096 znakov.
script.php?module=test.php/././.[...]/././.
V tomto prípade musíte uhádnuť tak, aby celý reťazec cesty (už orezaný) skončil bodkou (dôležité!), a nie lomkou. Ak to chcete urobiť, môžete pridať jednu lomku takto:
A jedna z týchto možností bude určite fungovať.
Analyzuje sa
Pozrime sa v poradí, aké premeny sa stanú na ceste
modules/test.php//././.[...]/./././module.class.php
4200 znakov
Prvá vec, ktorá sa stane s riadkom, je, že sa k nemu pridá hodnota z include_path:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 znakov
Reťazec sa potom skráti na MAXPATHLEN (povedzme 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 znakov
Tu vidíte, prečo bolo potrebné pridať ďalšiu lomku (inak by bol riadok odrezaný od lomky). Teraz je tento riadok normalizovaný, najskôr sa odstránia nadbytočné lomky:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 znakov
Výsledkom je, že dostaneme správnu cestu k súboru, ktorý potrebujeme, a táto cesta už bude prenesená do include a súbor, ktorý potrebujeme, bude zahrnutý.
To znamená, že takto úspešne zahrnieme náš súbor „test.php“.
script.php?module=test.php//././.[...]/././.
To znamená, že zraniteľnosť nie je teoretická. V dôsledku toho môj klient prehral stávku a ja som vyhral stávku a 10 rubľov, na ktoré sme stavili. Samozrejme, okrem 10 rubľov som si získal aj dôveru a rešpekt v očiach klienta, čo je tiež dôležité.
Poznámky
Tu sa pozriem na niekoľko zaujímavých funkcií využívania tejto zraniteľnosti.
Ukončiť adresár
Zvážte tento kód:
) ;
Preskočme bod, že môžete použiť RFI a zahrnúť súbor zo vzdialeného servera. Povedzme „allow_url_include=OFF“ na serveri.
Uvažujme o situácii, keď potrebujeme vložiť súbor z nižšie uvedeného adresára:
script.php?module=../test.php/././.[...]/././.
Takáto požiadavka vygeneruje chybu, napríklad súbor sa nenašiel. A aby sme to obišli, musíme to nazvať takto:
script.php?module=blabla/../../test.php/././.[...]/././.
Nie nadarmo som opísal kanonizáciu ciest. Vďaka nemu nemusí existovať adresár „blabla“.
Pridanie jednoduchých lomítok
Pozorný čitateľ si zrejme všimol, že v popise normalizácie som napísal, že sú odstránené nadbytočné lomky „/“ a bodky s lomkami „/.“ tak prečo nepoužiť práve lomky, aby sme sa vyhli zbytočným trápeniam s bodkou na konci.
Je to všetko o algoritmoch, teda lomke s bodkou „/“. je úplne odstránený. Ale s jednoduchými lomkami je situácia trochu komplikovanejšia, počas normalizácie sa každé dve lomky nahradia jednou, až kým nezostane len jedna (!) lomka, príklad:
/home/site/public_html/modules/test.php////////////////////
57 znakov
↓
/home/site/public_html/modules/test.php/////////
48 znakov
↓
/home/site/public_html/modules/test.php/////
44 znakov
↓
/home/site/public_html/modules/test.php///
42 znakov
↓
/home/site/public_html/modules/test.php//
41 znakov
↓
/home/site/public_html/modules/test.php/
40 znakov
Malá odbočka:
Okrem toho, ak venujete pozornosť mnohým populárnym zdrojom hackerov, všimnete si túto chybu. Ako som pochopil, táto chyba začala článkom istého Raz0ra, kde navrhol vektor:
index.php?act=../../../../../etc/passwd/////[…]/////
A pozor aj v časopise ][aker vo svojom článku zopakoval túto chybu. Navyše aj v pôvodnom článku USH bolo jasne napísané, že nie je vhodné používať len lomky a je potrebné, aby na konci pred normalizáciou zostal dobový znak. Ale jednoduché lomky (aj bez bodky na konci) fungujú len v PHP so Suhosinom.
To znamená, že použite lomku s bodkou „/“. - univerzálnejšia metóda, pretože na rozdiel od lomiek „/“ funguje pre všetky verzie php.
Záver
Dúfam, že vám tento článok pomôže pochopiť, že vo svojich skriptoch by ste nemali ponechať ani tie najmenšie zraniteľnosti, pretože skôr či neskôr si pre ne môžete vyvinúť vlastný vektor útoku, čo môže viesť k vážnym následkom.
Prvok em predstavuje pasáž textu s dôrazom. Pomocou nej môžete upriamiť pozornosť čitateľa na význam vety alebo odseku. Čo to znamená, vám poviem po , ktorý popisuje prvok em.
Tabuľka 8-6: em prvok
Obrázok 8-3: Pomocou prvku em
V tomto príklade kladiem dôraz na I (I) na začiatku vety. Ak sa zamyslíme nad prvkom em, keď vyslovíme vetu nahlas, zvažujeme skutočnosť, že veta je odpoveďou na otázku. Predstavte si napríklad, že som sa spýtal: „Kto má rád jablká a pomaranče? Vaša odpoveď bude: "Mám rád jablká a pomaranče." (Keď to hovoríte nahlas a kladiete dôraz na JA, dávate tým jasne najavo, že ste človek, ktorý má rád tieto plody).
Ale keby som sa spýtal: "Máš rád jablká a čo ešte?" Môžete odpovedať: "Mám rád jablká a pomaranče." V tomto prípade bude dôraz kladený na posledné slovo, zdôrazňujúc, že pomaranče sú ďalším ovocím, ktoré máte radi. Táto možnosť v HTML by vyzerala takto:
Mám rád jablká a pomaranče .
Definícia cudzích slov a odborných výrazov
Prvok i označuje časť textu, ktorý má inú povahu ako okolitý obsah. Toto je pomerne vágna definícia, ale medzi bežné príklady patria slová z iných jazykov, technické alebo vedecké výrazy a dokonca aj ľudské myšlienky (na rozdiel od reči). Je opísaný prvok i.
Tabuľka 8-7: Prvok i
Obrázok 8-5: Použitie prvku s
![](https://i2.wp.com/storage.smarly.net/html5/8.5.png)
Identifikácia dôležitého textu
Silný prvok označuje pasáž textu, ktorá je dôležitá. Tento prvok je opísaný v.
Tabuľka 8-9: Silný prvok
Obrázok 8-7: Pomocou prvku u
![](https://i1.wp.com/storage.smarly.net/html5/8.7.png)
Pridanie malého písma
Malý prvok označuje malé písmo a často sa používa na kvalifikáciu a objasnenie. B predstavuje malý prvok.
Tabuľka 8-11: prvok malý
Obrázok 8-8: Použitie malého prvku
![](https://i1.wp.com/storage.smarly.net/html5/8.8.png)
Pridanie horného a dolného indexu
Prvky sub a sup môžete použiť na označenie horného a dolného indexu. Horný index sa používa na písanie slov v niektorých jazykoch a horný index aj dolný index sa používajú v jednoduchých matematických výrazoch. Tieto prvky sú prezentované v.
Tabuľka 8-12: Sub a sup prvky
Obrázok 8-9: Pomocou prvkov sub a sup
![](https://i1.wp.com/storage.smarly.net/html5/8.9.png)