Avatar billede AndreasSeierup Nybegynder
21. januar 2012 - 02:02 Der er 14 kommentarer og
1 løsning

Undgå Warning sider med htaccess eller php script?

Hej Allesammen

Jeg sidder lidt i et dilemma.. Jeg er frygtelig træt af warning sider! Fejlen kommer kun når siden ikke findes.. Derfor, jeg skal bruge en "tjekker" af en art - som kan tjekke om siden findes eller ej.

Jeg er helt blank på hvordan jeg skal løse det, når jeg bruger den php isset jeg gør.. (jeg er modtagelig overfor andre måder at køre page include på)

Min nuværende kode er:
[code]
<?php
if (isset($_GET['page'])) {
  $pages = $_GET['page'];
  include('MAPPE/' . $pages . '.FILTYPE');
  } else {
  include('MAPPE/FILNAVN.FILTYPE');
  }
?>
[/code]

Den kode, giver en warning som f.eks. denne:
Warning: include(MAPPE/FILNAVN.FILTYPE) [function.include]: failed to open stream: No such file or directory in /*/*
/*/*/FILNAVN.FILTYPE on line **

Nogen af jer der kan hjælpe med en løsning?
Avatar billede DeeDawg Nybegynder
21. januar 2012 - 06:42 #1
Så er det jo godt, at PHP allerede giver dig midlerne. :)

<?php
    if(isset($_GET['page'])){ $pages = "mappe/".$_GET['page'].".php"; }
    if(isset($pages) && file_exists($pages)){
        include($pages);
    } else {
        include("mappe/fallback.php");
    }
?>
Avatar billede AndreasSeierup Nybegynder
21. januar 2012 - 11:50 #2
Det er nemlig rigtigt! Tænk sig at det var så simpelt - tror det var blevet for sent i går.. tak - for det :) Smid en svar så får du lidt point :)
Avatar billede DeeDawg Nybegynder
21. januar 2012 - 13:46 #3
Det var så lidt. ;)
Avatar billede olebole Juniormester
21. januar 2012 - 16:08 #4
<ole>

Bemærk: Eksemplet i #1 er kun et eksempel - og ikke et særlig pædagogisk et!

Hvis du bruger koden, som den er, garanterer jeg dig, du før eller siden bliver hacket. Du må aldig inkludere sider kritikløst. Du skal kontrollere, det pågældende dokument overhovedet må inkluderes.

Med den viste kode kan alle PHP-dokumenter på serveren inkluderes - også udenfor serverens webspace

/mvh
</bole>
Avatar billede AndreasSeierup Nybegynder
21. januar 2012 - 22:14 #5
@olebole

Det er jeg opmærksom på. Scriptet skal udelukkende bruges på min egen side og hans eksempel kunne præcis det jeg skulle bruge det til.

Tak for tippet alligevel.
Nu hvor du nævner det, kan du komme med et script som ikke kan hente eksterne ind? :-)
Avatar billede olebole Juniormester
21. januar 2012 - 22:36 #6
Hvis andre kan komme ind på sitet, er der ingen tvivl om, at du vil blive hacket! fremgangsmåden er rent selvmord!

Du er herfra på niveau med en stangstiv spøgelsesbillist, der prøver at tænde en joint med den ene hånd, mens han spiller russisk roulette med den anden ... bortset fra, at hans - og ikke mindst hans omgivelsers - odds er langt bedre!

Problemet er sådan set ikke, at dit site og dets indhold bliver ødelagt. Det kan jeg være rystende ligeglad med. Problemet er, at du udsætter resten af nettets brugere for uforvarende at havne på din side og blive inficeret med alskens vira - fordi du ikke finder det værd at prioritere din og andres sikkerhed.

Hvordan tror du, man spreder computervira?  *o)
Avatar billede olebole Juniormester
21. januar 2012 - 22:47 #7
Løsningen kunne være noget i stil ned:

    $allowedPages = array(
        "mappe/forside.php" => 1,
        "mappe/omos.php" => 1,
        "mappe/produkter.php" => 1,
        "mappe/kontakt.php" => 1
    );
   
    if (isset($_GET['page'])) {
        $page = "mappe/".$_GET['page'].".php";
        if ($allowedPages[$page]) {
            include($pages);
        } else {
            include("mappe/fallback.php");
        }
    }

Her er brugt et array som 'hash table', men det kunne også være et DB-opslag, som afgør, om dokumentet må inkluderes. Du skal bare sikre dig, brugeren ikke har skrevet:

http://domain.dk/side.php?page=../../sti/til/noget/forbudt

- og derved får adgang til noget komplet uforudsigeligt og potentielt farligt
Avatar billede olebole Juniormester
21. januar 2012 - 22:51 #8
Hmmm ... der gik lidt ged i $page og $pages under copy/paste og rettelser  =)

    $allowedPages = array(
        "mappe/forside.php" => 1,
        "mappe/omos.php" => 1,
        "mappe/produkter.php" => 1,
        "mappe/kontakt.php" => 1
    );
   
    if (isset($_GET['page'])) {
        $page = "mappe/".$_GET['page'].".php";
        if ($allowedPages[$page]) {
            include($page);
        } else {
            include("mappe/fallback.php");
        }
    }
Avatar billede DeeDawg Nybegynder
23. januar 2012 - 01:32 #9
Der er korrekt at der er et sikkerhedshul, hvis folk opbevarer PHP-filer uden for deres webroot, så det skal der selvfølgelig tages højde for.

