php - problem med enkelt includescript

En tråd i 'PHP, SQL og databaser' startet av cromoglic, 23 Mar 2009.

  1. cromoglic New Member

    Innlegg:
    2
    Hei,

    Har en nettside som bruker divs som layout ( i hovedsak en header, footer, content og reklame), der index.php includer sider med samme navn som disse. I content.php har jeg et script som bruker ?side= til å velge hva som skal vises i content-diven. Istedet for å ha en laaaaaaang kode med en elseif for hver side som er tilgjengelig, tenkte jeg på å lage et enkelt system slik:
    Kode:
    $getVerdi = $_GET['side'];
    $folder = "content/";
    $filnavn = $folder . $getVerdi . ".php";
    $feilmld = "Beklager, siden du prøve å åpne eksisterer ikke.";
    
    if(!file_exists($filnavn)) {
    	$folder = "loginandadmin/";
    	$filnavn = $folder . $getVerdi . ".php";
    } elseif(!file_exists($filnavn)) {
    	$filnavn = $folder . $getVerdi . ".php";
    	$folder = "guestbook/";
    }
    
    if($_GET['side'] == NULL){
    	include("news.php");
    
    } elseif(file_exists($filnavn)) {
    		include ("$filnavn");
    	} else {
    		echo $feilmld;
    	}
    ?>
    Denne funker på første, $getVerdi = $_GET['side'];
    $folder = "content/";
    $filnavn = $folder . $getVerdi . ".php";
    $feilmld = "Beklager, siden du prøve å åpne eksisterer ikke.";
    , men vil ikke gå til neste mappe dersom filen ikke eksisterte i content/. Noen som kan hjelpe meg?:)
     
  2. Keanu

    Keanu Geek

    Innlegg:
    498
    Vel, først må jeg jo som er brukelig å si, at du bør bruke case-switch, og ikke wild-card-inkludering av filer. Om du uansett ønsker å bruke wildcard-inkludering, bør du sanitere input (renske den, google it).

    Men om du vil ha det som det er, så må du vel endre den første elseif-en din til en if, eller du må endre logikken i koden.
    Slik den er nå, så vil den først teste at den ikke er i første folder (content), og dermed er første if gylding. Dette gjør at aldri den andre elseif vil testes, kun hvis filen faktisk eksiterer (som jeg tror er motsatt av det du vil.
    Jeg er litt usikker på logikken i heletatt, spesielt siden du har en "guestbook"-folder som aldri vil bli brukt uansett slik det står nå.

    Legger til en snutt nedenfor for hvordan jeg tror du kanskje vil ha det, som du muligens kan bruke, men merk at denne er _uten_ sanitering. (Endra uten å teste, så ingen garantier)

    Kode:
    $getVerdi = $_GET['side'];
    $feilmld = "Beklager, siden du prøve å åpne eksisterer ikke.";
    
    $folder = "content/";
    $filnavn = $folder . $getVerdi . ".php";
    
    if(!file_exists($filnavn)) {
    	$folder = "loginandadmin/";
    	$filnavn = $folder . $getVerdi . ".php";
    }
    if(!file_exists($filnavn)) {
    	$folder = "guestbook/";
    	$filnavn = $folder . $getVerdi . ".php";
    }
    if(!file_exists($filnavn)) {
    	$filnavn = $folder . $getVerdi . ".php";
    }
    
    if($_GET['side'] == NULL){
    	include("news.php");
    
    } elseif(file_exists($filnavn)) {
    		include ($filnavn);
    	} else {
    		echo $feilmld;
    	}
    ?>
     
  3. cromoglic New Member

    Innlegg:
    2
    Skal se på det, takk;)

    Jo, logikken: Den setter $folder til content, og prøver å finne $getverdi.php i content. $filnavn blir deretter hele greia ilag ($folder + $getVerdi.php), og den sjekker så om dette eksisterer. Dersom filen ikke skulle eksistere i content, skal $folder få ny verdi, loginandadmin. Dersom den ikke skulle eksistere der heller, skal den sjekke guestbook (folder får igjen ny verdi), og til sist, echo en feilmelding ($feilmld) dersom filen ikke eksisterer der heller.
     
  4. skogtrollet

    skogtrollet Medlem

    Innlegg:
    208
    Hadde faktisk tenkt å skrive en tekst om php og include script nå i nærmeste framtid. Mange som gjør feil der. I scriptet ditt f.eks. er det mulig å inkludere hvilken som helst fil på serveren, bare man kjenner banen. Skummelt.

    Løsningen er å filtrere $_GET['side'];. Det kan du gjøre slik:

    $getVerdi = preg_replace("/[^a-z]/i", "", $getVerdi);
     
  5. Pong

    Pong Jeg selger sʇɥƃıluʍop :)

    Innlegg:
    3.459
    Yep, folk tenker såpass lite på konsekvenser at domeneshop t.o.m. har lagt ut noe om det på hjelpe-sidene:
    Spørsmål og svar

    Noen tips ellers:
    Det er vanlig skikk å ikke teste negativt når du har både en true og false branch (så: if( !file_exists('fil') include('sorry.html'); else include('ok.html'); - bytt om).
    Prøv ellers å unngå doble quotes når de ikke er nødvendig; ".php" er dyrere enn '.php'. Og bruk isset() i stedenfor == NULL.

    Kjekt å se litt php her :D
     

Del denne siden