path vereenvoudigen + baselocation

Status
Niet open voor verdere reacties.

RMS123

Gebruiker
Lid geworden
15 nov 2009
Berichten
873
Hoe doe je dit in PHP?
delphi.cjcsoft.net/viewthread.php?tid=44787

En ik heb nog en vraag:

Ik wil een functie die zorgt dat dit pad niet te bereiken is door bijv. filetime of scandir:
./Files/../index.php Je mag dus niet buiten de Files folder kunnen komen.

Nou kan ik die wel heel ingewikkeld schrijven maar ik weet nu al dat dat vrij makkelijk te omzeilen valt, bijvoorbeeld is dit te die door de verhouding ".."'s in een een path te berekenen/

Alvast bedankt!
 
Hoe doe je wat in PHP? Een lijst maken met tips? Ik zou gewoon beginnen met ze op te schrijven.

En als je wil dat dingen niet benaderbaar zijn door gebruikers van buitenaf, dan moet je een .htaccess file maken.
Als je wil dat dingen niet bereikbaar zijn door PHP moet je als admin van de webserver zijnde de rechten van de PHP user beperken, of je moet in je script controleren of het wel bepaalde files mag bekijken.
 
Nee, totaal niet wat ik bedoelde door een misverstand:
De link is veranderd helaas dat plaatje interesseert niks
Wat daar nog onder stond ging over het volgende:
./Files/../Data/../andere bestanden/./index.php
Dit is een extreem lange padnaam die verwijst naar:
./andere bestanden/index.php
Hoe vereenvoudig ik dus het pad?

En die rechten bedoel ik ook niet, dat gebeurt al door htaccess kan niemand daarbij komen.
Maar het is een CMS met daarin een file-verkenner. Die is op ene pad gebaseerd, en nu wil ik IN PHP weten hoe je een pad controlleerd f die in een bepaalde folder zit. en dus niet met ".." er buiten gaat!
 
Makkelijkste is om gewoon een scan op de string te doen om te kijken of er .. in staat en dat niet toe te staan. Je kunt gewoon een strpos( $path, '..' ) === false doen, dan zit er geen .. in en mag je doorgaan.
 
Nou dan beperk je ook andere funties, da's niet handig, .. is een veelgebruikt element, ook in cms's
 
Dan zul je zelf moeten gaan puzzelen en een functie of class maken die precies regelt waar je wel en niet mag komen en dat afleidt uit de opgegeven string. Als er geen eenvoudige regel is om te zien of iets wel of niet toegestaan is, dan gaat er ook geen eenvoudige manier zijn om dat af te dwingen.
 
Is er een methode om de controleren of een bepaald bestand of path IN een dir ligt?
 
Niet dat ik weet. Hoe zou je dat willen controleren? Dat is aan het gehele pad gebonden, want er is geen garantie dat er geen verschillende mappen met bijv dezelfde naam bestaan. Dan zou je aan een vrij complex systeem komen en die zijn meestal niet standaard gebouwd.

Denk dat je toch even zelf een class zult moeten maken voor dat soort controles.
 
PHP:
$path = $_GET["path"];
echo simplify_path($path);
function simplify_path ($input) {
	$stringtemp = getcwd();
	if (is_dir(getcwd() . "/" . $input)) {
		$chdir($input);
		$toreturn = getcwd();
		$chdir($stringtemp);
		return $toreturn;
	} else {
		return "FOUT!!!!";
	}
}
Code:
Fatal error: Function name must be a string in /home/u127935063/public_html/TESTING_ZONE/new.php on line 7 ( 6 hier overigens)
Dit werkt niet, kan iemand mij uitleggen waarom?

Edit:

Mijn theorie hierachter is dat PHP zich eerst verplaatst naar die locatie, en dan de locatie ophaalt, en dan weer terug gaat.
Dit zou eventueel ook kunnen met een temp. file? zou dat beter werken?
 
Laatst bewerkt:
Ik heb van bovenstaande post nog niet gechecked of het werkt maar heb wel de andere functie bedacht en uitgewerkt:
PHP:
function count_dir_changes ($input, $type) {
    //////////////////////////////////////////////////
    // count_dir_changes (Input_Path, Output_type); //
    //////////////////////////////////////////////////
    // Use:                                         //
    //  - $input is the path you want to check.     //
    //  - $type must be:                            //
    //      > "min" if you want the deepest dir in  //
    //              the path.                       //
    //      > "max" if you want the upper dir in    //
    //              the path.                       //
    //      > "num" if you want the total directory //
    //              changes made in the path.       //
    //              the path.                       //
    //                                              //
    //  - Returns an int.                           //
    //  - Input MUST be a Directory!                //
    //                                              //
    //////////////////////////////////////////////////
    //                      RMS.x95                 //
    //////////////////////////////////////////////////
    
    if (is_dir ($input)) {
        $dirs = split ("/", $input);
        $dircounter = 0;
        $min = 0;
        $max = 0;
        foreach ($dirs as $dir) {
            switch ($dir) {
                case "":
                    break;
                case ".":
                    break;
                case "..":
                    $dircounter--;
                    break;
                default:
                    $dircounter++;
                    break;
            }
            if ($dircounter > $max) {
                $max = $dircounter;
            }
            if ($dircounter < $min) {
                $min = $dircounter;
            }
        }
        switch ($type) {
            case "min":
                return $min;
                break;
            case "max":
                return $max;
                break;
            case "num":
                return $dircounter;
                break;
            default:
                return "The function has a incorrect input!";
                break;
        }
    }
}
(not debugged yet)

De theorie hierachter:
Er zijn in een directorypath 4 mogelijkheden dat tussen 2 slashes kan staan
1 niks: dan gebeurt er niks;
2 ".": dan gebeurt er niks;
3 "..": dan gaat de dir 1 omlaag;
4 "anything": dan gaat die een folder up: 1 omhoog;
Er zijn niet meer mogelijkheden toch? behalve de slash vooraan?

Verder zijn er 3 outputs mogelijk, maar dat spreekt voor zich.

mvg,
RMS.x95

PS: uiteraard 100% zelf gemaakt en zoals ik al zei nog niet gedebugged! dus er zullen nog wel wat kleine foutjes in kunnen zitten
 
Laatst bewerkt:
Gebruik gewoon een combinatie van de functies realpath() & strpos() om te kijken of je onder een bepaalde directory werkt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan