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.iniznajdźregister_globals = oni 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
.htaccessdodać 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>