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.