|
|||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
bootable [55]
commercial [7] no-commercial [42] unclassified [20] [7]
Software (10844)
|
PHP (92) - funkce pro interakci s operačním systémemMůže PHP spouštět systémové příkazy? A jestliže ano, tak jak?
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átorPrová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:
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:
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 systemSmyslem 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 execFunkce 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 passthruFunkce 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čnostSpouš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.
Related article
PHP (1) - Historie a budoucnost PHP (2) - Jak to funguje PHP (3) - Instalace PHP (4) - Základy syntaxe PHP (5) - Příkaz Echo; formátování kódu PHP (6) - Typy proměnných PHP (7) - Pole PHP (8) - Výrazy, konstanty, inkrementace PHP (9) - Přetypování proměnných PHP (10) - Logické výrazy a operátory PHP (11) - Operátory porovnání; priorita operátorů PHP (12) - Podmínky PHP (13) - Příkazy cyklu PHP (14) - Cyklus for PHP (15) - Funkce PHP (16) - Vyrobme si kalendář PHP (17) - Dokončujeme kalendář PHP (18) - Funkce pro práci s poli PHP (19) - Objekty PHP (20) - Objekty podruhé PHP (21) - Vkládání souborů PHP (22) - Regulární výrazy PHP (23) - Neztraťte se ve funkcích PHP (24) - Pracujeme s formuláři PHP (25) - Formuláře - nikomu nevěřte PHP (26) - Formuláře na sto způsobů PHP (27) - Příklady na formuláře PHP (28) - Chybovati je lidské PHP (29) - Soubory a adresáře PHP (30) - Počitadlo pomocí souborů PHP (31) - Upload a download souborů PHP (32) - Příklad na BLOG PHP (33) - HTTP hlavičky PHP (34) - Úvod do databází PHP (35) - Uložení dat v databázi PHP (36) - Připojujeme se k MySQL PHP (37) - Tvorba tabulek v MySQL PHP (38) - Dolujeme data z MySQL PHP (39) - Zobrazujeme a stránkujeme data PHP (40) - PHP a vkládání záznamů do databází PHP (41) - Měníme data v databázích PHP (42) - Odstraňujeme databázová data PHP (43) - MySQL rychleji a rychleji PHP (44) - MySQL ještě rychleji PHP (45) - Jsou data v databázi v bezpečí? PHP (46) - Importujeme data do databáze PHP (47) - Exportujeme data PHP (48) - Práce s binárními daty (BLOB) PHP (49) - Kam kráčíš, MySQL? PHP (50) - Ověřování uživatelů PHP (51) - Přenos dat mezi stránkami PHP (52) - Cookies PHP (53) - Sessions PHP (54) - Dodržování webových standardů PHP (55) - Odesílání e-mailů PHP (56) - Tisk a PDF PHP (57) - XML PHP (58) - XML lépe a radostněji PHP (59) - zapisujeme XML PHP (60) - Rozsáhlejší projekty 1. PHP (61) - Rozsáhlejší projekty 2. PHP (62) - Rozsáhlejší projekty 3. PHP (63) - Rozsáhlejší projekty 4. PHP (64) - Ladění kódu PHP (65) - Ladění kódu 2. PHP (66) - PHP debugger PHP (67) - Zdroje informací o PHP PHP (68) - Stavíme portál PHP (69) - Stavíme portál 2. PHP (70) - Registrace uživatelů na portálu PHP (71) - Přihlašování uživatelů na portál PHP (72) - Hrátky s uživateli PHP (73) - Frontend a backend PHP (74) - Administrátorské rozhraní portálu PHP (75) - Pokračujeme na portále PHP (76) - Zobrazujeme data na portále PHP (77) - Portál, databáze a relace PHP (78) - Informační obsah portálu PHP (79) - Triky s formuláři a ergonomie webu PHP (80) - Administrace diskografie hudebního portálu PHP (81) - Uživatel versus programátor PHP (82) - zabezpečení vstupů formulářů PHP (83) - Ukládání textů písní na hudebním portále PHP (84) - Ještě k registraci PHP (85) - ukládání souborů do databáze na portálu PHP (86) - zobrazení dat a stahování soborů pro registrované PHP (87) - finišujeme portál PHP (88) - provoz ve Windows PHP (89) - cesta do hlubin php.ini PHP (90) - Poťouchlé konfigurační volby PHP (91) - php.ini potřetí a naposledy PHP (93) - příkazový řádek PHP (94) - GUI PHP (95) - GUI podruhé PHP (96) - (ne)bezpečné PHP PHP (97) - bezpečnost ještě jednou PHP (98) - PHP 5. PHP (99) - Budoucnost PHP PHP (100) - Závěr PHP (101) - Apríl: Příklady z praxe php rewrite Byte order mark a PHP Previous Show category (serial) Next
|
Szukanie oprogramowania
|
|||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |