Lokalna zmienna nadpisująca zmienną sesji


Nie rozumiem co ludzie widzą w tym PHP? Mnie co chwilę szlag trafia, ale do rzeczy. Coś się popsuło przy przenoszeniu i jak to zwykle bywa – „u mnie działa”. A czemu nie na serwerze? Wszystkiemu winne ustawienia register_globals on.

A wrednie się porobiło. Prosty przykład. Przy logowaniu ustawiam sobie zmienną sesji.

$_SESSION['uzytkownik'] = 'Janek';

Następnie na którejś stronie zapominając o nazwie zmiennej wykorzystałem ją lokalnie:

$uzytkownik = 'Karolina';

I w tym momencie następuje paskudna podmiana nazwy w sesji. Janek staje się Karoliną.

echo $_SESSION['uzytkownik']; // wypisze Karolina

Wyłączanie register_globals

Aby temu zaradzić trzeba wyłączyć zmienne globalne. Jak ustawić register_globals off? Jest kilka sposobów:

  1. w pliku php.ini znajdź register_globals = on i zamień on na off. Niestety nie miałem dostępu do pliku głównego, ale można było swój lokalny plik stworzyć, o czym dalej.
  2. w .htaccess dodać linijkę:
    php_flag register_globals off
    Niestety u mnie wywaliło tylko Intenal Server Error
  3. Emulacja – ostatnia deska ratunku. Szczegóły tutaj.

Lokalny plik php.ini

Wywołując skrypt o treści:

<?php phpinfo(); ?>

otrzymamy pełną tabelę informacji m.in. to, gdzie przechowywany jest plik php.ini (pole Loaded Configuration File). Kopiujemy ten plik do katalogu gdzie podpięta jest nasza domena (lub subdomena) i wyszukujemy frazy register_globals. Zamieniamy On na Off i zapisujemy. Od teraz są wyłączone zmienne globalne dla całej domeny.

Dla sprawdzenia ponownie wywołajmy skrypt z informacjami phpinfo. Pole Loaded Configuration File powinno wskazywać na katalog domeny.

Na koniec jeszcze w pliku .htaccess dodajemy  perę linijek ukrywających przed wścibskimi pliki .htaccess i .htpasswd oraz php.ini

<Files ~ "^\.ht|php.ini">
order allow,deny
deny from all
</Files>

Komentarze nie są dozwolone.