Co zrobić w przypadku gdy serwer ma włączone register_globals, i nie umożliwia zmiany tego ustawienia - jak wyłączyć tą funkcję?
Poniżej prosty sposób, który pozwala na zabezpieczenie naszego skryptu przed skutkami włączonego register_globals. Poniższą funkcję należy zdeklarować na początku skryptu, następnie zamiast
należy użyć nowo zdeklarowanej funkcji
- safe_session_start();
A oto i kod naszej funkcji:
- function safe_session_start() {
- // zabezpieczam zdefiniowane wcześniej zmienne globalne
- 'GLOBALS',
- '_SERVER',
- '_GET',
- '_POST',
- '_FILES',
- '_COOKIE',
- '_SESSION',
- '_REQUEST',
- '_ENV',
- );
- foreach ($GLOBALS as $varname => $varvalue) {
- // zachowuję wszystkie oprócz superglobals
- // z superglobals PHP sobie radzi poprawnie ponieważ nie nadpisuje ich przy włączonym register_globals
- }
- // z tych zmiennych register_globals korzysta
- '_SERVER',
- '_COOKIE',
- '_REQUEST', // zawiera łącznie _GET i _POST
- '_ENV',
- );
- // kasuję wszystkie globalne zmienne, oprócz superglobals
- // i zastępuję je dotychczasowymi zmiennymi globalnymi
- foreach ($register_global_vars as $remove_me) {
- $GLOBALS[$varname] = $local_globals[$varname];
- }
- }
- }
- } else {
- }
- return $return;
- }
Jak to działa?
Nie wystarczy zwykłe unset() wszystkich zmiennych globalnych które są podane w $_SERVER, $_REQUEST etc, jak to podają użytkownicy w komentarzach na php.net. W ten sposób możemy skasować zdefiniowane przez nas wcześniej w skrypcie zmienne globalne.
Powyższa funkcja zachowuje ich zawartość, omija także zmienne superglobalne, których PHP nie podmienia nawet jeśli są podane w np. GET lub POST.
Zalety: szybki i prosty sposób, i nie martwimy się jeśli session_start jest gdzieś w środku kodu czy w inkludowanym pliku, po zdeklarowaniu ważnych dla skryptu zmiennych globalnych.
UWAGA: należy pamiętać o zmianie we wszystkich plikach .php wywoływanych bezpośrednio przez żądanie przeglądarki (nie includowanych). Np. jeśli mamy osobny plik
- admin.php
i jest on wywoływany bezpośrednio a nie włączany do index.php, to również w admin.php musimy zadbać by funkcja
safe_session_start(); została zdeklarowana i użyta w zamiast session_start();.
Kod nie został przetestowany, jest to jedynie przykład teoretyczny.





