Nacházíte se zde: Úvod » Pro zákazníky » Nápověda » Tipy k PHP aplikacím

Tipy k PHP aplikacím


nahoru

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í.


nahoru

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.2 a 5.3 vypnuta. 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.


nahoru

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.).


nahoru

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.


nahoru

Zpět na přehled nápovědy

Další domény za akční ceny

Ocenění Českého hostingu - Nejlepší webhosting PHP + MySQL a Webhosting roku Twitter Českého hostingu

Potřebujete poradit?
Jsme online