Emulacja register_globals



W dobie starszych wersji języka PHP powszechnie stosowano „standardowe” jak na tamte czasy ustawienie register_globals = on. Nie będę poruszał tutaj kwestii niebezpieczeństwa związanego ze stosowaniem takich ustawień… Fakt faktem, tak było. Dlatego wielu projektantów, szczególnie tych ze złymi nawykami, odwoływało się do zmiennych bezpośrednio, pomijając _GET, _POST itd.

Niebawem coraz bardziej powszechny stał się PHP w wersji 5, ze standardowo wyłączoną autorejestracją zmiennych globalnych. Nagle okazało się, że część z serwisów po prostu przestała działać ze względu na właśnie błędne odwołania do zmiennych. Dobrze, jeżeli serwer umożliwiał włączenie register_globals. A co, jeżeli nie?

Ostatnio dostałem w swoje ręce serwis internetowy napisany z 5-7 lat temu (nie wiem dokładnie, nie ja go tworzyłem) ze zleceniem uruchomienia go na serwerze z PHP 5 i register_globals = off. I jak na nieszczęście, funkcja ini_set nie działa…

Napisałem taki oto prosty skrypt, który wkleiłem do pliku app_top.php (includowany do każdego pliku) który w genialny sposób emuluje nam ustawienie register_globals = on.


if (!ini_get('register_globals')) {
$superglobals = array($_SERVER, $_ENV,
$_FILES, $_COOKIE, $_POST, $_GET);
if (isset($_SESSION)) {
array_unshift($superglobals, $_SESSION);
}
foreach ($superglobals as $superglobal) {
extract($superglobal, EXTR_SKIP);
}
}
?>

A dodatkowo zabezpieczając skrypty uruchamiane na serwerze z już włączoną autorejestracją zamiennych globalnych, można użyć:


function unregister_GLOBALS()
{ if (!ini_get('register_globals')) {
return;
}
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS']))
{ die(’GLOBALS overwrite attempt detected’);
}
$noUnset = array(’GLOBALS’, ‘_GET’,
‘_POST’, ‘_COOKIE’,
‘_REQUEST’, ‘_SERVER’,
‘_ENV’, ‘_FILES’);
$input = array_merge($_GET, $_POST,
$_COOKIE, $_SERVER,
$_ENV, $_FILES,
isset($_SESSION) &&
is_array($_SESSION) ? $_SESSION : array());
foreach ($input as $k => $v) {
if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {
unset($GLOBALS[$k]);
}
}
}
unregister_GLOBALS();
?>

Mam nadzieję, że komuś się to przyda – wprawdzie czegoś takiego się już nie stosuje, aczkolwiek w sytuacji, w której ja się znalazłem, myślę, że materiał może okazać się pomocny.