Avatar billede ch2 Nybegynder
27. april 2004 - 16:14 Der er 13 kommentarer og
1 løsning

Brug af switch til inkludering af filer

Jeg har et problem med opbygningen af min side, jeg benytter mig af en switch der ser sådan ud:

<?php
       
switch($_REQUEST["id"]){
case forside: include('forside.html');
break;
case side1:    include('side1.html');
break;
case side2:  include('side2.html');
break;
default:      include('forside.html');
}
?>

og når jeg så klikker på min menu, med links der ser sådan ud:
index.php?id=side1, inkluderer den selvfølgelig undersiderne i indexfilen. Men mit problem er nu at når jeg laver links på undersiderne og klikker på disse hopper de ud include funktionen.

Den eneste løsning jeg selv kunne komme frem til at jeg skulle lave cases i switchen til alle de link der på undersiderne, hvilket forekommer mig noget bøvlet.

Er der ikke en nem måde at gøre dette på?
Er der eventuelt en bedre måde at gøre det på?
Hvordan gør i på jeres sider?
Avatar billede krydset Nybegynder
27. april 2004 - 16:21 #1
jeg gør sådan her

<?php
  if (isset($_GET["link"])) {
      if (file_exists('sider/'.$_GET["link"])) {
      include ('sider/'.$_GET['link']);
    } else {
        echo "Siden $_GET[link] blev ikke fundet";
    }
  } else {
  include ('sider/start.php');
  }
?>

hvis der kommer et link der har ?link=side.php med i søger den efter side.php hvis den ikke findes bliver der lavet en fejlmedd om at siden ikke findes

dvs et fuldt link ville se sådan her ud
www.domæne.dk?link=items.php det ville includere items.php hvis den findes
Avatar billede dennismp Nybegynder
27. april 2004 - 16:25 #2
Du kan indføre en underside variable så du ikke gemmer din hovedside..  så links fra din underside ser sådan her ud
index.php?id=side1&sid=både

==========

alternativt kan du gøre det på denne måde

index.php?id=side/både

og så i din kode gøre (i index.php)
if( isset($_GET['path']) )
  $path = explode("/",$_GET['path']);
else
  $path = array('default');

så vil $path[0] være 'side' og $path[1] være 'både'. Dette skal kun gøres een gang.

$side = @array_pop($path); // fjern 'side' fra $path.. nu er der kun både tilbage.
switch($side) {
..
  case 'side1':
    include('side1.php');
    break;
..
}

i side1.php kan du så gøre det en gang til

$side = @array_pop($path); // fjern 'både' fra $path, nu er den tom

switch($side) {
  case 'både':
    include(...
}

så kan du lave lige så mange undersider som du har lyst til, bare du laver de rigtige links.. fx
index.php?id=side1/både

og du kan sagents lave under-undersider ved at gentage det kode du har fra side1.php (altså array_pop + switch), så skal url'en bare se således ud
index.php?id=side/både/joller
Avatar billede dennismp Nybegynder
27. april 2004 - 16:40 #3
krydset: det skal man passe på med at gøre. Forstil dig at vedkommende skriver
www.domæne.dk?link=../items.php .. så kan han snildt hente php-filer alle andre steder fra filsystemet end hvad han burde. Hvis man så kan uploade filer, så kan han faktisk uploade en phpfil som billede, og så bruge en snedig-stil til at hente php-koden ind og få udført den - nu kan han få udført hvad han har lyst til .. av

Det lyder nok lidt teoretisk og paranoid, men det sker. Så hellere gøre det med en switch-statement som han gør i nu..

Alternativt, kan man brug id'et til at slå op i et array for at se hvilken fil der skal hentes ind. Dermed bestemmer brugeren kun hvad vi kan finde i et array og det er så meget nemmere at lave tjeks på..

fx.

<?php
  $pages = array();
  $pages['side1'] = 'side1.php'; // lovlige sider + de filer der skal læses ind
  $pages['side2'] = 'side2.php';

  if( isset($_GET['link']) && isset($pages[$_GET['link']]) ) {
    include($pages[$_GET['link']]);
  }
  else {
    include('default');
  }
?>
Avatar billede ch2 Nybegynder
27. april 2004 - 16:46 #4
hmm ja, jeg kan godt se det der med det sikkerhedsmæssige, hvordan skal jeg så helt præcist gøre det? Synes dog det første eksempel var meget simpelt og fik det til at virke, men hvad er så det bedste?
Avatar billede dennismp Nybegynder
27. april 2004 - 16:53 #5
Det kommer an på hvilken metode du ønsker :-) Min forrige kommentar er en måde at løse det sikkerhedsmæssige i krydsets svar - så hvis du kan lide det, så brug endelig det. Men du skal så stadig have en anden måde at holde styr på undersiderne.

Jeg vil nok (med udgangspunkt i det du spørger om) gør det på den måde jeg foreslår - mit alternativ.. Det kræver lidt mere kode, men det er ikke så meget endda. Jeg kan godt forsøge at forklare det igen - hvis du ikke forstår hvad jeg skrev.
Avatar billede ch2 Nybegynder
27. april 2004 - 16:58 #6
ja, det må du gerne, det vigtigste er bare at det script jeg bruger gør sådan at jeg ikke skal skrive en switch på hver eneste side, det er simpelthen for bøvlet hvis man skal lave en stor side...
Avatar billede dennismp Nybegynder
27. april 2004 - 17:15 #7
Dette virker lidt som det forrige.. Du udfylder $pages[..], så der står
$pages['etnavn'] = 'enfil.php';

