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

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: Reakce na: Flexa

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();
?>
avatar © 2005-2020 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.