Avatar billede chrisrj Forsker
11. december 2018 - 14:57 Der er 8 kommentarer og
1 løsning

Tjek at sti ikke er del af anden sti

Hejsa

Jeg laver mig en rekursiv funktion, som helst ikke bør gå amok. :D

Så hvordan tjekker man om en given sti er indeholdt i en anden sti?

Lige nu har jeg disse tjeks:
if ($src === '/' || $src === $_SERVER['DOCUMENT_ROOT'] || (!is_dir($src))) { // check for errors/misuse
            throw new InvalidArgumentException("Source path must be a directory");
        }
        if ($dst === '/' || $dst === $_SERVER['DOCUMENT_ROOT'] || (!is_dir($dst))) { // check for errors/misuse
            throw new InvalidArgumentException("Destination path must be a directory");
        }
        if ($dst === $src) { // check for errors/misuse
            throw new InvalidArgumentException("Destination and Source paths must be different");
        }
Avatar billede ejvindh Ekspert
11. december 2018 - 20:46 #1
$a = 'How are you?';
$b = 'are';
if (strpos($a, $b) !== false) {
    echo 'b-variablen er en del af a-variablen';
}
Avatar billede acore Ekspert
11. december 2018 - 22:29 #2
#1: Et path kan være absolut eller relativt, og xxx er det samme som xxx/../xxx, så almindelig string comparison duer ikke.

Men php’s realpath() gør det:

realpath($dst) == realpath($src)
Avatar billede chrisrj Forsker
11. december 2018 - 22:46 #3
Desværre vil ingen af de forslag dække.

Eksempel:
Mappe struktur (punktum = undermappe):
mappe1
.mappe2
..mappe4
.mappe3
..mappe5
...mappe6

Hvis sti1 = mappe2 og sti2 = mappe4, så er sti2 indeholdt i sti1, da stien skal køres igennem i alle undermapper - beklager, at det nok ikke var helt klart fra starten af.
Avatar billede ejvindh Ekspert
12. december 2018 - 11:57 #4
Handler det så ikke bare om, at du laver en streng med den fulde sti (vha realpath) til "sti1" og en streng med den fulde sti til "sti2" -- og du så bagefter tester for, om "sti2" starter med det samme som "sti1"? (strpos === 0)
Avatar billede chrisrj Forsker
12. december 2018 - 11:58 #5
Jamen, det kan da godt være. Jeg prøver. :)
Avatar billede chrisrj Forsker
12. december 2018 - 12:20 #6
Dette virker:

if (strpos(realpath($basepath), realpath($pathToCheck)) === 0) { echo "included<br>"; } else { echo "not included<br>"; }

Men kun med stier der eksisterer...realpath er ikke problemfri.


hvis jeg skriver realpath('../v0.1'); som ikke eksisterer, giver den stien til mappen som koden ligger i...!

Hvordan fanger jeg dét case?
Avatar billede ejvindh Ekspert
12. december 2018 - 13:19 #7
Ok, så er du jo nok nødt til at indføre et check på om mapperne eksisterer først. Det kan du gøre enten med realpath selv, eller med file_exists. Nu er jeg ikke lige sikker på, om det både kan være $basepath og @pathToCheck -- men hvad med fx:

if (realpath($basepath) && realpath($pathToCheck)) {
  if (strpos(realpath($basepath), realpath($pathToCheck)) === 0) { echo "included<br>"; } else { echo "not included<br>"; }
} else {
  echo "At least one of the paths does not exist<br>";
}
Avatar billede chrisrj Forsker
12. december 2018 - 13:36 #8
Yup, SÅ virker det med fake stier. :)

Jeg takker og bukker. :)
Avatar billede ejvindh Ekspert
12. december 2018 - 14:29 #9
Jeg velbekommer ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester