Pupiņu html moduļu php nosaukums. Jdoc:include — metode satura parādīšanai lapā. Pievienojot tikai slīpsvītras
Mēs īsi pieskārāmies tēmai par satura parādīšanas metodēm veidnes pamattekstā. Tagad apskatīsim tuvāk, kas tas ir un ar ko to ēd. Tātad metodes deklarācijas jdoc ir katrā Joomla veidnē un parādīt šo vai citu informāciju veidnes pamattekstā (tas ir, vietnes lapā). Kopumā metodes deklarācija izskatās šādi
Šajā rindā tiek parādīta informācija no vietnes komponentiem, piemēram, raksti no com_content. Izvades elementu veids ir norādīts atribūtā.
1. tips - izejas elementu veidi.
- komponents- kā jau rakstīju iepriekš, parāda galveno lapas saturu. Katrā veidnē var izsaukt tikai vienu reizi.
- galvu- arī deklarēts vienu reizi pēc sākuma taga . Izmanto, lai izvadītu stilus, skriptus,
un pašreizējās lapas metadati. - ziņa- parāda sistēmas ziņojumus. Vienreiz deklarēts dokumenta pamattekstā (body).
- uzstādīšana- nerāda neko un ir instalēšanas "instrukcija".
- modulis- lapā parāda vienu moduli. Sludinājumu skaits nav ierobežots.
- moduļi- atšķirībā no iepriekšējā tipa, ļauj savā pozīcijā parādīt ne vienu moduļu skaitu.
Pirmajiem četriem norādītajiem veidiem pietiek tikai tos norādīt lapā. Moduļa tipa gadījumā uzdevums kļūst nedaudz sarežģītāks. Lai lapā parādītu moduli, mums tas vispirms ir jāizveido modulāra pozīcija ar unikālu identifikatoru (moduļa pozīcijas nosaukumu). Tas tiek darīts, izmantojot atribūtu name="pozīcijas nosaukums" un obligāto rindas pievienošanu:
2. stils - izvades stila apraksts (mod chrome).
Moduļa apvalka izskats un struktūra ir atkarīga no norādītā stila. Izskatās kā
:
- xhtml- parāda moduli blokā ar virsraksta funkciju modChrome_xhtml($module, &$params, &$attribs)
{
if (!tukšs ($module->content)) : ?>
">
izrādes nosaukums != 0) : ?>
tituls; ?>
saturs; ?>
} - tabula- parāda moduli tabulas struktūras izkārtojumā
funkcija modChrome_table($module, &$params, &$attribs)
{ ?>
">
izrādes nosaukums != 0) : ?>
tituls; ?>
saturs; ?>
} - zirgs- parāda moduļa saturu tabulas šūnā, horizontāli funkcija modChrome_horz($module, &$params, &$attribs)
{ ?>
} - noapaļots- atveido moduli vairākos ligzdotos blokos sarežģītam stilam grafisku apmaļu veidā (piem., noapaļoti stūri) funkcija modChrome_rounded($module, &$params, &$attribs)
{ ?>
">
izrādes nosaukums != 0) : ?>
tituls; ?>
saturs; ?>
} - kontūru- pievieno iepriekš iestatītus stilus moduļu bloka css funkcijai modChrome_outline ($module, &$params, &$attribs)
{
statisks $css=false;
ja (!$css)
{
$css=true;
jimport("joomla.environment.browser");
$doc = JFactory::getDocument();
$browser = JBrowser::getInstance();
$doc->addStyleDeclaration(.mod-preview-info ( polsterējums: 2px 4px 2px 4px; apmale: 1px vienkrāsains melns; pozīcija: absolūta; fona krāsa: balta; krāsa: sarkana;)");
$doc->addStyleDeclaration(.mod-preview-wrapper ( fona krāsa: #eee; apmale: 1px punktēta melna; krāsa: #700;)");
if ($browser->getBrowser()=="msie")
{
if ($browser->getMajor()<= 7) {
$doc->addStyleDeclaration(.mod-preview-info (filtrs: alfa(necaurredzamība=80);)");
$doc->addStyleDeclaration(.mod-preview-wrapper (filtrs: alfa(necaurredzamība=50);)");
}
cits(
$doc->addStyleDeclaration(.mod-preview-info (-ms-filter: alfa(necaurredzamība=80);)");
$doc->addStyleDeclaration(.mod-preview-wrapper (-ms-filter: alfa(necaurredzamība=50);)");
}
}
cits
{
$doc->addStyleDeclaration(.mod-preview-info (necaurredzamība: 0,8;)");
$doc->addStyleDeclaration(.mod-preview-wrapper (necaurredzamība: 0,5;)");
}
}
?>
pozīcija."[".$module->style."]"; ?>
saturs; ?>
} - neviens- līdzīgs stilam, kas vispār nav norādīts. Parāda moduli bez stila un galvenes funkcijas modChrome_none($module, &$params, &$attribs)
{
atbalss $modulis->saturs;
}
Visi iepriekš iestatītie stili atrodas failā templates/system/html/modules.php. Bet mēs neaprobežojamies ar tikai piedāvāto iespēju izmantošanu, bet mēs varam viegli izveidot paši.
3. Pielāgota režīma hroma izveide.
Tātad moduļu noklusējuma reprezentācijas veidi neatbilst pašreizējām prasībām. Jums jāpievieno savs stils. Kā piemēru ņemsim diezgan bieži atkārtotu situāciju. Saskaņā ar uzdevumu, tā vietā
ievietojiet tagā moduļa nosaukumu , kas ir semantiski neitrāla. Ir nepieciešams arī ievietot moduļa satura bloku atsevišķā . Lai izveidotu savu moduļa izvades stilu, mēs izmantosim standarta rīkus. Lielākajā daļā Joomla veidņu ir html/ mape (veidnes/veidnes nosaukums/html/), ko izmanto tā sauktajai veidņu veidošanai. Tas ir, ja kopējat moduļa veidni uz šo mapi, tad veidnes vietā no mapes modules/my_module/tmpl/default tiks parādīts fails no templates/template name/html/my_modules/default. Sastāvdaļas tiek veidotas tādā pašā veidā. Ērts un praktisks. Izveidosim modules.php failu jūsu veidnes html/ mapē. Ja veidnē šādas mapes nav, izveidojiet to. Rakstīsim failā funkcija modChrome_modbox($module, &$params, &$attribs) // Funkcijas izsaukšana
{
if (!empty ($module->content)) : /* Pārbaudiet, vai pozīcijā ir iespējots modulis */?>
">
showtitle != 0) : /* pārbaudiet, vai ir iekļauts moduļa nosaukums */ ?>
tituls; /* Parādīt nosaukumu */ ?>
saturs; /* Parādīt moduļa saturu */ ?>
}
?> Gatavs. Tagad jums tas jānorāda tikai kā izvades stils. Mēs piešķiram moduli savai pozīcijai un skatāmies uz rezultātu.
Viena no PHP lielākajām priekšrocībām ir tā, kā tā darbojas ar HTML formām. Galvenais šeit ir tas, ka katrs veidlapas elements tiek automātiski padarīts pieejams jūsu PHP programmām. Papildinformāciju par veidlapu izmantošanu PHP skatiet sadaļā. Šeit ir HTML veidlapas piemērs:
Beispiel #1 Vienkāršākā HTML forma
Šajā formā nav nekā īpaša. Šī ir parasta HTML forma bez īpašiem tagiem. Kad lietotājs aizpilda veidlapu un noklikšķina uz pogas Iesniegt, tiks izsaukta lapa action.php. Šajā failā var būt kaut kas līdzīgs:
Beispiel #2 renderēšanas formas dati
Sveiki,
.
Tevgadiem.
Šīs programmas izvades paraugs:
Sveiks Sergej. Jums ir 30 gadi.
Ja neņem vērā koda gabalus ar htmlspecialchars() Un (int), šī koda darbības principam jābūt vienkāršam un skaidram. htmlspecialchars() nodrošina, ka "īpašās" HTML rakstzīmes ir pareizi kodētas, lai jūsu lapā netiktu ievietots ļaunprātīgs HTML vai Javascript. Vecuma lauks, kuram, kā mēs zinām, ir jābūt skaitlim, mēs varam vienkārši pārvērst par to vesels skaitlis, kas automātiski atbrīvosies no nevēlamām rakstzīmēm. PHP to var izdarīt arī automātiski, izmantojot filtra paplašinājumu. Mainīgos $_POST["nosaukums"] un $_POST["vecums"] automātiski iestata PHP. Iepriekš mēs izmantojām $_SERVER superglobālu, bet šeit mēs izmantojām arī $_POST superglobālu, kas satur visus POST datus. ievērojiet, tas nosūtīšanas metode(metode) mūsu veidlapā ir POST. Ja mēs izmantotu metodi GŪT, tad mūsu veidlapas informācija būtu $_GET superglobālā. Varat arī izmantot mainīgo $_REQUEST, ja datu avots nav svarīgs. Šis mainīgais satur GET, POST, COOKIE datu kombināciju.
pirms 15 gadiem
Saskaņā ar HTTP specifikāciju jums ir jāizmanto POST metode, kad izmantojat veidlapu, lai mainītu kādas lietas stāvokli servera galā. Piemēram, ja lapai ir veidlapa, kas ļauj lietotājiem pievienot savus komentārus, piemēram, šo lapā šeit, veidlapā ir jāizmanto POST, tāpēc šīs lapas nav pievienotas grāmatzīmēm vai kešatmiņā.
Jums vajadzētu izmantot GET metodi, ja jūsu veidlapa kaut ko noņem no servera un faktiski neko nemaina. Piemēram, meklētājprogrammas veidlapā jāizmanto GET, jo, meklējot tīmekļa vietnē, nevajadzētu mainīt neko, kas varētu interesēt klientu, un meklētājprogrammas vaicājuma rezultātu pievienošana grāmatzīmēm vai kešatmiņai ir tikpat noderīga kā grāmatzīmju vai kešatmiņas saglabāšana. statiska HTML lapa.
Pirms 2 gadiem
Ir vērts precizēt:
POST nav drošāka par GET.
GET vai POST izvēles iemesli ir saistīti ar dažādiem faktoriem, piemēram, pieprasījuma nolūku (vai jūs "iesniedzat" informāciju?), pieprasījuma lielumu (ir ierobežojumi, cik ilgi URL var būt, un GET parametri tiek nosūtīti URL) un cik viegli vēlaties, lai darbība būtu koplietojama. Piemēram, Google meklēšana ir GET, jo tā ļauj viegli kopēt un kopīgot meklēšanas vaicājumu ar kādu citu, vienkārši kopīgojot URL.
Drošība šeit tiek ņemta vērā tikai tāpēc, ka GET ir vieglāk kopīgot nekā POST. Piemērs: jūs nevēlaties, lai GET nosūtītu paroli, jo lietotājs var kopīgot iegūto URL un netīšām atklāt savu paroli.
Tomēr GET un POST ir vienlīdz viegli pārtvert labi novietota ļaunprātīga persona, ja jūs neizvietojat TLS/SSL, lai aizsargātu pašu tīkla savienojumu.
Visas veidlapas, kas nosūtītas, izmantojot HTTP (parasti ports 80), ir nedrošas, un šodien (2017. gadā) nav daudz pamatotu iemeslu, lai publiska vietne neizmantotu HTTPS (kas būtībā ir HTTP + transporta slāņa drošība).
Kā bonuss ir tas, ka, ja izmantojat TLS, tiek samazināts risks, ka jūsu lietotājiem tiks ievadīts kods (AD), ko neesat ievietojis jūs.
PHP iekļaušanas klasē ir izplatīta ievainojamība. Bet persona, kurai es veicu auditu, man teica, ka šo ievainojamību nevar izmantot, tāpēc tā netiek skaitīta. Man nācās ar viņu strīdēties.
Kas ir PHP-include
Veiksim nelielu izglītojošu programmu par šo ievainojamību. PHP-include ir ievainojamība, kas ļauj "iekļaut" patvaļīgu failu, piemēram, šo kodu:
$module=$_REQUEST["modulis"]; include("modules/".$module);
Un tā kā failā "/etc/passwd" parasti nav php tagu (), tad tas tiks parādīts pārlūkprogrammā, jo parastajā php skriptā html kods tiktu parādīts ārpus php tagiem. Protams, failu lasīšana ir tikai viena no iespējamajām šī uzbrukuma realizācijām. Galvenais joprojām ir iekļaut nepieciešamos failus ar nepieciešamo php kodu.
Atgriezīsimies pie piemēra. Sarežģīsim to:
$module=$_REQUEST["modulis"]; include("modules/".$module."/module.class.php");
$module = $_REQUEST [ "modulis"] ;
include ("modules/" . $module . "/module.class.php" ) ;
Kā redzat, tagad mūsu mainīgajam beigās tiek pievienota rinda, kas neļauj mums iekļaut nevienu failu. Tātad daudzas php funkcijas nav bināri drošas, t.i., šādas funkcijas uzskata NULL-baitu par virknes beigas. Mēs atsaucamies uz skriptu šādi:
script.php?module=../../../../../../../../../../../etc/passwd%00
Un, ja magic_quotes direktīva ir atspējota, mēs atkal redzēsim /etc/passwd saturu.
Vai ir kāda ievainojamība?
Atgriezīsimies pie mūsu koda:
$module=addslashes($_REQUEST["modulis"]); include("modules/".$module."/module.class.php");
$module = addslashes ($_REQUEST [ "module" ] ) ;
include ("modules/" . $module . "/module.class.php" ) ;
Kā redzat, mūsu mainīgais tiek piespiedu kārtā nodots caur "addslashes", un, ja mēs mēģināsim izmantot NULL baitu, tas tiks pārveidots par "\0" un iekļaut nedarbosies.
Bet progress nestāv uz vietas! Izrādās, daži puiši no USH ir atraduši interesantu funkciju PHP PHP failu sistēmas uzbrukuma vektoros. Īsāk sakot, lai pārstāstītu raksta būtību, php apstrādā ceļus, izmantojot vairākas funkcijas:
- Ceļa saīsināšana- php saīsina ceļa virkni līdz norādītajam garumam MAXPATHLEN (operētājsistēmā Windows līdz 270 rakstzīmēm, NIX - parasti 4096, BSD - parasti 1024)
- Ceļa normalizācija- php apstrādā ceļu īpašā veidā, noņemot papildu rakstzīmes "/" un "/". un to dažādās kombinācijas
- Samazinājums līdz kanoniskajai formai- tiek noņemtas papildu pārejas, piemēram, "dir1/dir2/../dir3" tiek reducēts uz "dir1/dir3/", kamēr netiek pārbaudīta direktorija "dir2" esamība, un citas līdzīgas transformācijas (t.i., turpinās normalizācija)
Tagad secībā, kas notiek ar izieto ceļu:
- Ja ceļš ir relatīvs, tad vispirms tiek aizstātas vērtības no direktīvas include_path
- Tālāk ceļš tiek apgriezts līdz noteiktam garumam atkarībā no platformas
- Notiek ceļa normalizācija
- Ceļš ir samazināts līdz kanoniskajai formai
Tagad mēģināsim to izmantot. Mēģināsim iekļaut kādu failu "test.php", kas atrodas direktorijā "modules/". Lai to izdarītu, rakstzīmes beigās pievienojiet "/." tā, lai kopējam garumam kopā ar faila nosaukumu, vērtību no include_path ir jābūt lielākam par 4096 rakstzīmēm.
script.php?module=test.php/././.[...]/././.
Šajā gadījumā ir jāuzmin tā, lai visa ceļa virkne (jau nogriezta) beidzas ar punktu (svarīgi!), Nevis ar slīpsvītru. Lai to izdarītu, varat pievienot vienu slīpsvītru šādi:
Un viena no šīm iespējām noteikti darbosies.
Mēs analizējam
Mēs secīgi skatāmies, kādas transformācijas notiks ar ceļu
modules/test.php//././.[...]/./././module.class.php
4200 rakstzīmes
Pirmā lieta, kas notiek ar virkni, ir tā, ka tai tiek pievienota vērtība no include_path:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 rakstzīmes
Pēc tam virkne tiek saīsināta līdz MAXPATHLEN (teiksim, 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 rakstzīmes
Šeit var redzēt, kāpēc bija nepieciešams pievienot vēl vienu slīpsvītru (pretējā gadījumā virkne tiktu nogriezta līdz slīpsvītrai). Tagad šī rinda ir normalizēta, vispirms tiek noņemtas papildu slīpsvītras:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 rakstzīmes
Rezultātā mēs iegūstam pareizo ceļu uz mums vajadzīgo failu, un šis ceļš jau tiks pārsūtīts uz iekļaut, un mums nepieciešamais fails tiks iekļauts.
Tas ir, šādi mēs veiksmīgi iekļausim mūsu "test.php" failu.
script.php?module=test.php//././.[...]/././.
Tas nozīmē, ka pastāv ievainojamība, nevis teorētiska. Rezultātā mans klients zaudēja likmi, un es uzvarēju strīdā un 10 rubļus, par kuriem mēs derējām. Protams, papildus 10 rubļiem iemantoju arī uzticību un cieņu klienta acīs, kas arī ir svarīgi.
Piezīmes
Šeit es apskatīšu pāris interesantas šīs ievainojamības izmantošanas iezīmes.
Iziet no direktorija
Apsveriet šo kodu:
)
;
Izlaidīsim punktu, ka varat izmantot RFI un iekļaut failu no attālā servera. Pieņemsim, ka serverī ir “allow_url_include=OFF”.
Apsveriet situāciju, kad mums ir jāiekļauj fails no tālāk esošā direktorija:
script.php?module=../test.php/././.[...]/././.
Šāds zvans radīs kļūdu, piemēram, fails nav atrasts. Un, lai to apietu, mums jāgriežas šādi:
script.php?module=blabla/../../test.php/././.[...]/././.
Ne velti aprakstīju par taku kanonizāciju. Pateicoties tam, direktorijai "blabla" nav jābūt.
Pievienojot tikai slīpsvītras
Kāds uzmanīgs lasītājs droši vien pamanīja, ka normalizācijas aprakstā es rakstīju, ka ir rakstīts, ka tiek noņemtas papildu slīpsvītras “/” un punkti ar slīpsvītrām “/”, tad kāpēc gan neizmantot tikai slīpsvītras, lai izvairītos no nevajadzīgām blēņām ar punktu. beigas.
Tas viss ir saistīts ar algoritmiem, tas ir, slīpsvītru ar punktu "/". tiek pilnībā noņemts. Bet ar vienkāršām slīpsvītrām situācija ir nedaudz sarežģītāka, ar normalizāciju katras divas slīpsvītras tiek aizstātas ar vienu, līdz paliek viena (!) slīpsvītra, piemēram:
/home/site/public_html/modules/test.php///////////////////
57 rakstzīmes
↓
/home/site/public_html/modules/test.php/////////
48 rakstzīmes
↓
/home/site/public_html/modules/test.php/////
44 rakstzīmes
↓
/home/site/public_html/modules/test.php///
42 rakstzīmes
↓
/home/site/public_html/modules/test.php//
41 rakstzīme
↓
/home/site/public_html/modules/test.php/
40 rakstzīmes
Neliela novirze:
Turklāt, ja pievēršat uzmanību daudziem populāriem hakeru resursiem, varat pamanīt šo kļūdu. Kā es saprotu, šī kļūda sākās ar noteikta Raz0r rakstu, kurā viņš ierosināja vektoru:
index.php?act=../../../../../etc/passwd/////[…]/////
Un pat pievērsiet uzmanību žurnālam ][aker atkārtoja šo kļūdu savā rakstā. Tajā pašā laikā pat sākotnējā USH rakstā bija skaidri rakstīts, ka tikai slīpsvītru lietošana nav vēlama, un ir nepieciešams, lai beigās, pirms normalizācijas, būtu punkts. Un tikai slīpsvītras (pat bez punkta beigās) darbojas tikai PHP ar Suhosin.
Tas ir, izmantojiet slīpsvītru ar punktu "/". - universālāka metode, jo atšķirībā no slīpsvītras "/" tā darbojas visās php versijās.
Secinājums
Es ceru, ka šis raksts palīdzēs jums saprast, ka jūsu skriptos nevajadzētu atstāt pat mazākās ievainojamības, jo agrāk vai vēlāk jūs varat tām izstrādāt savu uzbrukuma vektoru, kas var izraisīt nopietnas sekas.
Elements em apzīmē teksta daļu ar pasvītrotu akcentu. Varat to izmantot, lai pievērstu lasītāja uzmanību teikuma vai rindkopas nozīmei. Es jums pastāstīšu, ko tas nozīmē pēc , kas apraksta elementu em.
Tabula 8-6: em elements
Attēls 8-3: Izmantojot em elementu
Šajā piemērā es uzsvaru lieku uz I (I) teikuma sākumā. Domājot par elementu em, kad mēs skaļi pasakām teikumu, mēs uzskatām, ka teikums ir atbilde uz jautājumu. Piemēram, iedomājieties, ka es jautāju: "Kam garšo āboli un apelsīni?" Jūsu atbilde būs: "Man garšo āboli un apelsīni." (Kad jūs to sakāt skaļi un liekot uzsvaru uz Es, jūs skaidri parādat, ka esat cilvēks, kurš mīl šos augļus).
Bet ja jautāju: "Vai tev garšo āboli un kas vēl?" Jūs varētu atbildēt: "Man garšo āboli un apelsīni." Šajā gadījumā uzsvars tiks likts uz pēdējo vārdu, uzsverot, ka apelsīni ir vēl viens auglis, kas jums garšo. Šī HTML versija izskatītos šādi:
Man garšo āboli un
apelsīni
.
Svešvārdu un tehnisko terminu definīcija
Elements i apzīmē teksta daļu, kas atšķiras no apkārtējā satura. Šī ir diezgan neskaidra definīcija, taču bieži sastopami piemēri ietver vārdus no citām valodām, tehniskus vai zinātniskus terminus un pat cilvēku domas (pretēji runai). Elementā i ir aprakstīts.
Tabula 8-7: Elements i
Attēls 8-5: Izmantojot elementu s
![](https://i2.wp.com/storage.smarly.net/html5/8.5.png)
Svarīga teksta definīcija
Spēcīgais elements apzīmē svarīgu teksta daļu. Šis elements ir aprakstīts.
Tabula 8-9: spēcīgs elements
Attēls 8-7: Izmantojot elementu u
![](https://i1.wp.com/storage.smarly.net/html5/8.7.png)
Sīkās drukas pievienošana
Mazais elements apzīmē mazu druku, un to bieži izmanto atrunām un precizējumiem. Mazais elements ir attēlots .
Tabula 8-11: mazs elements
Attēls 8-8: Izmantojot mazo elementu
![](https://i1.wp.com/storage.smarly.net/html5/8.8.png)
Augšraksta un apakšindeksa pievienošana
Varat izmantot apakš- un sup elementus, lai norādītu attiecīgi augšindeksu un apakšindeksu. Virsraksti tiek izmantoti vārdu rakstīšanai dažās valodās, un vienkāršās matemātiskās izteiksmēs tiek izmantoti gan augšraksti, gan apakšindekss. Šie elementi tiek prezentēti.
8-12 tabula: sub un sup elementi
Attēls 8-9: Izmantojot sub un sup elementus
funkcija modChrome_modbox($module, &$params, &$attribs) // Funkcijas izsaukšana
{
if (!empty ($module->content)) : /* Pārbaudiet, vai pozīcijā ir iespējots modulis */?>
showtitle != 0) : /* pārbaudiet, vai ir iekļauts moduļa nosaukums */ ?>
tituls; /* Parādīt nosaukumu */ ?>
saturs; /* Parādīt moduļa saturu */ ?>
}
?> Gatavs. Tagad jums tas jānorāda tikai kā izvades stils.
Viena no PHP lielākajām priekšrocībām ir tā, kā tā darbojas ar HTML formām. Galvenais šeit ir tas, ka katrs veidlapas elements tiek automātiski padarīts pieejams jūsu PHP programmām. Papildinformāciju par veidlapu izmantošanu PHP skatiet sadaļā. Šeit ir HTML veidlapas piemērs:
Beispiel #1 Vienkāršākā HTML forma
Šajā formā nav nekā īpaša. Šī ir parasta HTML forma bez īpašiem tagiem. Kad lietotājs aizpilda veidlapu un noklikšķina uz pogas Iesniegt, tiks izsaukta lapa action.php. Šajā failā var būt kaut kas līdzīgs:
Beispiel #2 renderēšanas formas dati
Sveiki,
.
Tevgadiem.
Šīs programmas izvades paraugs:
Sveiks Sergej. Jums ir 30 gadi.
Ja neņem vērā koda gabalus ar htmlspecialchars() Un (int), šī koda darbības principam jābūt vienkāršam un skaidram. htmlspecialchars() nodrošina, ka "īpašās" HTML rakstzīmes ir pareizi kodētas, lai jūsu lapā netiktu ievietots ļaunprātīgs HTML vai Javascript. Vecuma lauks, kuram, kā mēs zinām, ir jābūt skaitlim, mēs varam vienkārši pārvērst par to vesels skaitlis, kas automātiski atbrīvosies no nevēlamām rakstzīmēm. PHP to var izdarīt arī automātiski, izmantojot filtra paplašinājumu. Mainīgos $_POST["nosaukums"] un $_POST["vecums"] automātiski iestata PHP. Iepriekš mēs izmantojām $_SERVER superglobālu, bet šeit mēs izmantojām arī $_POST superglobālu, kas satur visus POST datus. ievērojiet, tas nosūtīšanas metode(metode) mūsu veidlapā ir POST. Ja mēs izmantotu metodi GŪT, tad mūsu veidlapas informācija būtu $_GET superglobālā. Varat arī izmantot mainīgo $_REQUEST, ja datu avots nav svarīgs. Šis mainīgais satur GET, POST, COOKIE datu kombināciju.
pirms 15 gadiem
Saskaņā ar HTTP specifikāciju jums ir jāizmanto POST metode, kad izmantojat veidlapu, lai mainītu kādas lietas stāvokli servera galā. Piemēram, ja lapai ir veidlapa, kas ļauj lietotājiem pievienot savus komentārus, piemēram, šo lapā šeit, veidlapā ir jāizmanto POST, tāpēc šīs lapas nav pievienotas grāmatzīmēm vai kešatmiņā.
Jums vajadzētu izmantot GET metodi, ja jūsu veidlapa kaut ko noņem no servera un faktiski neko nemaina. Piemēram, meklētājprogrammas veidlapā jāizmanto GET, jo, meklējot tīmekļa vietnē, nevajadzētu mainīt neko, kas varētu interesēt klientu, un meklētājprogrammas vaicājuma rezultātu pievienošana grāmatzīmēm vai kešatmiņai ir tikpat noderīga kā grāmatzīmju vai kešatmiņas saglabāšana. statiska HTML lapa.
Pirms 2 gadiem
Ir vērts precizēt:
POST nav drošāka par GET.
GET vai POST izvēles iemesli ir saistīti ar dažādiem faktoriem, piemēram, pieprasījuma nolūku (vai jūs "iesniedzat" informāciju?), pieprasījuma lielumu (ir ierobežojumi, cik ilgi URL var būt, un GET parametri tiek nosūtīti URL) un cik viegli vēlaties, lai darbība būtu koplietojama. Piemēram, Google meklēšana ir GET, jo tā ļauj viegli kopēt un kopīgot meklēšanas vaicājumu ar kādu citu, vienkārši kopīgojot URL.
Drošība šeit tiek ņemta vērā tikai tāpēc, ka GET ir vieglāk kopīgot nekā POST. Piemērs: jūs nevēlaties, lai GET nosūtītu paroli, jo lietotājs var kopīgot iegūto URL un netīšām atklāt savu paroli.
Tomēr GET un POST ir vienlīdz viegli pārtvert labi novietota ļaunprātīga persona, ja jūs neizvietojat TLS/SSL, lai aizsargātu pašu tīkla savienojumu.
Visas veidlapas, kas nosūtītas, izmantojot HTTP (parasti ports 80), ir nedrošas, un šodien (2017. gadā) nav daudz pamatotu iemeslu, lai publiska vietne neizmantotu HTTPS (kas būtībā ir HTTP + transporta slāņa drošība).
Kā bonuss ir tas, ka, ja izmantojat TLS, tiek samazināts risks, ka jūsu lietotājiem tiks ievadīts kods (AD), ko neesat ievietojis jūs.
PHP iekļaušanas klasē ir izplatīta ievainojamība. Bet persona, kurai es veicu auditu, man teica, ka šo ievainojamību nevar izmantot, tāpēc tā netiek skaitīta. Man nācās ar viņu strīdēties.
Kas ir PHP-include
Veiksim nelielu izglītojošu programmu par šo ievainojamību. PHP-include ir ievainojamība, kas ļauj "iekļaut" patvaļīgu failu, piemēram, šo kodu:
$module=$_REQUEST["modulis"]; include("modules/".$module);
Un tā kā failā "/etc/passwd" parasti nav php tagu (), tad tas tiks parādīts pārlūkprogrammā, jo parastajā php skriptā html kods tiktu parādīts ārpus php tagiem. Protams, failu lasīšana ir tikai viena no iespējamajām šī uzbrukuma realizācijām. Galvenais joprojām ir iekļaut nepieciešamos failus ar nepieciešamo php kodu.
Atgriezīsimies pie piemēra. Sarežģīsim to:
$module=$_REQUEST["modulis"]; include("modules/".$module."/module.class.php");
$module = $_REQUEST [ "modulis"] ; include ("modules/" . $module . "/module.class.php" ) ; |
Kā redzat, tagad mūsu mainīgajam beigās tiek pievienota rinda, kas neļauj mums iekļaut nevienu failu. Tātad daudzas php funkcijas nav bināri drošas, t.i., šādas funkcijas uzskata NULL-baitu par virknes beigas. Mēs atsaucamies uz skriptu šādi:
script.php?module=../../../../../../../../../../../etc/passwd%00
Un, ja magic_quotes direktīva ir atspējota, mēs atkal redzēsim /etc/passwd saturu.
Vai ir kāda ievainojamība?
Atgriezīsimies pie mūsu koda:
$module=addslashes($_REQUEST["modulis"]); include("modules/".$module."/module.class.php");
$module = addslashes ($_REQUEST [ "module" ] ) ; include ("modules/" . $module . "/module.class.php" ) ; |
Kā redzat, mūsu mainīgais tiek piespiedu kārtā nodots caur "addslashes", un, ja mēs mēģināsim izmantot NULL baitu, tas tiks pārveidots par "\0" un iekļaut nedarbosies.
Bet progress nestāv uz vietas! Izrādās, daži puiši no USH ir atraduši interesantu funkciju PHP PHP failu sistēmas uzbrukuma vektoros. Īsāk sakot, lai pārstāstītu raksta būtību, php apstrādā ceļus, izmantojot vairākas funkcijas:
- Ceļa saīsināšana- php saīsina ceļa virkni līdz norādītajam garumam MAXPATHLEN (operētājsistēmā Windows līdz 270 rakstzīmēm, NIX - parasti 4096, BSD - parasti 1024)
- Ceļa normalizācija- php apstrādā ceļu īpašā veidā, noņemot papildu rakstzīmes "/" un "/". un to dažādās kombinācijas
- Samazinājums līdz kanoniskajai formai- tiek noņemtas papildu pārejas, piemēram, "dir1/dir2/../dir3" tiek reducēts uz "dir1/dir3/", kamēr netiek pārbaudīta direktorija "dir2" esamība, un citas līdzīgas transformācijas (t.i., turpinās normalizācija)
Tagad secībā, kas notiek ar izieto ceļu:
- Ja ceļš ir relatīvs, tad vispirms tiek aizstātas vērtības no direktīvas include_path
- Tālāk ceļš tiek apgriezts līdz noteiktam garumam atkarībā no platformas
- Notiek ceļa normalizācija
- Ceļš ir samazināts līdz kanoniskajai formai
Tagad mēģināsim to izmantot. Mēģināsim iekļaut kādu failu "test.php", kas atrodas direktorijā "modules/". Lai to izdarītu, rakstzīmes beigās pievienojiet "/." tā, lai kopējam garumam kopā ar faila nosaukumu, vērtību no include_path ir jābūt lielākam par 4096 rakstzīmēm.
script.php?module=test.php/././.[...]/././.
Šajā gadījumā ir jāuzmin tā, lai visa ceļa virkne (jau nogriezta) beidzas ar punktu (svarīgi!), Nevis ar slīpsvītru. Lai to izdarītu, varat pievienot vienu slīpsvītru šādi:
Un viena no šīm iespējām noteikti darbosies.
Mēs analizējam
Mēs secīgi skatāmies, kādas transformācijas notiks ar ceļu
modules/test.php//././.[...]/./././module.class.php
4200 rakstzīmes
Pirmā lieta, kas notiek ar virkni, ir tā, ka tai tiek pievienota vērtība no include_path:
/home/site/public_html/modules/test.php//././.[...]/./././module.class.php
4223 rakstzīmes
Pēc tam virkne tiek saīsināta līdz MAXPATHLEN (teiksim, 4096):
/home/site/public_html/modules/test.php//././.[...]/./.
4096 rakstzīmes
Šeit var redzēt, kāpēc bija nepieciešams pievienot vēl vienu slīpsvītru (pretējā gadījumā virkne tiktu nogriezta līdz slīpsvītrai). Tagad šī rinda ir normalizēta, vispirms tiek noņemtas papildu slīpsvītras:
/home/site/public_html/modules/test.php/././.[...]/./.
4095 rakstzīmes
Rezultātā mēs iegūstam pareizo ceļu uz mums vajadzīgo failu, un šis ceļš jau tiks pārsūtīts uz iekļaut, un mums nepieciešamais fails tiks iekļauts.
Tas ir, šādi mēs veiksmīgi iekļausim mūsu "test.php" failu.
script.php?module=test.php//././.[...]/././.
Tas nozīmē, ka pastāv ievainojamība, nevis teorētiska. Rezultātā mans klients zaudēja likmi, un es uzvarēju strīdā un 10 rubļus, par kuriem mēs derējām. Protams, papildus 10 rubļiem iemantoju arī uzticību un cieņu klienta acīs, kas arī ir svarīgi.
Piezīmes
Šeit es apskatīšu pāris interesantas šīs ievainojamības izmantošanas iezīmes.
Iziet no direktorija
Apsveriet šo kodu:
) ;
Izlaidīsim punktu, ka varat izmantot RFI un iekļaut failu no attālā servera. Pieņemsim, ka serverī ir “allow_url_include=OFF”.
Apsveriet situāciju, kad mums ir jāiekļauj fails no tālāk esošā direktorija:
script.php?module=../test.php/././.[...]/././.
Šāds zvans radīs kļūdu, piemēram, fails nav atrasts. Un, lai to apietu, mums jāgriežas šādi:
script.php?module=blabla/../../test.php/././.[...]/././.
Ne velti aprakstīju par taku kanonizāciju. Pateicoties tam, direktorijai "blabla" nav jābūt.
Pievienojot tikai slīpsvītras
Kāds uzmanīgs lasītājs droši vien pamanīja, ka normalizācijas aprakstā es rakstīju, ka ir rakstīts, ka tiek noņemtas papildu slīpsvītras “/” un punkti ar slīpsvītrām “/”, tad kāpēc gan neizmantot tikai slīpsvītras, lai izvairītos no nevajadzīgām blēņām ar punktu. beigas.
Tas viss ir saistīts ar algoritmiem, tas ir, slīpsvītru ar punktu "/". tiek pilnībā noņemts. Bet ar vienkāršām slīpsvītrām situācija ir nedaudz sarežģītāka, ar normalizāciju katras divas slīpsvītras tiek aizstātas ar vienu, līdz paliek viena (!) slīpsvītra, piemēram:
/home/site/public_html/modules/test.php///////////////////
57 rakstzīmes
↓
/home/site/public_html/modules/test.php/////////
48 rakstzīmes
↓
/home/site/public_html/modules/test.php/////
44 rakstzīmes
↓
/home/site/public_html/modules/test.php///
42 rakstzīmes
↓
/home/site/public_html/modules/test.php//
41 rakstzīme
↓
/home/site/public_html/modules/test.php/
40 rakstzīmes
Neliela novirze:
Turklāt, ja pievēršat uzmanību daudziem populāriem hakeru resursiem, varat pamanīt šo kļūdu. Kā es saprotu, šī kļūda sākās ar noteikta Raz0r rakstu, kurā viņš ierosināja vektoru:
index.php?act=../../../../../etc/passwd/////[…]/////
Un pat pievērsiet uzmanību žurnālam ][aker atkārtoja šo kļūdu savā rakstā. Tajā pašā laikā pat sākotnējā USH rakstā bija skaidri rakstīts, ka tikai slīpsvītru lietošana nav vēlama, un ir nepieciešams, lai beigās, pirms normalizācijas, būtu punkts. Un tikai slīpsvītras (pat bez punkta beigās) darbojas tikai PHP ar Suhosin.
Tas ir, izmantojiet slīpsvītru ar punktu "/". - universālāka metode, jo atšķirībā no slīpsvītras "/" tā darbojas visās php versijās.
Secinājums
Es ceru, ka šis raksts palīdzēs jums saprast, ka jūsu skriptos nevajadzētu atstāt pat mazākās ievainojamības, jo agrāk vai vēlāk jūs varat tām izstrādāt savu uzbrukuma vektoru, kas var izraisīt nopietnas sekas.
Elements em apzīmē teksta daļu ar pasvītrotu akcentu. Varat to izmantot, lai pievērstu lasītāja uzmanību teikuma vai rindkopas nozīmei. Es jums pastāstīšu, ko tas nozīmē pēc , kas apraksta elementu em.
Tabula 8-6: em elements
Attēls 8-3: Izmantojot em elementu
Šajā piemērā es uzsvaru lieku uz I (I) teikuma sākumā. Domājot par elementu em, kad mēs skaļi pasakām teikumu, mēs uzskatām, ka teikums ir atbilde uz jautājumu. Piemēram, iedomājieties, ka es jautāju: "Kam garšo āboli un apelsīni?" Jūsu atbilde būs: "Man garšo āboli un apelsīni." (Kad jūs to sakāt skaļi un liekot uzsvaru uz Es, jūs skaidri parādat, ka esat cilvēks, kurš mīl šos augļus).
Bet ja jautāju: "Vai tev garšo āboli un kas vēl?" Jūs varētu atbildēt: "Man garšo āboli un apelsīni." Šajā gadījumā uzsvars tiks likts uz pēdējo vārdu, uzsverot, ka apelsīni ir vēl viens auglis, kas jums garšo. Šī HTML versija izskatītos šādi:
Man garšo āboli un apelsīni .
Svešvārdu un tehnisko terminu definīcija
Elements i apzīmē teksta daļu, kas atšķiras no apkārtējā satura. Šī ir diezgan neskaidra definīcija, taču bieži sastopami piemēri ietver vārdus no citām valodām, tehniskus vai zinātniskus terminus un pat cilvēku domas (pretēji runai). Elementā i ir aprakstīts.
Tabula 8-7: Elements i
Attēls 8-5: Izmantojot elementu s
![](https://i2.wp.com/storage.smarly.net/html5/8.5.png)
Svarīga teksta definīcija
Spēcīgais elements apzīmē svarīgu teksta daļu. Šis elements ir aprakstīts.
Tabula 8-9: spēcīgs elements
Attēls 8-7: Izmantojot elementu u
![](https://i1.wp.com/storage.smarly.net/html5/8.7.png)
Sīkās drukas pievienošana
Mazais elements apzīmē mazu druku, un to bieži izmanto atrunām un precizējumiem. Mazais elements ir attēlots .
Tabula 8-11: mazs elements
Attēls 8-8: Izmantojot mazo elementu
![](https://i1.wp.com/storage.smarly.net/html5/8.8.png)
Augšraksta un apakšindeksa pievienošana
Varat izmantot apakš- un sup elementus, lai norādītu attiecīgi augšindeksu un apakšindeksu. Virsraksti tiek izmantoti vārdu rakstīšanai dažās valodās, un vienkāršās matemātiskās izteiksmēs tiek izmantoti gan augšraksti, gan apakšindekss. Šie elementi tiek prezentēti.
8-12 tabula: sub un sup elementi
Attēls 8-9: Izmantojot sub un sup elementus
![](https://i1.wp.com/storage.smarly.net/html5/8.9.png)