realpath sicher?

Chakky

Member of Honour
Hi,
ich bin gerade auf die funktion realpath(); gestoßen kurz das php handbuch gewältzt bissel informiert nur jetzt hab ich folgende frage:

bei foglendem code
PHP:
$seite = $_GET['site'];

$seite = realpath($seite".php");

include($seite);

kann man nicht einfach in ein höheres verzeichnis springen und/oder mit %00 als endung eine beliebiges file aufrufen wie zum bsp /etc/passwrd

sehe ich das richtig?

also ist die funktion "100%" sicher?

danke :)
 
Prüfe doch die Variable "$seite", wenn sie mit realpath bearbeitet ist noch, ob der der Pfad "dein unterdateienordner\" im String vorkommt. Der Befehl heisst glaubich strstr();
 
Hallo,
nein die Funktion ist ___nicht____ sicher. Man darf ____nie___ den User bestimmen lassen, welche Seite eingebunden wird. Du musst immer eine List haben, mit Dateien, die eingebunden werden dürfen, ohne Probleme zu verursachen.
Alles andere ist unsicher.
 
Original von Elderan
Hallo,
nein die Funktion ist ___nicht____ sicher. Man darf ____nie___ den User bestimmen lassen, welche Seite eingebunden wird. Du musst immer eine List haben, mit Dateien, die eingebunden werden dürfen, ohne Probleme zu verursachen.
Alles andere ist unsicher.

also eine whitelist?

wie würde ein evtl falsches includen aussehen wenn ich einfach ./../../hoeheres_verzeichnis/tst versuche zu includen geht das nich

im handbuch steht ja auch das "./" etc ausgefiltert werden...
 
wenn nur ./ ausgeschlossen werden, könnte sowas wie

'eineseite.php\");$seite=\"eineandereseite'

funktionieren. also muss nicht, aber möglich wäre es und vielleicht gibt es ja auch andere möglichkeiten, das zu umgehen. letztendlich muss man immer alles prüfen, wo der user manipulieren oder eingeben kann!

irgendwo hier im board gabs auch schon mindestens einmal den vorschlag, nur zahlen oder wörter zu übergeben, und dann in einem array den passenden link zu hinterlegen. dann kann definitiv niemand darüber ne nicht von dir autorisierte seite aufrufen
 
Original von Chakky
im handbuch steht ja auch das "./" etc ausgefiltert werden...
"Herausfiltern" ist hier aber nur kosmetisch zu verstehen. Der Pfad wird so berechnet, dass keine ../ oder ./ darin vorkommen, bleibt aber ansonsten identisch. realpath() bietet so jedenfalls keinerlei Schutzfunktion.
 
Also ich habs z.B. inner Navi bei mir so gelöst:


Code:
<?php

    $seiten = Array();

    $seiten[] = "willkommen";
    $seiten[] = "impressum";
    $seiten[] = "gaestebuch";
    $seiten[] = "news"; 
    $seiten[] = "thatsme";
    $seiten[] = "faq";
    $seiten[] = "sponsoren";
    $seiten[] = "videos";    
    
    if (isset($_GET['section']) && !empty($_GET['section'])) {

        if ( in_array($_GET['section'], $seiten) && file_exists("site/module/" . $_GET['section'] . ".php") ) {
            include("site/module/" . $_GET['section'] . ".php");
        } else {
            echo "404. Seite nicht gefunden.";
        }
    } else {
        include("site/module/" . $seiten[0] . ".php");
    }

?>

vllt hilfts als Denkanstoss!

GreeTz
Domi
 
ich hatte den code nur in ner seite gefunden :)

habs auch mit ner white liste gemacht bei mir
 
Zurück
Oben