Avatar billede cmau Nybegynder
28. august 2006 - 13:57 Der er 13 kommentarer og
1 løsning

Tillad ikke sider som ikke er på serveren.

Hejsa

Jeg bruger denne kode til at includere mine sider til indholdssiden:
                    <?
                    if(!empty($_GET['page'])) {
                        $page = $_GET['page'];
                    } else {
                        $page = '';
                    }
                    if($page != '') {
                        if(file_exists($page)) {
                            include($page);
                        } else {
                        include('warning404.php');
                        }
                    } else {
                        include('frontpage.php');
                    }
                    ?>

Men blev lidt bange, da jeg kom til at tænke på at man kan skrive http://www.site.com/fil.php også evt misbruge siden. Hvordan kan jeg gøre sådan at det sakl være inden for mit domæne?
Avatar billede coderdk Praktikant
28. august 2006 - 14:00 #1
Kan du ikke bare lave: $page = basename( $_GET['page'] );
Det kræver dog at alle sider ligger samme sted (i roden i dit tilfælde)...
Avatar billede iss Novice
28. august 2006 - 14:04 #2
Sæt noget foran og bag...

F.eks læg alle dine sider i biblioteket pages:
$page = !empty($_GET['page'])?$_GET['page']'frontpage';
if(file_exists("pages/".$page.".php")) {
    include("pages/".$page.".php");
}
else {
    include('pages/warning404.php');
}
Avatar billede barklund Nybegynder
28. august 2006 - 14:07 #3
Værre endnu er muligheden for at skrive ?page=php://input - så bliver det først sjovt :)

--
Morten Barklund
Avatar billede cmau Nybegynder
28. august 2006 - 14:15 #4
Alle filer kan ikke lægge i samme mappe. :S.. Kan man ikke tjekke for http https osv.?

Barklund hvad mener du?
Avatar billede barklund Nybegynder
28. august 2006 - 14:23 #5
cmau, hvis du laver en include("php://input") (hvilket du jo kommer til), så bliver indholdet af en eventuelt POST-forespørgsel læst ind som PHP. Og så kan jeg på ret få sekunder ødelægge hele dit site ;)

Lav det med fil-aliaser. Det er lidt besværligere, men så har du lavet en "whitelist" over godkendt filnavne. Det er meget nemmere end en "blacklist" som du selv foreslår:

switch ($page) {
case "side1":
  include("side1.php");
  break;
...
}

Ellers kan jeg jo også hurtigt lave rod ved at åbne index.php?page=index.php og den slags :)

--
Morten Barklund
Avatar billede coderdk Praktikant
28. august 2006 - 14:24 #6
Kan du bruge dette:

    $root = dirname( __FILE__ );
    $page = ( !empty( $_GET['page'] ) ? $_GET['page'] : 'index.php' );
    $page = realpath( $page );
    if ( substr( $page, 0, strlen( $root ) ) != $root )
    {
        $page = '404error.php';
    }
    include( $page );
Avatar billede cmau Nybegynder
28. august 2006 - 14:25 #7
damn, vhad såhvis alle filer lå en i bestemt mappe, kunne man så undgå dette?
Avatar billede coderdk Praktikant
28. august 2006 - 14:25 #8
Evt. som barkluund nævner:

    if ( substr( $page, 0, strlen( $root ) ) != $root && $page != __FILE__ )
    {
        $page = '404error.php';
    }
Avatar billede cmau Nybegynder
28. august 2006 - 14:29 #9
coderdk hvad skulle din kode gøre? Kan du forklare den
Avatar billede coderdk Praktikant
28. august 2006 - 14:32 #10
Selvfølgelig :)

    // Først tager vi den fulde sti til den folder hvor dette script er
    $root = dirname( __FILE__ );
    // Her sætter vi en default side, hvis ingen page er angivet
    $page = ( !empty( $_GET['page'] ) ? $_GET['page'] : 'defaultpage.php' );
    // Denne oversætter vi til en "rigtig" sti i filsystemet med realpath()
    // Findes filen ikke returnerer realpath() en tom streng
    $page = realpath( $page );
    // Her checker vi om filen starter med det samme som den fulde sti til den
    // folder hvor scriptet ligger i - med andre ord, den gør at du kun kan include
    // filer der er i samme folder eller dybere end den aktuelle folder - aldrig
    // under - altså ikke ../../osv - Desuden vil vi ikke tillade at man angiver
    // include scriptet som page
    if ( substr( $page, 0, strlen( $root ) ) != $root && $page != __FILE__ )
    {
        $page = '404error.php';
    }
    include( $page );
Avatar billede cmau Nybegynder
28. august 2006 - 14:36 #11
coderdk > Dvs at at man ikke kan lave rod i den som barklund beskriver?
Avatar billede coderdk Praktikant
28. august 2006 - 14:39 #12
Jeg kan ikke komme på nogen måde i hvert tilfælde :)
Avatar billede barklund Nybegynder
28. august 2006 - 14:48 #13
Jeg vil stadig rekommandere en whitelist frem for en blacklist. Jeg kan sikkert stadig lave rod i det tror jeg - smid lige et link til dit site, når du har lavet ovenstående ;)
Avatar billede cmau Nybegynder
28. august 2006 - 14:48 #14
siden ligger desværre kun på min lokale computer.
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