Vreemde waardes als url parameter
Voor een download database op mijn website heb ik een scriptje in PHP geschreven welke via de $_GET() methode het "id" nummer van een aangeklikte link afvangt. Vervolgens wordt dat "id" nummer gebruikt om het juiste bestand erbij te zoeken. Het script dat ik hiervoor gebruik:
Code (php)
1
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
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
<?php
$id_number = $_GET['id']; // Verkrijg het ID nummer
$date = date('m/d/Y H:i:s', time()); // De datum van vandaag in Nederlandse tijd
$dir = './overzicht/gegevens/'; // Opslag locatie
$browser = $_SERVER['HTTP_USER_AGENT']; // Verkrijg de gegevens van de browser
$ip_adress = $_SERVER['REMOTE_ADDR']; // Verkrijg het IP adres van de gebruiker
$web_adress = array(
//Downloads:
"1" => "./downloads/algemeen/download1.rar",
"2" => "./downloads/algemeen/download2.rar",
//------Download aanvraag verder afhandelen
if (isset($web_adress[$id_number])) // Controleer of het id nummer voor komt in de array index
{
header('Location:' . $web_adress[$id_number]); // Browser doorverwijzen naar het adres uit de lijst
}
else // Bestaat het id nummer niet? Dan een fout melding en maak een logbestand aan...
{
echo "<strong>Error: </strong>" . "The file index: " . "<strong>$url_input</strong>" . " does not exist on this server!"; // Geef foutmelding weer
error_log("[" . $date . "] [Client] " . $ip_adress . " [Fout] Onbekend id nummer: " . $id_number . " [Browser] " . $browser . "\r\n", 3, $dir . "error_log.txt"); // Sla gebeurtenis op in een bestand
}
exit;
//-------------------
?>
$id_number = $_GET['id']; // Verkrijg het ID nummer
$date = date('m/d/Y H:i:s', time()); // De datum van vandaag in Nederlandse tijd
$dir = './overzicht/gegevens/'; // Opslag locatie
$browser = $_SERVER['HTTP_USER_AGENT']; // Verkrijg de gegevens van de browser
$ip_adress = $_SERVER['REMOTE_ADDR']; // Verkrijg het IP adres van de gebruiker
$web_adress = array(
//Downloads:
"1" => "./downloads/algemeen/download1.rar",
"2" => "./downloads/algemeen/download2.rar",
//------Download aanvraag verder afhandelen
if (isset($web_adress[$id_number])) // Controleer of het id nummer voor komt in de array index
{
header('Location:' . $web_adress[$id_number]); // Browser doorverwijzen naar het adres uit de lijst
}
else // Bestaat het id nummer niet? Dan een fout melding en maak een logbestand aan...
{
echo "<strong>Error: </strong>" . "The file index: " . "<strong>$url_input</strong>" . " does not exist on this server!"; // Geef foutmelding weer
error_log("[" . $date . "] [Client] " . $ip_adress . " [Fout] Onbekend id nummer: " . $id_number . " [Browser] " . $browser . "\r\n", 3, $dir . "error_log.txt"); // Sla gebeurtenis op in een bestand
}
exit;
//-------------------
?>
Nu kom ik in mijn error_log.txt meldingen tegen van vreemde waardes die niet voldoen als een geldig getal (integer).
Een voorbeeld: in plaats van een verzoek met een geldig getal 1, zijn er vreemde verzoeken geweest met 1'A=0 of -1'.
Hoe kan dat? Komt dit door browsers die een parameter in een url niet goed weten af te handelen of zijn dit verdachte waardes van kwaadwillenden?
Nu kan ik groot en deels oplossen door een filter erop los te laten welke alleen een geldig getal eruit filtert door de methode te vervangen met
Maar is dit verstandig en veilig om te doen?
Graag hoor ik jullie mening.
Gewijzigd op 09/02/2016 20:33:18 door Sandertje -
Je zult sowieso op een of andere manier moeten controleren of $id_number een geldige waarde bevat (en of $_GET['id'] uberhaupt bestaat). Anders hoef je niet eens te proberen iemand door te sturen.
Je zou filter_input kunnen gebruiken, maar volgens mij volstaat array_key_exists() (of simpelweg isset()) ook als ik van deze code uitga.
header('Location: ...') redirect je trouwens niet meteen naar de nieuwe locatie.
Thomas van den Heuvel op 09/02/2016 20:23:23:
Waar begint je if-statement ergens? :/
Mijn excuses. Het if-statement vergeten mee te kopiëren vanuit mijn script. Ik heb het bericht hierboven gelijk aangepast.
Ik neem aan dat de header('Location: ...') in dit geval nu wel op zijn juiste plek staat. Aangezien er na het if-statement geen verdere opdrachten worden aangeroepen. Of zie ik dit verkeerd?
Toch blijf ik mij afvragen waar die afwijkende waardes in "id" vandaan komen, terwijl ik enkel de volgende url's met de volgende inhoud gebruik: http://www.mijnwebsite.nl/download.php?id=1
Gewijzigd op 09/02/2016 20:49:04 door Sandertje -