Přeskočit na hlavní obsah

Direktivy pro načítání vzdálených souborů

V druhém díle přehledu základních konfiguračních direktiv a jejich vhodných hodnot se zastavím u těch, které ovlivňují includování skriptů či otevírání vzdálených souborů určených pomocí URL. Raději připomínám, že svá doporučená nastavení odvozuji zejména od požadavků na bezpečnost, přenositelnost aplikace mezi servery a budoucí vývoj PHP.

allow_url_include

Direktiva určuje, zda je možné includovat i soubory ze vzdáleného serveru:

include 'http://www.example.com/skript.php';

Měla by být jednoznačně zakázána. Includování výkonného kódu ze vzdáleného serveru je vždy potenciální bezpečnostní díra. Samozřejmě záleží hlavně na tom, jak si sami aplikaci postavíte. Vždy byste se měli například vyvarovat použití parametrů od uživatele pro určení includovaného souboru, pomocí kterých může útočník do vašeho skriptu vložit svůj škodlivý kód:

include $_GET['url'];

Ani při zadání pevného URL však nemusíte mít načítaný obsah stoprocentně pod kontrolou. Útočník může mít možnost změnit obsah zadaného vzdáleného serveru či různými metodami přesměrovat zpracování daného požadavku na svůj server. Ale i pokud je vzdálený server bezpečný, je často obtížné až nemožné zajistit integritu načítaného kódu s místní částí aplikace.

Principiálně navíc v dobře navržené aplikaci není zpravidla include vzdáleného skriptu vůbec potřeba. A pokud chci ze vzdáleného serveru dostat pouze nějaký obsah, jsou k dispozici jiné funkce, které pouze stáhnou a případně zobrazí obsah, ale nepokoušejí se jej interpretovat jako PHP kód, viz dále.

allow_url_fopen

Před PHP 5.2.0 ovlivňovala tato direktiva i includování, v tom případě platí i zde v plném rozsahu předchozí odstavec.

V pozdějších verzích ale ovlivňuje už jen otevírání obsahu ze vzdálených serverů s pomocí fopen() a jí příbuzných funkcí (neboli otevírání pomocí URL wrapperů):

$f = fopen('http://www.example.com/skript.php', 'r');

Nedochází tedy k přímému vykonání vzdáleného kódu. Samozřejmě i zde je záhodno ohlídat, aby útočník nemohl pomocí vstupních parametrů podstrčit jinou nežádoucí URL. Objektivně vzato bych tedy od PHP 5.2.0 klidně nechával tuto direktivu povolenou, spoustu činností to výrazně zjednodušuje.

Skutečností ale je, že řada hostingů ji z bezpečnostních důvodů i nadále zakazuje. Chcete-li tedy psát opravdu přenositelné skripty, stejně se nakonec budete muset URL wrapperů vzdát a místo nich sáhnout například po CURL nebo fsockopen(). V důsledku tedy i přes vše výše řečené nakonec doporučuji vyvíjet aplikace s touto direktivou zakázanou.

Komentáře

  1. Se zakázáním souhlasím čístě preventivně
    o file_get_contents() ani zmínka?
    Nicméně místo CURL doporučuji použít třídu Zend_Http_Client

  2. [1] Už jsem skoro začínal být nesvůj, že by se tu od Tebe neobjevilo nic ohledně Zend Frameworku :). A k tomu file_get_contents, proč by se mělo vyzdvihovat zvlášť a nestačí v článku zmíněné „fopen a jí příbuzných funkcí“?

  3. >nestačí v článku zmíněné “fopen a jí příbuzných funkcí?

    file_get_contents() je jedna řádka kódu, na zobrazení přes fopen() potřebuješ řádky 3 :)
    fopen() mi nesedí jako bývalýmu céčkaři, protože byla určená k otvírání lokálních souborů :)
    fsockopen() bejvá na běžných webhostinzích často zakázaná, takže na ní bych se nespoléhal

  4. [3] Těmi třemi řádky kódu asi myslíš:

    fopen
    fread s využitím filesize
    fclose

    To ale nejde ze dvou důvodů: filesize nepodporuje HTTP a u vzdálených souborů může načítání skončit při doručení paketu.