Avatar billede mxs Nybegynder
28. marts 2004 - 18:23 Der er 11 kommentarer og
1 løsning

Jeres råd. Hvordan vil i gøre det her? Tjekke en string

Hey eksperter

I min url står der følgende

index.php?p=vis_mappe&map=pics

Det jeg har lavet er et script som tjekker en mappe igennem for filer. Det eneste jeg mangler er at sikre scriptet så man ikke kan skrive

index.php?p=vis_mappe&map=../../../ og derved komme ud hvor man ikke må være.
Jeg har nogenlunde sikret mit script så hvis man skriver

index..php?p=vis_mappe&map=
så kommer man til startmappen som jeg vil have.

Det jeg vil sikre er at man ikke kan skrive ../. Hvis man gør det så kommer man til startsiden.

Jeg havde tænkt mig at tage map ned og søge den igennem for ../ men er der en anden måde? Som er mere sikker for du kan jo bare skrive ascii tegn eller andet.

Håber i forstår mit spørgsmål!!
Avatar billede mxs Nybegynder
28. marts 2004 - 18:26 #1
Altså kan man ikke bare lave et array_search og søge efter ../ eller ascii tegn for ../? Er der mere man kan være bange for?
Avatar billede fangel Nybegynder
28. marts 2004 - 18:43 #2
start med at urldecode strengen, bare for at man ikke kan fuske via ancii tegn... derefter bare søg efter ".."

Det er en letteste måde at lave og vedligeholde - MEN, as said den kan nok by-passes hvis man ved nok om sagen...

Den sikreste metode er at tjekke mappenavn mod et harc-codet array af mapper...

dvs

$mapperDerMaaVises[] = 'pics';
$mapperDerMaaVises[] = 'videos';
osv...

og så tjekke via in_array(str needle, array haystack) (mind me hvis jeg har byttet rundt) om mappen findes i arrayet over mappe der må lists...

Det er den sikrste måde at lave det på, for hvis en angriber skal kunne liste mapper "under" den mappe man er i skal de første ændre i PHP script og ændre arrayet... Det samme skal du så bare, så hvis du tilføjer mapper skal du også tilføje til arrayet...

Morten
Avatar billede mxs Nybegynder
28. marts 2004 - 18:54 #3
Altså jeg kan jo starte med at urlencode den.
tegnet / bliver så skiftet ud med %xx tegn og jeg kan derefter søge efter ..

Nu er jeg brugeren som misbruger php.net og jeg har enten drømt eller set at man kan søge en string igennem for matchende ord eller tegn, men jeg kan ikke huske funktionen.
Avatar billede ljm21 Praktikant
28. marts 2004 - 19:24 #4
Du kan fjerne skråstregerne med:
$map=str_replace("%xx","",$map);

hvor %xx er ascii-koden for /. Husk også \.

Lars
Avatar billede mxs Nybegynder
28. marts 2004 - 19:52 #5
Jeps ved godt hvordan jeg fjerner / osv. Er ike nygebnyder:D Men jeg vil urlencode den så / bliver til ascii og man derefter bare har ..
Hvis .. er i den så skal det bevirke at den bare sender en til base igen, altså til den mappe som jeg har sat til at være begynder mappe. Hvis jeg lod være med at gøre noget kunne man jo blive ved med at skifte tilbage i systemet med ../

Jeg kom til at tænke på om jeg ikke kunne bruge .htaccess? Altså min start mappe ligger jo i en mappe og hvis jeg lader min start mappe og undermapperne være åben for alle. MEN den mappe som min start mappe ligger i spærrer jeg så med en .htaccess. Kan jeg ikke også gøre det sådan??
Avatar billede ljm21 Praktikant
28. marts 2004 - 21:30 #6
Jeg tror ikke .htaccess er vejen frem, da den så vidt jeg husker kun virker ved html-forespørgsler og lignende.

Jeg tror måske du kan bruge denne til noget:
http://dk.php.net/manual/en/function.strpos.php

Lars
Avatar billede fangel Nybegynder
28. marts 2004 - 21:51 #7
strpos() (som ljm påpeger) returnere false hvis ordet ikke er fundet, søger efter ordet som det er
eregi() returnere false hvis mønstret ikke findes - søger via reg.exp.

Morten
Avatar billede coderdk Praktikant
29. marts 2004 - 01:24 #8
$secpath = '/sikker/rod/sti';
    $sti = realpath($secpath.$map);
    if (!ereg("^$secpath",$sti))
    {
        die("Access denied.");
    }
Avatar billede coderdk Praktikant
29. marts 2004 - 01:26 #9
Kort forklaring, din $secpath kan være "/home/mxs/filer", ereg'en checker at alle stier starter med denne sti, realpath sørger for at fjerne .. osv fra stien og "resolver" til den "ægte" sti.
Avatar billede sukos Juniormester
29. marts 2004 - 02:14 #10
Som coderdk, næsten

$sti = "/full/path/to/dir/";
if(isset($_GET["map"]) && is_dir($sti . $_GET["map"])) {
echo"ok";
}else{
echo"nix";
}

må jo være noget nemmere end at begynde at tjekke strengen $_GET[map"]
Avatar billede mxs Nybegynder
29. juli 2007 - 12:01 #11
Undskyld for at jeg ikke har svaret. Faktisk næste 4 år siden :) Nuvel. Sukos, jeg fandt faktisk, i tidernes morgen ud af at coderdks forklaring gav mig en kode, som var mere overskueligt at se på. Dette kan jeg huske, da jeg brugte metoden meget fremover til andre projekter.
Avatar billede coderdk Praktikant
29. juli 2007 - 12:21 #12
heheh bedre sent end aldrig ;)
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