Hvis man har mange filer, giver det dog en masse arbejde, hvis man skal skrive hver enkelt fil ind i sit array. Det kan man jo selvfølge få PHP til at gøre for en, men jeg ville nok hellere køre $pages igennem en preg_match(), og sørge for at man ikke kan gå tilbage i mappe niveauerne, på den måde som olebole beskriver.

<?php
    if(isset($_GET['page'])){ $pages = "mappe/".$_GET['page'].".php"; }
    if(isset($pages) && preg_match("#\.+/#", $pages) === 0 && file_exists($pages)){
        include($pages);
    } else {
        include("mappe/fallback.php");
    }
?>
Avatar billede olebole Juniormester
23. januar 2012 - 02:06 #10
Jamen, det er da ikke kun PHP-filer udenfor webroden. Det er alle filer på serveren, der kan inkluderes på den måde - og brugeren bestemmer suverænt!

Din anden kode er ligeså dårlig. For det første udelukker du ganske valide filnavne med punktum i navnet. Desuden - og det er langt værre - begår du sikkerhedsfejl #1: Du prøver at forudse, hvordan og med hvad en hacker vil angribe dig. Det er en tabt kamp på forhånd. De vil altid være et par skridt foran dig og din fantasi.

Den gængse regel lyder, at du ikke må koncentrere dig om, hvilke tegn/data du ikke vil modtage.

I stedet skal du helt entydigt definere, hvilke tegn/data du vil modtage - og så forkaste alt andet.

Det er to fundamentalt forskellige tilgange, hvor den sidste er den eneste af de to med håb for success.
Avatar billede DeeDawg Nybegynder
23. januar 2012 - 07:45 #11
Når man selv smider .php bagpå, hvadend brugeren har skrevet, vil jeg gerne vide hvordan du kan få file_exists() til at give et positivt resultat, hvis filen ikke er en PHP fil.

Tror du skal have opdateret din viden om regulære udtryk, fordi det mønster du ser her, matcher kun et eller flere punktummer, der er efterfulgt af en / .
Avatar billede olebole Juniormester
23. januar 2012 - 12:38 #12
Jeg fik udtrykt mig lidt unøjagtigt. Jeg burde have skrevet: "Jamen, det er da ikke kun PHP-filer udenfor webroden. Det er alle PHP-filer på serveren, der kan inkluderes på den måde - og brugeren bestemmer suverænt!" - og PHP-filer er jo den primære frygt at få inkluderet.

Derudover er din opfattelse af egen ufejlbarlighed alvorligt overdrevet! Og det er jo netop min pointe: Uanset, hvor overbevist du er om det modsatte, kan du ikke gennemskue, hvordan og med hvad du bliver angrebet.

http://domain.dk/document.php?page=%26%2346%3B%26%2346%3B/%26%2346%3B%26%2346%3B/farlig/hemmelig/fil


BANG! ... du er død!

Det er muligt, du er overbevist om min manglende kendskab til regulære udtryk - men måske du i stedet skulle dæmpe arrogancen lidt og overveje at begynde at lytte ... og lære  *o)
Avatar billede DeeDawg Nybegynder
23. januar 2012 - 13:55 #13
For satan, den gjorde nas! ;)


For at være helt ærlig olebole, så var #11 intet andet end provokation, fordi jeg på daværende tidspunkt ikke var klar til selv at erklære #9 for en brainfart af dimensioner. Et indlæg der ikke burde have været skrevet, og et tegn på at jeg nok hellere skulle passe min sengetid end at stene rundt på Eksperten.dk og den mærkelige del af YouTube.

Du har helt ret - #1 var et eksempel, og derefter burde jeg bare have holdt min kæft, når de voksne snakker. Beklager, men man kan vel håbe at man vokser op en dag.


Har du nogen gode fifs? :)
Avatar billede olebole Juniormester
23. januar 2012 - 14:19 #14
That's okay. Ofte ser en problematik enkel ud - og så gemmer der sig i virkeligheden nogle slemme begmænd lige under overfladen. Vi skal alle lære, og vi har en tilbøjelighed til at være 'kloge', indtil vi har lært  *o)

I virkeligheden er den kode, jeg viste i #12, slet ikke så farlig endda. Hvis du skriver $pages ud, ser adressen rigtig nok ud - men den vil ikke inkludere noget. Det er entities for et punktummer, jeg har kørt gennem encodeURIConponent, od de skrives korrekt ud i HTML - men PHP læser tegnene som punktummer ("Ofte ser en problematik enkel ud" .., jaja, den er jeg skam også selv uderlagt!)  :D

Til gengæld kan du bare backslash'e:

http://domain.dk/document.php?page=..\/..\/farlig/hemmelig/fil

- og det virker ved include (og smutter gennem din RegExp)!

Anyway, så er jeg en total amatør udi hacking. Der er langt værre bøh-tosser derude.

Moralen er defor stadig: Vi kan ikke overskue, hvordan og med hvad vi bliver angrebet. Derfor skal vi definere, hvad vi vil modtage og forksate resten  *o)
Avatar billede olebole Juniormester
23. januar 2012 - 14:21 #15
Ups ... "Det er entities for et punktummer, jeg har kørt gennem encodeURIConponent, og de skrives korrekt ud i HTML - men PHP læser ikke tegnene som punktummer"  *o)
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