Hoi,
Toen ik dit script aan een aantal mensen liet zien zeiden ze dat dat gevaarlijk was, als je dan naar ?p=../../../../../../etc/passwd gaat dat je dan mijn server kan hacken. Maar ik ben het daarmee oneens want in de eerste 10 regels van het script word er gecontroleerd welke files in het mapje pages zit, later word dan gekeken of het bestand wat aangevraagd word en in de array zit.
Codeblok (voorbeeld.php):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(isset($_GET[p])) {
$allowedPages = array();
$openDir = opendir(./pages/);
while(false !== ($entry = readdir($openDir))) {
$allowedPages[] = $entry;
}
closedir($openDir);
$_GET[p] = preg_replace(/([^.]+)(?:.[^.]+)?$/, "$1.php", $_GET[p]);
$_GET[p] = preg_replace(/.[^.]+$/, .php, $_GET[p]);
if(in_array($_GET[p], $allowedPages)) {
include ./pages/.$_GET[p];
} else {
header("HTTP/1.0 404 Not Found");
header("Location: ./404");
exit();
}
}
?>
Is het nou veilig of niet?
Toen ik dit script aan een aantal mensen liet zien zeiden ze dat dat gevaarlijk was, als je dan naar ?p=../../../../../../etc/passwd gaat dat je dan mijn server kan hacken. Maar ik ben het daarmee oneens want in de eerste 10 regels van het script word er gecontroleerd welke files in het mapje pages zit, later word dan gekeken of het bestand wat aangevraagd word en in de array zit.
Codeblok (voorbeeld.php):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(isset($_GET[p])) {
$allowedPages = array();
$openDir = opendir(./pages/);
while(false !== ($entry = readdir($openDir))) {
$allowedPages[] = $entry;
}
closedir($openDir);
$_GET[p] = preg_replace(/([^.]+)(?:.[^.]+)?$/, "$1.php", $_GET[p]);
$_GET[p] = preg_replace(/.[^.]+$/, .php, $_GET[p]);
if(in_array($_GET[p], $allowedPages)) {
include ./pages/.$_GET[p];
} else {
header("HTTP/1.0 404 Not Found");
header("Location: ./404");
exit();
}
}
?>
Is het nou veilig of niet?