Nedávno jsem uvažoval, jak pracuje takový překladač PHP. Napadlo mě napsat zdrojový kód, který by jej odstřelil. V případě PHP4 se mi to povedlo – stáhněte si a vyzkoušejte tento příklad. PHP5 už umí vstupní data ošetřit lépe a namísto smrti ohlásí Parse error: parser stack overflow (pro pětku použijte upravený příklad).
Na webové prohlížeče lze zaútočit i na další frontě. Například je nechat zobrazit extrémně velký obrázek. Pro experiment bude stačit bitmapa o velikosti např. 1024×768, ke zvětšení použijeme HTML:
<img width="9000000" height="9000000"
src="wallpaper.jpg" />
Jak si s tím poradí trojlístek IE, Firefox a Opera? První dva jmenovaní se pokusí vyhovět zadání a počítač vytíží natolik, že bude připomínat mrtvý stroj (zkuste zarolovat). Opera rozměry zdaleka nedodrží (má limit někde kolem 30.000 pixelů) a k přetížení nedojde. Co je důležité, žádný z prohlížečů nezačne bezhlavě alokovat kvanta paměti a vždy jen přepočítá zobrazovaný výřez.
Můžete si to sami vyzkoušet – ale klikejte jen s vědomím všech rizik!
Ještě dodávám, že testy jsem dělal na Windows 2000 SP4 s Apache 2.0.48, PHP 4.4.0 & 5.0.4, IE 6 SP1, Firefoxem 1.0.4 a Operou 8.01. Jinde se může chování lišit.
Komentáře
Arthur Dent #1
Což to… Ale já několikrát (nedobrovolně) odstřelil PHP4 rekurzí, kde jsem se třeba uklepl v ukončovací podmínce. Nějak tak:
function zab($a){
$b=array();
for ($i=0;$i<100000;$i++){
$b[$i]=rand(1,10000);
}
if ($a==0) zab ($a++);
}
zab(0);
…a když ten server běží jako localhost, tak to pak stojí za to – člověk vidí, že se neděje to co se dít má, jenže celý počítač je zoufale tuhý a než odstřelíš Apache… :)
Arthur Dent #2
Pardon, pro hnidopichy dodám, že to není příklad „uklepnutí v ukončovací podmínce“, alébrž „uklepnutí při volání“.
David Grudl #3
#2 Arthure Dente, pro jistotu zde budu demonstrovat oba případy
uklepnutí při volání
uklepnutí v ukončovací podmínce
Arthur Dent #4
#3 Davide Grudle, Nikoli, ten druhý příklad je „uklepnutí při ukončení podmínky“, nikoli „při podmínce ukončení“.
To je spíš takhle:
Soudce: – Sakra, uklepl jsem se, mělo být „potravu“…
Havran #5
No k tomu druhemu prikladu z obrazkom. Bol som svedkom (na vlastnej kozi) ze PNG o podobnych rozmeroch a 999999×99999 (neviem presne) mi zostrelilo cele WinXP – Firefox 1.0.4 – IE som neskusal. Inak WinXP Pro SP2.
pinus #6
Firefox vykreslil cernou plochu o rozmerech 1024×768. IE6 vytizil procesor na maximum a pri pokusu o zabiti zrestartoval pocitac (WinXP, vc. poslednich zaplat)
pinus #7
doplneni: Firefox je verze 1.0.5 a nedelo se nic – proste se otevrela stranka s cernym obdelnikem (okamzite, zadne prepocitavani, zadne vytezovani procesoru).
Havran #8
Este aj linku vam dam – VAROVANIE ulozte si pre istou pracu.
https://web.archive.org/…tefan.de:80/
Havran #9
Asi to tam uz opravili. To je fajn – vcera som si ho nainstaloval :).
Ivan #10
Php příkladem neodstřeleno (4.3.9) – poslušně vypsalo 1.
David Grudl #11
#6 pinusi, ta černá plocha je nejspíš jeden hodně zvětšený pixel, zkus zarolovat. Jinak w2k to přežili v pohodě – není možné, že restart způsobil nestabilní (přetaktovaný) HW?
#8 Havrane, to je úplně to stejné – obrázek roztáhnutý do obřích rozměrů
#10 Ivane, to je zajímavé. Můžeš zkusit příklad pro PHP5 ?
Jinak v IE můžete (s klidem) vyzkoušet i tuto hříčku, zatímco na tohle rozhodně nedoporučuju klikat.
Petr #12
Fedora Core 3, Firefox 1.0.4: zobrazí se okamžitě v zadaných rozměrech 9000000 × 9000000
hvge #13
Myslim ze PHP vie dost dobre odstrelit aj kvantum vygenerovanych chyb (stacia notices). Sice to prezije, ale ako developer sa mi veru nikdy nechce cakat 5 minut, kym mi to ‚vybuble‘ do browseru, preto radsej volim Apache restart :(
thingwath #14
U zabíjecího obrázku nemám nejměnší problém. Sice by to mohlo být trochu plynulejší, ale jinak je to úplně v pohodě. Procesor sice pár sekund při natahování počítal, ale jinak vytížení jen malé.
Firefox Deer Park Alpha 2, Fedora Core 4
pixy #15
Maxiobrazek + Safari + MacOSX = nulovy problem.
Jakub Vrána #16
Viz též: Top 10 ways to crash PHP
#1 Arthure Dente, Není nad to testovat skripty spuštěním přes PHP-cli. Člověk se chybu snadno dozví a nemusí nic shazovat.
#11 Davide Grudle, Mě PHP-cli 4.4.0 i 4.3.10 pod Windows XP také poslušně vypsalo ok.
bvj #17
#11 Davide Grudle,
tak u tech dvou linku to nic neudela – tiny firewall ty skripty nepusti
bvj #18
na MSIE 5.5 a 6 funguje tohle
David Grudl #19
Na IE 5 (5.5?) stačívalo tohle:
#16 Jakube Vráno, vážně, PHP-CLI v případě php4killer.php funguje v pohodě a u php5killer.php vypíše korektní Parse Error.
anituar #20
Tu chybu s moc velkym height/weight jsem zkousel na trech pocitacich.
Vsechny s XPckama. Zkousel jsem FF (1.0.4) i IE (6.0.2900) a v obou modra obrazovka zpusobena ovladacem graficke karty (v jednom pripade integr. Intel, zbyle dva nVidia).
Gregor #21
php4-killer.php → vypisalo mi ok.
mam php 4.3.11 na Mac OS X 10.3.9
wiki #22
no ja jsem toho taky svedkem. xp sp 2 + firefox 1.04 chvili nic a pak jsem uvidel blue screen of dead.
charlie #23
Mno, vy vsichni kterym to fungovalo, zkouseli jste ten obrazek scrollovat? Me se pod Firefoxem 1.0.4 totiz taky moc hezky a moc rychle nacet, ale scrollovani melo za nasledek obrazovku barvy zname zhruba jako #0000FF..
charlie #24
A kolega se stejnou konfiguraci me koukam predbeh:/ To mam z toho ze jeste napul spim a pisu pomalu:/
wiki #25
#22 wiki, uz jsem prisel cim to je ze to usmrti i widle. je to mizernou intelackou grafikou co ma driver ialmrnt5 a ta se vyskytuje na hooodne pc v pracich a skolach
wiki #26
#7 pinusi, #9 Havran tak jsem zkousel Firefox verzi 1.0.5 a nic neopravili, problem je podle me proste ve windowsech a mizernejch driverech ke grafice. to svedci i o tom ze na fedore je to prej ok #14 thingwath #12 Petr.
Ebo #27
jéé… a já čekal článek ve stylu jak přepnout pomocí prográmku napětí Vcore na destrukční výši, či jak nenápadně uživateli na AMDčku vypnout ventilátor a simulovat jeho činnost, aby to kontrolní prográmky neodhalili 😁
pete #28
win2k sp4 / p4 2,4 / nvidia:
opera 8 to zkousla, ale obrázek byl menší. firefox 1.0.4 to vykreslil během chvilky bez vetšího zatížení cpu, při kliknutí na posuvník to všechno „zmrzlo“ a následoval reset. msie 6 to po pár minutách (100% cpu) vykreslil, přepnutí na msie z taskmana a zpátky trvalo další minuty, kliknutí na posuvník způsobí totéž jako u firefoxu
závěr (nebrat vážně):
(kdo bude asi první, komu to dám do msie jako homepage a nepřímo ho tak donutim přejít na lepší browser? 🙂
Radši anonymní ;-) #29
Já zkusil ten tvůj PHP-Killer na webuzdarma a náhle opravdu nefungují všechny domeny.unas.cz – aspoň co jsem zkoušel. Nevím sice, jestli mou zásluhou, ale snad mě webmaster hned nevyhodí… 😉
anituar #30
Jak uz jsem psal, delaji to i drivery od nVidie.
A co se tyce stroju, byly to vsechno P4, jmenovite 2.4GHz/768MB, 3.0GHz/1024MB a 3.0@3.6GHz/2048MB.
lammer #31
asi tolko, ze toto je old a very old a je to pouzite u jedneho nemca uz niekolko mesiacov! lenze teraz sa to zacalo sirit a uz je pruser. ja som to siril asi rok dozadu ale neslo to az tak humusne jak teraz
Arthur Dent #32
#31 lammere, Je to starý, já to šířil už před rokem 1990, ještě na ZX Spectru, ale to se už vůbec nedalo srovnávat!
David Grudl #33
#31 lammere, bavíme se o HIV?
Michal Illich #34
Linux (Fedora Core 4) + Mozilla Firefox 1.0.4 to zobrazil okamzite a naprosto korektne (da se scrollovat po celem maxiobrazku).
cortez #35
Centrino 1,6, ATI Mobile Radeon 9700, XP SP2+Aktual zaplaty a taky spadly cele…chvili se nic nedelo, totalne zatuhnul a po stisku CTRL+ALT+DEL modrej screen a chyba ovladace grafiky, takže to zdaleka nebude chyba grafáren ale pitomejch XPcek :(( … kdy uz skonci jejich nadvlada … bejt vsechny programy co mam pod Winama pro Linux, tak uz jsem davno na nem :(
Petr Souček #36
Tak pro změnu něco jiného – Windows 98 SE + Mozilla SeaMonkey 1.0a, video ATI Rage Xpert 2000 Pro – zobrazí se ihned obrázek 9000000px x 9000000px, celý bílý, jde v pohodě skrolovat vodorovně i svisle, i zobrazit vlastnosti.
Petr Souček #37
Tak jsem ještě zkusil Mozillu 1.7.10 a IE 6.0SP1 na stejném stroji a výsledek stejný – ani se nezaškobrtne, roluji, zobrazji vlastnosti obrázku.. ? Opravdu to někde zlobí?
zajDee #38
ja zkusil na tu stranku #8 Havran IE6 s poslednimi zaplatami, Firefox 1.0.4 a Operu 8.0, vsechno pod WinXP s poslednimi zaplatami a grafikou ATI Radeon 9600 a jak Mozilla, tak IE shodily pc do BSOD. A to i bez rolovani…
t3rb1 #39
no ja som skusal Firefox 1.0.6 a otvoril som to, zamrzlo to a chvilu nato naskocila BSOD :) nasledoval restart a vytiahnutie sietoveho kabla, bo vo firefoxe mam rozsirenie crash-recovery, po loginuti som pustil ff a vyhodil vsetky panely a potom som uz dalej robil :)
t3rb1 #40
skusal som php4-killer , na najnovsom easyphp, wz.cz a ic.cz a vsade vypisalo ok, takze nejak nefunguje
sway #41
Ja vim ze to je mozna trosku pozdni komentar, ale na Linuxu mi se ve FF 1.5 Beta 1 obrazek zobrazil naprosto v pohode:)
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.