LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (92) - funkce pro interakci s operačním systémem

Může PHP spouštět systémové příkazy? A jestliže ano, tak jak?

17.1.2005 15:00 | Petr Zajíc | Články autora | přečteno 29414×

Komerční sdělení: Pořádáme Kurzy PHP

Ačkoli PHP se v naprosté většině případů používá k tvorbě dynamických webových stránek, je dobré vědět, že může být použito i jinak. V dnešním díle se zamyslíme nad  způsoby, jakými může programátor pomocí PHP zasahovat do operačního systému.

Utajený prováděcí operátor

Prováděcí operátor je obrácený apostrof (`). Nepleťte si jej s klasickým apostrofem ('). Na tomto operátoru není nic tajného, nazval jsem ho tak prostě proto, že ho většina lidí vůbec nezná. Ve skriptu tahle potvůrka způsobí, že příkaz, který je uzavřený v obrácených apostrofech PHP ignoruje a je předán k provádění operačnímu systému. Takže můžete například napsat:

echo `ls`;

Když se to spustí, provedou se následující věci:

  • Skript narazí na příkaz v obrácených apostrofech
  • Skript jej provede jako příkaz operačního systému
  • Ten příkaz může něco vrátit (ls samozřejmě vrací výpis souborů)
  • To, co příkaz vrátil, může PHP zpracovat (může to být uloženo do proměnné, vytištěno a tak dále)

V praxi si to budete moci vyzkoušet málokde. Na naprosté většině webhostingů je obrácený apostrof zakázán, protože administrátor bude stěží chtít, abyste pomocí PHP jakkoli manipulovali s hostitelským počítačem. Může se to ale hodit například při vývoji intranetových aplikací, kde to za určitých podmínek může být relativně bezpečné.

Pokud budete z nějakého důvodu chtít nebo muset používat prováděcí operátor, měli byste pamatovat na následující věci:

  1. Omylem nebo úmyslně tak můžete vytvořit skripty, které jsou nepřenositelné na jinou platformu. Protože například Windows nemají příkaz ls, příklad výše by tam nefungoval.
  2. Pokud potřebujete nejen spouštět akce na serveru, ale rovněž zpracovávat výstupy z těchto akcí pamatujte, že si můžete pěkně naběhnout. Výstup může být totiž formátován jinak, než byste snad očekávali, či může být v jiné znakové sadě.
  3. Jestliže spustíte příkaz, který by normálně očekával uživatelský vstup, PHP se může jevit jako zaseklé, protože spuštěný program nebyl ukončen a PHP čeká na výsledky.
  4. Jestliže stránka obsahuje prováděcí operátor a v prohlížeči zrušíte její načítání, neznamená to automaticky, že spuštěný příkaz operačního systému bude zrušen (!)
  5. V jednom skriptu lze použít více systémových volání. V takovém případě jsou spouštěny asynchronně (to znamená, že druhé nečeká na dokončení prvního)
  6. Paměť, kterou spotřebuje příkaz operačního systému se v takovém případě zahrnuje do maximálního množství paměti, kterou lze přidělit PHP skriptu. Neboli, pokud by běh externího procesu, spuštěného pomocí prováděcího operátoru potřeboval ke své činnosti více paměti, než kolik může PHP použít, nebude spuštěn.
  7. Jestliže běží PHP v safe-mode, prováděcí operátor nefunguje.

S prováděcím operátorem se tedy dá především na hodně místech narazit a tak je jeho použití spíš nedoporučované. Ale má-li webová stránka nějakým způsobem ovlivňovat hostitelský počítač, je prostor k jeho použití. Ekvivalentem prováděcího operátoru je PHP funkce shell_exec, což se jistě bude hodit zejména těm, kdo nechtějí lovit zpětné apostrofy na klávesnici.

Funkce system

Smyslem funkce system() je rozšířit shell_exec o možnost zpracovávat návratovou hodnotu volaného systémového příkazu. Jako nepovinný druhý parametr totiž může přebírat název proměnné, do níž se návratová hodnota shellového příkazu uloží. Takže můžete dělat takové věci jako testování návratové hodnoty a rozhodnutí se, co dělat. Funkce system však neumožňuje zpracovat celý výstup příkazu, protože v případě úspěchu vrací pouze poslední řádek výstupu. (V případě neúspěchu pak vrací FALSE).

Pro ty, kdo se s návratovými hodnotami ještě nesetkali - jsou to hodnoty vrácené provedeným programem, indikují převážně to, zda se programu "povedlo co zamýšlel" a bývají dokumentovány. Tak například GNU verze systémového příkazu grep může vrátit jako návratovou hodnotu nulu v případě, kdy byly nalezeny nějaké shody, jedničku pokud nebyly a dvojku pokud došlo k chybě. PHP funkce system() tedy může návratovou hodnotu zachytit a zpracovat.

Funkce exec

Funkce exec() je mocnější než funkce system v tom, že umožňuje jak získat návratovou hodnotu volaného systémového příkazu, tak i celý jeho výstup (ne tedy jen poslední řádek výstupu). Jde na to tak, že ukládá každý řádek výstupu do jednoho prvku pole. Konkrétní využití by mohlo spočívat třeba ve zpracování souborů protokolů, protože ty velmi často píší jednu zprávu na jeden řádek.

Funkce passthru

Funkce passthru() se prakticky ve všem podobá funkci system(), ale umí bezpečně zpracovat binární data. Jinak název vám může připomenout funkci fpassthru, která však vrací data ze souboru. Passthru samozřejmě vrací data výstupu příkazu operačního systému.

Bezpečnost

Spouštět ze skriptů příkazy pro operační systém hostitele je již z principu nebezpečná věc. Takže, jak již bylo uvedeno, většina správců to při konfiguraci PHP nadšeně zakáže. Nicméně, pokud byste chtěli a mohli výše uvedené příkazy použít, měli byste si si ověřit, že to, co předáváte jako příkaz operačnímu systému pokud možno nesouvisí s uživatelským vstupem. Jinak by totiž uživatel mohl zadat příkaz, který jste nezamýšleli.

Jestliže však přece jen musí být systémový příkaz závislý na zadání uživatele (čemuž byste se opravdu měli vyhýbat), vzniká problém. Podobný problém jsme již řešili při úvaze o uživatelských vstupech z formulářů. Špatná data z formuláře však mohla nejspíš poškodit zobrazenou stránku, nebo data z databáze. Tohle je mnohem horší, neošetřeným vstupem byste mohli dostat do potíží celý operační systém.

Obecně lze doporučit funkci escapeshellcmd. Ta oescapuje metaznaky shellu tak, aby byl předaný příkaz nezneužitelný. Trochu se svou filozofií podobá tomu, co v případě řetězců předávaných databázi dělá funkce addslashes, totiž že upravuje informace, které PHP předává nějakému externímu softwaru. Pakliže budete předávat nějaké parametry, často můžete trochu ovlivnit to, co obsahují. Třeba zda se jedná o číslo či řetězec, jak to bude velké či dlouhé nebo které znaky se tam smí a nesmí vyskytovat.

Rovněž byste neměli přiliš spoléhat na tvar, v jakém dorazí data z příkazu operačního systému. To se týká zejména situací, kdy se programátor spoléhá na výstupní data systémového příkazu. Pokud lze přepsat příkaz tak, aby mu stačila "jen" návratová hodnota externího procesu, udělejte to. Pokud ne, vrácená data analyzujte, než s nimi něco uděláte. Rovněž si uvědomte, že příkazy, které voláte, mohou po změně konfigurace systému vracet jiné výsledky či jinak formátovaná data.

Konečně, tohle je přesně ta situace, kdy je třeba probrat všechny katastrofické scénáře. Systémový příkaz může selhat, spotřebovat dostupnou paměť, čekat na uživatelský vstup, dlouho trvat, kolidovat s jiným vláknem či procesem, přestat odpovídat a já nevím, co ještě. Měli byste se ujistit, že s takovými situacemi počítáte a umíte je řešit.

V dalším díle seriálu se podíváme na to, jak použít PHP z příkazové řádky.

Verze pro tisk

pridej.cz

 

DISKUZE

Nebezpečné 21.1.2005 10:50 Martin Maléř
Fakt síla 22.1.2005 06:30 Petr Zajíc
  L Re: Fakt síla 22.1.2005 12:31 Jan Houštěk




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

15.4.2017 15:20 /František Kučera

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).


Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

8.1.2017 17:51 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 19. ledna od 18:30 v pražském hackerspacu Brmlab. Tentokrát je tématem srazu ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. K vidění bude mechanická klávesnice dasKeyboard, trackball Logitech nebo grafický tablet (a velký touchpad) Wacom. Přineste i vy ukázat svoje zajímavé klávesnice a další HW. V 18:20 je sraz před budovou, v 18:30 jdeme společně dovnitř, je tedy dobré přijít včas. Podle zájmu se později přesuneme do nějaké restaurace v okolí.
Přidat komentář

1.12.2016 22:13 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.
Komentářů: 1

4.9.2016 20:13 /Pavel `Goldenfish' Kysilka
PR: Dne 22.9.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, provozování ERP v cloudu, o hostování různých typů softwaru, ale třeba i o zálohování dat nabízeném podnikům formou služby.
Přidat komentář

1.9.2016 11:27 /Honza Javorek
Česká konference o Pythonu, PyCon CZ, stále hledá přednášející skrz dobrovolné přihlášky. Máte-li zajímavé téma, neváhejte a zkuste jej přihlásit, uzávěrka je již 12. září. Konference letos přijímá i přednášky v češtině a nabízí pomoc s přípravou začínajícím speakerům. Řečníci mají navíc vstup zadarmo! Více na webu.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

17.4.2017 19:15 / Jakub shoop
chyba

7.4.2017 15:43 / Som
foreign car repair

31.3.2017 18:33 / David Ostrovsky
Dotazník na obeznámenost s hummusem.

24.3.2017 11:54 / Hui
country cottages

16.3.2017 16:33 / BezvaDesign.cz
Re: Hledám grafika do teamu

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze