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:
- w pliku
php.ini
znajdźregister_globals = on
i zamień on naoff
. Niestety nie miałem dostępu do pliku głównego, ale można było swój lokalny plik stworzyć, o czym dalej. - w
.htaccess
dodać linijkę:
php_flag register_globals off
Niestety u mnie wywaliło tylko Intenal Server Error - 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>