27. april 2004 - 16:14Der 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?
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
<?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
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
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';
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?
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.
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...
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?
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.
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.
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>
Synes godt om
Ny brugerNybegynder
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.