Nacházíte se zde: Úvod Podpora Nápověda Skripty na serveru Tipy k PHP aplikacím
Tipy k PHP aplikacím
Na této stránce chceme uvést užitečné tipy k PHP aplikacím a stručně upozornit na časté chyby v jejich konstrukci a zabezpečení. Tyto informace vycházejí z našich zkušeností a zkušeností s problémy, se kterými se setkávají naši zákazníci. Budeme je postupně doplňovat. V této souvislosti také doporučujeme prostudovat hostingové zprávy Bezpečnost práce s webovými aplikacemi a Efektivita fungování webových aplikací.
Globální proměnné
Tato poznámka se týká práce s daty získanými od uživatele. Práce s příslušnými proměnnými je ovliněna nastavením direktivy register_globals. Na našich serverech s PHP 5.2 a 5.3 je tato direktiva ve výchozím nastavení vypnuta s možností si ji volitelně zapnout. Od PHP řady 5.4 pak byla vývojáři úplně zrušena. Všechny aplikace doporučujeme vytvářet tak, aby pracovaly s register_globals off. Důvodem je vyšší bezpečnost a také vyhnutí se problémům s kompatibilitou.
Pro získání dat od uživatelů tedy používejte superglobální proměnné ($_POST, $_GET, $_SESSION, $_COOKIE apod.), další informace najdete například na php.net v článku Předdefinované proměnné.
Pokud je to pro Vás problematické například z důvodu příliš rozsáhlých úprav ve stávající aplikaci, můžete na začátek příslušného skriptu (či skriptů) připojit například následující jednoduchý kód. Ten převede data ze superglobálních proměnných na lokální proměnné (například data z proměnné $_POST['jmeno'] převede do proměnné $jmeno).
<?php
if(!empty($_REQUEST)) {
foreach ($_REQUEST as $key => $value) {
$$key = $value;
}
}
?>
Nicméně, toto řešení by mělo být pouze dočasné - viz informace výše.
Volání lokálních souborů externě
Řada PHP funkcí umožňuje pracovat se vzdálenými soubory - to znamená, že je jim možné jako parametr zadat absolutní URL souboru (http://...). Jsou to například funkce pro práci s obrázky, funkce pro načítání či kopírování souborů, apod.
Tímto způsobem je možné načítat i soubory lokální - tedy soubory, které jsou umístěny na stejné doméně, jako příslušný skript. Tento způsob práce je ale problematický - při načtení souboru je vytvořeno další spojení na webserver a vzniká tak zbytečná zátěž. Navíc při větším počtu takových požadavků by mohlo dojít i vyčerpání počtu současných možných spojení či přetížení webserveru. Lokální soubory by měly být načítány lokálně - tzn. zadáním relativní nebo absolutní cesty v rámci serveru.
Pro demonstraci uvedeme jednoduchý příklad. Mějme doménu www.mojedomena.cz a v jejím prostoru skript obrazek.php, který bude pomocí funkce getimagesize() zjišťovat velikost obrázku fotka.jpg umístěného tamtéž.
Správně řešený skript obrazek.php bude vypadat takto:
<?php
$velikost = getimagesize('fotka.jpg');
?>
Stejného výsledku je možné dosáhnout i následujícím chybným voláním. Při něm je vytvořeno zbytečné spojení na webserver:
<?php
$velikost = getimagesize('http://www.mojedomena.cz/fotka.jpg');
?>
Máte-li načítané soubory umístěny v jiné subdoméně dané domény, není přímá práce s nimi kvůli nastavené open_basedir restrikci možná. Nicméně restrikci můžeme na požádání posunout - viz článek Open_basedir restrikce.