Session proměnné s register_globals
Žil jsem v bludu a myslel jsem si, že aplikace je nezávislá na nastavení register_globals, pokud přistupuje k vnějším datům přes speciální pole a inicializuje všechny proměnné, se kterými pracuje. To ale bohužel nestačí, pozor je potřeba dávat ještě na session proměnné.
Jde o to, že když vytvoříme session proměnnou, tak při zapnutém register_globals se z ní při dalším načtení stránky vytvoří globální proměnná. A pokud tuto proměnnou změníme, tak se to při dalším načtení stránky projeví:
<?php // 1. načtení stránky $_SESSION["login"] = "vrana"; // $login ještě neexistuje // 2. načtení třeba i jiné stránky $login = "test"; // $login je zaregistrované jako session proměnná // $_SESSION["login"] se zatím nepřepsalo // 3. načtení stránky echo $_SESSION["login"]; // vypíše test ?>
Pokud tedy aplikace musí fungovat i se zapnutým register_globals, tak dejte pozor na to, aby názvy globálních proměnných nekolidovaly s názvy session proměnnými.
Diskuse
Martin:
register_globals je zlo a to snad každý už pochopil, ne?později možná pochopí, že celé PHP je zlo :)
Mira:
Je to zlo! Nedávno jsem stím bojoval a než mě trklo kde se mi tá proměná přepisuje jsem se dost zapotil :) BTW pro rychlé vypnutí z .htaccessphp_flag register_globals off
Megaloman:
Doteď jsem žil v domnění, že register_globals se používá snad už jen v archaických projektech které si nezaslouží údržbu...
Jakub Vrána
:
Řešit se to musí u projektů, které by měly běžet pokud možno všude nezávisle na konfiguraci.


Jiří Fogl:
Taky jsem si to myslel, bohužel četnost požadavků na naší hotline typu "u nás to funguje, u vás ne, programátor chybu nevidí, máte rozbitý hosting" svědčí o opaku - dokonce mám pocit, že posledních několik měsíců je takových požadavků čím dál víc.
Vesměs se jedná o nové aplikace vyvíjené ne víc, než rok nebo dva, a v podstatě všechny ty projekty si vybraly umístění na serveru s PHP 5.
Megaloman:
Je to tak! Že mě to samotného nenapadlo, asi proto, že jsem doposud register_globals on považoval za výstražný příklad a pamětihodnost do depozitáře PHP muzea.Koukal jsem do manuálu, a je tam psáno "register_globals ... Whether or not to register the EGPCS (...) variables as global variables." Zaujalo mě "global variables" - pokud by skutečně byly globální a nikoli superglobální, pak by tímto článkem popsaný problém šel řešit velmi jednoduše, ale osobně si myslím, že tomu tak není.
A co jsem se díval na "Verze PHP v ČR – únor 2009", tak webů s PHP < 4.2 je 1 %, pak byly register_globals po instalaci defaultně off, PHP 4.2 je 7 %, pak bylo nastavení register_globals prohlášeno za deprecated a ve verzi PHP > 6.0 už nebude vůbec. Tím neříkám, že to není zapnuté na serverech s PHP >= 4.2 nebo 4.3...
Schválně, kolik je, odhadem, domén se register_globals on? Vážně by mě to zajímalo, hlavně kvůli na konfiguraci nezávislým projektům.
tiso:
Tiež som na tom narazil.

Flexa:
Díky za předběžné varování. Už jsem nad tím párkrát přemýšlel, ale nedotáhl jsem to do fáze testů.salko:
Tiež som sa s tým stretol, asi 4 roky naspäť. Keďže som chcel zachovať aj staršie skripty a nechcel som meniť názov premenných, tak som mal na to fnc, ktorá ich primitívne "odlinkuje":<?php
foreach (.... $GLOBALS) {
$old = $GLOBALS[$index];
unset($GLOBALS[$index]);
$GLOBALS[$index] = $old;
}
?>
Martin:
V PHP bugy nejsou, pouze featury. Takže je to jasná featura.Jan Lorenc:
tak zrovna s tímhle problém nemám, na toto jsem již narazil dávno. :-)
toby:
Setkal jsem se s tím několikrát. Je to velmi otravná chyba, která se blbě zjišťuje, zvlášť na hostingu, kde to nelze ani skusmo vypnout. Na register_globals je nejhorší to, že v php vydrželo tak dlouho :-)
Qulee:
Ano, od určité doby ukládám proměnné, se kterými pracuji, do session jako $_SESSION["sneco"] = $neco;Jaroslav Peter:
S tímhle jsem se ještě předchvílí také trápil, než jsem narazil na tento článek. Pokud to někomu pomůže, takto to řeším já:
<?php
function session_globals()
{
$keys = array_keys($_SESSION);
for($i=0;$i<count($keys);$i++)
{
unset($GLOBALS[$keys[$i]]);
}
}
session_start();
session_globals();
?>
Diskuse je zrušena z důvodu spamu.