så vil 'enfil.php' blive inkluderet når index.php?link=etnavn

Hvis du har brug for at der bliver inkluderet flere filer, så kan du gøre således

$pages['etandetnavn'] = array('enfil.php','andenfil.php');

Så vil index.php?link=etandetnavn betyde, at enfil.php og andenfil.php bliver inkluderet.

index.php
<?php
  $pages = array();
  $pages['side1']  = 'side1.php';
  $pages['side2']  = 'side2.php';
  $pages['side1/1'] = array('side1.php','enandenfil.php');

  if( isset($_GET['link']) && isset($pages[$_GET['link']]) ) {
    if( is_array($pages[$_GET['link']]) ) {
      foreach($pages[$_GET['link']] as $file)
        include($files);
    }
    else {
      include($pages[$_GET['link']]);
    }
  }
  else {
    include('default.php');
  }
?>

Er dette noget du kan bruge?
Avatar billede ch2 Nybegynder
27. april 2004 - 17:31 #8
Virker dette script så sådan at jeg kun behøver at putte det ind på indexsiden og ikke på undersider, for det er jo det jeg gerne vil undgå. Her mener jeg at jeg ikke skal skrive denne kode ind på alle de sider hvor der er links til undersider?
Avatar billede dennismp Nybegynder
27. april 2004 - 17:42 #9
Det skal kun gøres i din index.php. Så sørger den for at hente andre filer ind der kan bruges til at vise hjemmesiden.
Avatar billede ch2 Nybegynder
27. april 2004 - 17:46 #10
okay jeg takker!!
Avatar billede dennismp Nybegynder
27. april 2004 - 17:51 #11
Det var så lidt. Se om det kan hjælpe dig ellers spørg :-)
Avatar billede krydset Nybegynder
28. april 2004 - 00:34 #12
han kan da ikke udføre hvad han vil, for det første parser min server kun .php filer ikke billedfiler, for det andet ligger alt i database, dvs han skal egentlig lave query' s men det kan han ikke udenbrugernavn & password så kkan ikke se det store sikkerhed risici, men du er velkommen til at prøve mit system af hvis du har lyst.
Avatar billede dennismp Nybegynder
28. april 2004 - 00:58 #13
Det var altså ikke negativ nemt. Men jeg lader aldrig brugeren bestemme hvad der skal parses, selvom du laver et check som forhåbenlig fanger problemerne. Selvom du kun har sat apache op til at parse .php filer med php, så hjælper det ikke meget på include() og den slags.

Filer er data. En billedfil er jo kun et billede, fordi man tolker den på et bestemt måde..

Jeg kan da sagents smide et php-script op som dennis.jpg .. og så include("../billeder/dennis.jpg") .. så vil den udføre mine instruktioner.. Så du kan sagents parse .jpg filer. Men lige præcis i dit tilfælde tvinger du til at bruge .php.. Så mit billede skal hedde .php - men det går normalt også (de færreste tjekker andet end mime-typen af den uploadede fil).

Et index.php?link=../../etscript.php vil få dit script til at parse et script det ikke var meningen (fra din side) at den skulle. Det er i sig selv en risiko. Spørgsmålet er bare, om man syntes det er stort nok til at man gider at gøre noget ved det - om det er besværet værd. Det er dér vi er uenige tror jeg.

*Jeg* ville bare aldrig overlade den slags til brugeren. Og nej, jeg gider ikke at teste din kode :) Det tager for lang tid og jeg er ikke engang sikker på at det er lovligt.
Avatar billede olebole Juniormester
28. april 2004 - 01:37 #14
<ole>

Jeg tror aldrig, jeg har mødt en erfaren programmør, der inkluderer filer direkte udfra bruger-input - i noget sprog. Tværtimod regnes det normalt for sikkerhedsregel nummer 0.0.1-Alpha at undlade den slags.
I det hele taget regnes det i alle sprog for absplut 'no-no' at undlade grundig validering af al bruger-input før brug. Undskyld udtrykket - men det er helt elementær programmør-viden  :)

Om ikke andet, gælder den almindelige regel om, at hvis man altid sikrer sig, glemmer man det aldrig. Der er situationer, hvor det ikke er nødvendigt - men gør man det altid, glemmer man det ikke, når det pludselig er essentielt.
Derfor er god kodeskik ikke altid kongruent med, hvad der er nødvendigt.

Det er heller ikke altid nødvendigt at bruge gåseøjne i array-kald, men når 'uheldet' er ude, kan det være en alvorlig fejl at skrive $row[id].
Defor er det dårlig kodeskik at undlade dem. På samme måde som det at udelade gåseøjne omkring attributter i HTML er dårlig kodeskik. Hvis man altid skriver dem, glemmer man dem aldrig, når de _skal_ være der  :)

Der er i forvejen rigeligt at huske på ... og Murphy's Lov, du ved  ;o)

/mvh
</bole>
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