Nápověda - Register globals

Register globals je nastavení PHP, které určuje, jak má PHP interpret zpracovávat vstupní proměnné. V případě zapnutých register globals (register globals ON) PHP nekotroluje původ proměnné a programátor tak může s proměnnou nakládat stejným způsobem bez ohledu na to, je-li definována lokálně, z formuláře metodou POST či GET apod.

Protože jsou PHP skripty se zapnutou podporou register globals snadno zranitelné a mohou představovat hrozbu jak pro samotnou aplikaci uživatele tak pro server, na kterém běží, jsou register globals v PHP od verze 4.2.0 a novější standardně vypnuty (register globals OFF). Podrobnější informace získáte také na manuálové stránce PHP.

Jak správně psát skripty s vypnutou podporou register globals?

Podrobné informace o register globals naleznete přímo na manuálových stránkách PHP, proto zde uvádíme jen několik příkladů:

  1. Chcete zpracovat proměnnou z URL (webová adresa stránky)
    http://www.edrive-hosting.cz/index.php?webhosting=zaklad:

    nesprávný způsob (vyžaduje zapnuté register globals)

    if(isset($webhosting))
        echo $webhosting; // vypíše zaklad

    S vypnutými register globals nedojde k výpisu proměnné, protože ta není definována.

    správný způsob (vypnuté register globals)

    Parametr je předáván metodou GET, proto je nutné sdělit PHP, že je požadovaná proměnná právě odsud.

    if(isset($_GET['webhosting']))
        echo $_GET['webhosting']; // vypíše zaklad

  2. Chcete zpracovat proměnnou z jednoduchého formuláře:

    	<form method="post" action="index.php">
    		<fieldset>
    			<legend>uživatel</legend>
    			<label for="jmeno">jméno:</label>
    			<input name="jmeno" id="jmeno" />
    			<input type="submit" value="odeslat" />
    		</fieldset>
    	</form>
    		

    Po odeslání formuláře zpracujete proměnnou jmeno ve skriptu index.php následovně:

    nesprávný způsob (vyžaduje zapnuté register globals)

    if(isset($jmeno))
        echo $jmeno; // vypíše hodnotu proměnné jméno

    S vypnutými register globals nedojde k výpisu proměnné, protože ta není definována.

    správný způsob (vypnuté register globals)

    Parametr je předáván metodou POST, proto je nutné sdělit PHP, že je požadovaná proměnná právě odsud.

    if(isset($_POST['jmeno']))
        echo $_POST['jmeno']; // vypíše hodnotu proměnné jméno

Poznámka

Pokud použijete skript, který funguje s vypnutými register globals, bude fungovat i když budou register globals zapnuté. Obráceně to však neplatí a skripty, které nejsou správně napsané, s vypnutými register globals fungovat nebudou.

Proměnné $_POST a $_GET se nazývají superglobální. Podrobnější informace o proměnných v PHP získáte na manuálové stránce.

Jak opravit nefunkční skripty?

Své skripty můžete opravit dvěma způsoby:

  1. Přepíšete skripty tak, aby využívaly superglobální proměnné, jak bylo popsáno výše. Tento způsob je z dlouhodobého hlediska nejlepší a jednoznačně ho doporučujeme.

  2. Pokud potřebujete své skripty zprovoznit v co nejkratším čase, pomůže vám přidání následující řádky do souboru .htaccess

    php_flag register_globals on

    Soubor .htaccess umístěte do hlavního adresáře vašeho webu anebo do libovolného podadresáře dle potřeby. Umístěný soubor zapne lokálně register globals pro zvolený adresář (web) a jeho podadresáře.

    Upozornění: ačkoli je tento způsob časově nenáročný, vřele vám ho nedoporučujeme. Zapnutím register globals vystavujete svou aplikaci možným útokům z internetu a riskujete tak ztrátu či poškození svých dat.

Vytištěno ze sekce:  edrive hosting » nápověda » PHP » Register Globals