01. januar 2009 - 16:58Der er
64 kommentarer og 1 løsning
Importer side afhængig af "spørgsmålstegn"
Hej php eksperter Jeg søger et php script som kan gøre dette.
1 jeg åbner siden ”index.php”: da der ikke er noget ”?...” importeres siden ”filer/oversigt.html” 2 jeg åbner siden ”index.php?side1”: da der er et ”?...” importeres siden ”filer/side1.html” - Jeg skal desuden kunne bestemme hvor i html koden siden skal importeres.
Det skal lige siges at jeg ikke har særlig meget forstand på php.
Find det punkt i html koden, hvor du vil have teksten indsat - afhængig af ?
<?php if($side1) { include "filer/side1.html"; }elseif($side2) { include "filer/side2.html"; }elseif($side3) { include "filer/side3.html"; }else{ include "filer/oversigt.html"; }
- Tror jeg, ellers må nogle pros lige hjælpe til ;) ?>
Jeg er ikke sikker på jeg forstår spørgsmålet, men jeg formoder du har en forside som hedder index.php, og på denne side vil du gerne inkludere dine undersider?
Du skal kalde din forside for index.php. Du laver en mappe der hedder 'indhold', hvori du gemmer dine undersider. Når du så angiver et link til dine undersider fra index.php skal de have linket 'index.php?side=side1' - (bemærk at 'side1' er et navn jeg har fundet på, du erstatter selvfølgelig bare dette med det dine sider nu engang hedder).
Du indsætter nu dette stykke kode i din index.php der hvor du vil have at dine undersider skal inkluderes:
vifa-> Hvad så hvis man skriver index.php?side=../http://www.ondside.com/ondscript.php Det er ikke den mest sikre løsning, men man kan eventuelt have de tilladte sider i et array:
kaloer, jeg er bange for at du ikke forstår min kode i såfald. Kig på min kode igen, der er taget højde for den slags. I min kode går den ind og tjekker om siden eksistere i mappen 'indhold', hvis ikke udskriver den en fejlmeddelse "Siden findes ikke".
Derfor vil det eneste resultat være hvis man taster index.php?side=../http://www.ondside.com/ondscript.php at den echoer en fejl ud eftersom denne side slet ikke findes i mappen 'indhold'.
vifa >> Jeg er ikke bange for, men helt sikker på, du ikke forstår din egen kode ;o)
Hvilken sikkerhed ligger der i at konstatere, filen eksisterer? Med din 'metode' er det muligt at inkludere en hvilken somhelst fil, der ikke må inkluderes - og det er endda muligt at inkludere filer udenfor webspace (= selvmord!)
olebole, jeg tvivler på at det vil være muligt at inkludere andre sider i henhold til min metode. Prøv eksempelvis at teste dette. Hvis du eksempelvis i adressefeltet skriver index.php?side=http://www.tv2.dk så har du ikke videre held med at inkludere TV2 side idet den ikke findes i mappen indhold.
- og det bekymrer mig faktisk, at du ikke umiddelbart kan se det ekstremt farlige i din løsning. Kan du virkelig ikke se, det er muligt at inkludere hvilken somhelst side på serveren med din 'metode'? =)
Hvis du med denne metode vælger at skrive, som jeg skrev i min ovenstående post, index.php?side=http://www.tv2.dk så vil der ikke blive inkluderet noget idet at denne side ikke findes i mappen indhold. Så du bliver nød til at uddybe hvad du mener før jeg forstår det.
For at sære eksemplet i (01/01-2009 18:16:52) helt ud i pap:
'index.php?side=../../forbudte_filer/draeberfil.php' går to niveauer op fra din rodmappe på serveren - og ned i mappen 'forbudte_file' og henter filen 'draeberfil.php' ... that ain't good! :)
Men hvis det problem ellers bliver løst så… I første omgang har jeg benyttet kgp43’s-script med mstorgaard’s kommentar. Men da jeg ikke mener at det er praktisk at lave en if/ellesif for hver side kan jeg bedre lide vifa’s-script. Men jeg kan godt se at det ikke er særligt sikkert. Da jeg ikke er særlig god til php og næsten kun kender navnet må jeg lige stille nogle spørgsmål til olebole’s- script (den som giver mening :D ) <?php // 1. hvordan er dette anderledes fra vifa’s-script, det er ingen fornærmelse jeg forstår mig bare ikke så godt på php if(isset($_GET['side'])) { $side = "indhold/".basename($_GET['side'].".php"); if(is_file($side)) { require_once($side); } else { // 2. er dette det som bliver vist hvis der er et ”?” men siden kan ikke findes echo "<h3><center><p>Siden findes ikke</p></center></h3>"; } } // 3. er dette det som blive vist hvis der intet ”?” er. else require_once('indhold/forside.php'); ?> Og så har jeg lige et spørgsmål hvis det elles er som jeg tror. Er det muligt at importere 'indhold/forside.php' efter <p>Siden findes ikke</p>. PS: jeg menes ikke at man kombinere ”<h3> og <p>, eller også er det bare mig ;)
Nummer 1; basename() er den primære ændring. Nummer 2; Det er bare en tekst, der skrives, hvis det ikke findes nogen filer. Der kan du sætte det ind, du vil. Nummer 3; Ja (:
"Er det muligt at importere 'indhold/forside.php' efter <p>Siden findes ikke</p>.": echo "<h3><center><p>Siden findes ikke</p></center></h3>"; require_once('indhold/forside.php');
Du har intet at bruge den linje til. XHTML er elendig understøttet på WWW - og IE 7 understøtter slet ikke XHTML brugt, som det skal. Derfor kan du roligt fyre den pågældende linje (den disabler iøvrigt de vigtigste dele af CSS i IE6, så den _skal_ fyres!) ;o) http://www.eksperten.dk/artikler/537 http://www.eksperten.dk/artikler/538
Hvis brugeren skriver: 'index.php?side=../../forbudte_filer/draeberfil.php'
- i vifa's oprindelige eksempel, vil serveren gå to niveauer op fra din rodmappe på serveren - og ned i mappen 'forbudte_file' og henter filen 'draeberfil.php' ... det er rent selvmord!
// Angiver de sider der er defineret. $tilladte_sider[] = "side1"; $tilladte_sider[] = "side2"; $tilladte_sider[] = "side3";
// Checker at brugeren ikke forsøger at tilgå en side der ikke er defineret. if (in_array($_GET['side'], $tilladte_sider)) { $side = $_GET['side']; } else { $side = "side1"; }
Derfor skal du ændre din kode til: <?php if(isset($_GET['side'])) { $side = basename($_GET['side'].".html"); if(is_file($side)) { require_once($side); } else { echo ('Siden findes ikke'); require_once('Oversigt.html'); } } else require_once('Oversigt.html'); ?>
@ mstorgaard Tak det havde jeg overset, en klassisk fejl på mit niveau Nu viser den det rigtige næsten! @Alle Tak for den store hjælp, det virker dog ikke helt. Når jeg trykker på et link fx ”forside.php?side1 viser den bare Oversigten (Oversigt.html). Skriver jeg noget som ikke findes fx forside.php?test viser den igen bare Oversigten (Oversigt.html), og ikke Siden findes ikke + Oversigten.
Php koden ser sådan ud nu… <?php if(isset($_GET['side'])) { $side = "WWW_den-lille-kogebog/Opskrifter".basename($_GET['side'].".html"); if(is_file($side)) { require_once($side); } else { echo ('Siden findes ikke'); require_once('WWW_den-lille-kogebog/Opskrifter/Oversigt.html'); } } else require_once('WWW_den-lille-kogebog/Opskrifter/Oversigt.html'); ?>
Jeg tror det skyldes at du forsøger at tilgå siden på den forkerte måde. $_GET['side'] indeholder en variabel på det, der står efter ?side=. Dvs. at hvis du skriver forside.php?side1 vil $_GET['side'] ikke blive sat, da den checker forside.php?side=DEN_TEKST_HER. Du skal tilgå siden sådan: forside.php?side=side1. Hvis du skal gøre det på den anden måde bliver det en del sværer. http://dk2.php.net/manual/en/reserved.variables.get.php
Ja ok. Og tak fordi du gjorde mig opmærksom på MIME type. Jeg beholder nu mine filer i XHTML men bruger så denne php kode, som du har kommenteret: http://www.eksperten.dk/spm/858357
kkrasmussen >> Ja, hvis man er helt syg for at begå offentligt selvmord, kan man jo godt vælge dén fremgangsmåde - men den indbyder enhver potentiel hacker/cracker til en autonom svingom på serveren!
Hvis du på den anden side ønskede at vise skoleeksemplet på, hvordan man absolut _aldrig_(!) må gøre, er det et fint eksempel =)
:O skal love for at der er kommet nogle kommentar i denne tråd.
Uden at have læst det hele igennem, og uden at have testet det - er Kaloer's (01/01-2009 17:46:28) metode så 100 % sikker? Altså den hvor de tilladte sider bliver listet i et array.
Eller jo det kan du godt, men du vil blive smidt tilbage til modules folderen da der i min egen kode er defineret en trim kommando for at fjerne alle andre tegn end bogstaver. $id=$_GET['id']; er skrevet ind og ikke kopieret ind. Gad ikke kopiere hele lortet ind.
kkrasmussen; det ville nok være en god idé at inkludere den sikkerhed, da du ellers giver et direkte usikkert script til en anden bruger, hvilket kan sætte denne brugers hjemmeside/server/computer i fare.
Tja...De 22 linjer er jo en lille del af en klassefil med over 300 linjer. Det var reelt set kun de 22 linjer som var relevant for debatten. Hvorfor forvirre mere ved at kopiere alle små 300 linjer ind i debatten? Kan godt se det måske ikke er hensigtmæssigt hvis man bruger mit eksempel out of the box, men nu var det jo en kommentar og ikke et svar. Hvor er vi henne hvis man ikke kan tage noget ud af en hel kontekst som blot understreger ens pointe?
Du får ikke afsluttet if(isset($side)) inden du skriver else.. Desuden vil jeg anbefale oleboles løsning med basename, da den gør at du ikke behøver at rette i php-filen hvis du tilføjer nye sider.
Her er den ovenstående rettede kode:
if(isset($side)) {
if(in_array($side, $TilladteSider)) { if(is_file('indhold/' . $side . '.php')) { require_once ('indhold/' . $side . '.php'); } else { echo "<h3><center><p>Siden findes ikke</p></center></h3>"; } } else { echo "<h3><center><p>Der er ikke adgang til den ønskede side</p></center></h3>"; } } else { require_once('indhold/forside.php'); }
Rent sikkerhedsmæssigt kommer det vel næsten ud på et. Men jeg finder det meget brugbart at have en liste over alle siderne i et array, herved kan jeg fjerne adgangen til en bestemt side midlertidigt, eksempelvis.
Kom tilbage hertil via et link i en anden tråd. Hvis du insisterer på denne løsning, er det selvfølgelig dit valg, men lad mig lige foreslå en væsentlig bedre løsning end in_array, som ikke er beregnet til den slags opslag:
if ( $TilladteSider[$side] ) { // Siden er tilladt }
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.