Session proměnné s register_globals

Školení, která pořádám

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

Jakub Vrána, Řešení problému, 2.2.2009, diskuse: 15 (nové: 0)

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 .htaccess
php_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...

ikona Jakub Vrána OpenID:

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

ikona 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;
}
?>

developer:

OMG, PHP sucks!

Co si myslite, je to feature alebo bug?

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();
?>

Vložit příspěvek

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2016 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.