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.
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...
Řešit se to musí u projektů, které by měly běžet pokud možno všude nezávisle na konfiguraci.
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.
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();
?>
Diskuse je zrušena z důvodu spamu.