Voorbeeld van een veiligheidslek
Ik zie regelmatig dat mensen iets willen uitrekenen uit een formulier of uit een GET. De opgave laten ze dan in één veld ingeven en PHP mag het dan even uitrekenen. Dat uitrekenen kan je doen met eval(). Echter, dit is een veiligheidslek. Ik laat dit hieronder even zien.
Stel je hebt een script, zoiets als onderstaand.
Als je niet bent ingelogd moet je eerst inloggen. In dit script set ik $_SESSION['id'] even als zijnde het id van de ingelogde gebruiker. Daarna wordt de opgave, in dit geval een vermenigvuldiging, opgehaald uit een GET. De uitkomst wordt berekend met eval(). Onderaan het script wordt nog even het id van de ingelogde gebruiker getoond.
Niets aan de hand met dit soort input:
index.php?opgave=3x5
index.php?opgave=6*9
Maar wat gebeurt er als dit wordt ingegeven?
index.php?opgave=3x5;$_SESSION['id']=200
Dan ben je dus opeens ingelogd onder iemand anders zijn account.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
session_start();
// even een fake login en de session setten
if(!isset($_SESSION['id']))
{
$_SESSION['id'] = 100;
}
// de uit te rekenen opgave ophalen
if(isset($_GET['opgave']))
{
$opgave = $_GET['opgave'];
}
else
{
$opgave = '3x5';
}
// opgave uitrekenen
eval('$uitkomst=' . str_replace('x', '*', $opgave) . ';');
echo 'Uitkomst is ' . $uitkomst . '<br />';
// het gebruikers-id laten zien
echo 'Gebruikers-ID is ' . $_SESSION['id'] . '<br />';
?>