HiSpeed Skrevet 6. januar 2009 Del Skrevet 6. januar 2009 (endret) Jeg har søkt i forumet men har ikke funne løsning på hvordan man bygger opp index.php for å bruke linker med id og variabler som f.eks. ?id=tjenester&sub=support. Er det noen som kan forklare dette eller gi et eksempel? Endret 6. januar 2009 av HiSpeed Lenke til kommentar
funkyboy Skrevet 6. januar 2009 Del Skrevet 6. januar 2009 (endret) Jeg har søkt i forumet men har ikke funne løsning på hvordan man bygger opp index.php for å bruke linker med id og variabler som f.eks. ?id=tjenester&sub=support. Er det noen som kan forklare dette eller gi et eksempel? Du benytter da et php- script som sier f.eks. <?php if ($_GET["id"] == "tjenester") { echo "<h1>Tjenester</h1>"; } else { echo "<h1>Vanlig overskrift</h1>"; } ?> Dette skriver en annen overskrift dersom verdi "tjenester" ligger i id. Dette er veldig basic forklart, men du kan bygge ut denne på mange måter. Vi kan f.eks bygge ut denne til også å ta et parameter til. <?php if ($_GET["id"] == "tjenester") { if ($_GET["sub"] == "support") { echo "<h1>Support</h1>"; } else { echo "<h1>Tjenester</h1>"; } } else { echo "<h1>Vanlig overskrift</h1>"; } ?> Denne gangen får man overskriften "Support" dersom man skriver inn ?id=tjenester&sub=support. Hvis man bare skriver inn ?id=tjenester, får man overskriften "Tjenester". Slike enkle tester som dette kan være nyttige til småting og forklarer basics i php, men dersom man skal bygge en hel side basert på dette prinsippet, blir det svært mye (og svært tungvint) arbeid. Så anbefaler deg å søke på Google eller diskusjon.no etter "includescript". Lykke til! :!: Endret 6. januar 2009 av funkyboy Lenke til kommentar
HiSpeed Skrevet 6. januar 2009 Forfatter Del Skrevet 6. januar 2009 <?php if ($_GET["id"] == "tjenester") { if ($_GET["sub"] == "support") { echo "<h1>Support</h1>"; } else { echo "<h1>Tjenester</h1>"; } } else { echo "<h1>Vanlig overskrift</h1>"; } ?> Kan man kombinere dette med SWITCH? Prøvde et søk på Google men fant ingen løsning for dette. I dag bruker jeg denne koden: <?php if (empty($_GET['id'])) { include ('inc/main.html'); } else switch ($_GET['id']) { case "Dummy" : include 'inc/dummy.html'; break; default: include ('feil/404.htm'); break; } ?> Lenke til kommentar
AlecTBM Skrevet 6. januar 2009 Del Skrevet 6. januar 2009 Først, det ta du ikke fant noe på google må være bull (no offence) http://www.hardware.no/artikler/sikker_bru...ude-script/8764 første svar på php include script Også hvorfor vil du bruke switch? og husk for all del htmlspecialchars(), uten den så kan du nesten gi siden til crackere (litt ekstremt i dette tilfellet, men bruk det alikevell). Lenke til kommentar
HiSpeed Skrevet 6. januar 2009 Forfatter Del Skrevet 6. januar 2009 (endret) Hmm. Er det jeg som ikke skjønner noen ting? Jeg fant ikke noe om bruk av 2 variabler ved søk på Google. I min første post skriver jeg at jeg ønsker å bruke 2 variabler. Mulig at det var dårlig forklart. Å bruke 1 variabel er ikke noe problem. Endret 6. januar 2009 av HiSpeed Lenke til kommentar
AlecTBM Skrevet 6. januar 2009 Del Skrevet 6. januar 2009 Kanskje komme med hva du skal bruke den andre variabelen til? Og igjen, hvorfor vil du bruke switch? Lenke til kommentar
HiSpeed Skrevet 6. januar 2009 Forfatter Del Skrevet 6. januar 2009 Se post 1. Jeg trenger ikke å bruke SWITCH. Lenke til kommentar
AlecTBM Skrevet 6. januar 2009 Del Skrevet 6. januar 2009 ser og ser, men ser ikke hva du vil ha hjelp til Lenke til kommentar
funkyboy Skrevet 7. januar 2009 Del Skrevet 7. januar 2009 Kan man kombinere dette med SWITCH? Prøvde et søk på Google men fant ingen løsning for dette. I dag bruker jeg denne koden: <?php if (empty($_GET['id'])) { include ('inc/main.html'); } else switch ($_GET['id']) { case "Dummy" : include 'inc/dummy.html'; break; default: include ('feil/404.htm'); break; } ?> Du kan fint kombinere dette med switch. Tar nå utgangspunkt i den koden du allerede har, og legger til en switch inne i switchen, samt at jeg har lagt til noe forbedret sikkerhet (htmlentities()). :!: <?php if (empty($_GET['id'])) { include ('inc/main.html'); } else { $id = htmlentities($_GET['id']); $sub = !empty($_GET('sub')) ? htmlentities($_GET['sub']) : ""; // $sub inneholder nå "" dersom $_GET['sub'] skulle være tom. // Ellers inneholder denne en sikret versjon av innholdet i $_GET['sub']. switch ($id) { case "Dummy" : switch ($sub) { case "support"; include 'inc/dummy_support.html'; break; default: include 'inc/dummy.html'; break; } // Slutt på switch i switch. break; default: include ('feil/404.htm'); break; } } ?> Koden sjekker først om det ligger innhold i $_GET['id'], og inkluderer en bestemt fil dersom ikke. Dersom $_GET['id'] har innhold, vil du automatisk komme til en switch. I denne, ligger variablene $id og $sub klare til bruk, og bestemmer utfallet av hvilken statement som skal være riktig. Dersom $_GET['id'] inneholder "Dummy", vil det foretas en ny test som gir deg innhold for en supportside dersom $_GET['sub'] inneholder "support". Lenke til kommentar
emilkje Skrevet 7. januar 2009 Del Skrevet 7. januar 2009 (endret) Det har vært litt snakk om sikkerhet rundt inkludering av eksterne filer gjennom php include() her, så jeg tenkte jeg skulle komme med mitt bidrag til diskusjonen. Dette er et script jeg har brukt på nettavisen til skolen våres for noen år siden. legg merke til at dette ble utført FØR jeg kunne noe som helst om databaser, så jeg ser jo nå i ettertid at dette er en utrolig upraktisk måte å lage nettavis på. <!--SPOILER BEGIN--><div class="spoilertop" onClick="openClose('0ac43858e563d7b56f4376a02f97ceb1')" style="font-weight: bold">Klikk for å se/fjerne spoilerteksten nedenfor</div><div class="spoilermain" id="0ac43858e563d7b56f4376a02f97ceb1" style="display:none"><!--SPOILER END--> <?php // multi-variabel inkuderingsscript // Konfigurasjon $dir1 = "./artikler/"; /* Mappen som alle filene i kattegori 1 ligger */ $dir2 = "./content/about"; /* Mappen som alle filene i kattegori 2 ligger */ $dir3 = "./content/contact"; /* Mappen som alle filene i kattegori 3 ligger */ $mainpage = "./content/index.php"; /* Siden som vil bli inkludert der ingen annen er oppgitt */ $fileext = ".php"; /* Filutvidelsen for alle filene som skal inluderes. ".php" som standard */ $error404 = "<span class='main-heading'>Error 404</span><p>Siden ble ikke funnet!<br /> Se etter eventuelle skrivefeil i adresselinjen.<br /><br /> Hvis du ble ført hit via en link, så vær snill å <a href='mailto:[email protected]'>kontakt webmaster</a> og fortell om problemet, så skal vi løse det så fort som mulig.</p>"; $error = "<span class='main-heading'>Forbudt!</span><p>Kan ikke inkludere siden. Bare lokale filer kan bli inkludert.</p>"; /* Feilmelding som skal vises der siden ikke kan vises */ /* Bytt ordene inni [' og '] akkurat som du vil. f.eks. ['page'] eller ['id'] eller ['section'] eller hva som helst. */ /* Ordet du velger vil være det du skriver i adresselinjen f.eks: www.dittdomene.com/index.php?'ditt ord'=mypage */ $cat1 = $_GET['kategori']; /* Variabel for Artikkelkategori */ $id = $_GET['id']; /* Variabel for artikkel-ID */ $cat2 = $_GET['om']; /* Variabel for om-seksjonen */ $cat3 = $_GET['kontakt']; /* Variabel for kontakt-seksjonen */ // Slutt på konfigurasjonen // Hvis cat1 er definert i adresselinjen: if (isset($cat1)) { $cat1 = stripslashes(strip_tags($cat1)); $forbidden1 = ereg("\.\./", $cat1); $forbidden2 = ereg("/", $cat1); $includepath= $dir1 . $cat1 . "/" . $id . $fileext; if ($forbidden1 || $forbidden2) { echo "$error"; } else { if (@fopen("$includepath", "r")) { include ("$includepath"); } else { if (!(@fopen("$includepath", "r"))) { echo "$error404"; } } } } // Hvis cat2 er definert i adresselinjen: elseif (isset($cat2)) { $cat2 = stripslashes(strip_tags($cat2)); $forbidden1 = ereg("\.\./", $cat2); $forbidden2 = ereg("/", $cat2); $includepath= $dir2 . "/" . $cat2 . $fileext; if ($forbidden1 || $forbidden2) { echo "$error"; } else { if (@fopen("$includepath", "r")) { include ("$includepath"); } else { if (!(@fopen("$includepath", "r"))) { echo "$error404"; } } } } // Hvis cat3 er definert i adresselinjen: elseif (isset($cat3)) { $cat3 = stripslashes(strip_tags($cat3)); $forbidden1 = ereg("\.\./", $cat3); $forbidden2 = ereg("/", $cat3); $includepath= $dir3 . "/" . $cat3 . $fileext; if ($forbidden1 || $forbidden2) { echo "$error"; } else { if (@fopen("$includepath", "r")) { include ("$includepath"); } else { if (!(@fopen("$includepath", "r"))) { echo "$error404"; } } } } // Hvis ingen kategori er definert i adresselinjen: else { include ("$mainpage"); } ?> <!--SPOILER DIV--></div><!--SPOILER DIV--> Endret 11. mars 2010 av eMilt Lenke til kommentar
Harald B Skrevet 7. januar 2009 Del Skrevet 7. januar 2009 Det har vært litt snakk om sikkerhet rundt inkludering av eksterne filer gjennom php include() her, så jeg tenkte jeg skulle komme med mitt bidrag til diskusjonen. Dette er et script jeg har brukt på nettavisen til skolen våres for noen år siden. legg merke til at dette ble utført FØR jeg kunne noe som helst om databaser, så jeg ser jo nå i ettertid at dette er en utrolig upraktisk måte å lage nettavis på. <?php // multi-variabel inkuderingsscript // Konfigurasjon $dir1 = "./artikler/"; /* Mappen som alle filene i kattegori 1 ligger */ $dir2 = "./content/about"; /* Mappen som alle filene i kattegori 2 ligger */ $dir3 = "./content/contact"; /* Mappen som alle filene i kattegori 3 ligger */ $mainpage = "./content/index.php"; /* Siden som vil bli inkludert der ingen annen er oppgitt */ $fileext = ".php"; /* Filutvidelsen for alle filene som skal inluderes. ".php" som standard */ $error404 = "<span class='main-heading'>Error 404</span><p>Siden ble ikke funnet!<br /> Se etter eventuelle skrivefeil i adresselinjen.<br /><br /> Hvis du ble ført hit via en link, så vær snill å <a href='mailto:[email protected]'>kontakt webmaster</a> og fortell om problemet, så skal vi løse det så fort som mulig.</p>"; $error = "<span class='main-heading'>Forbudt!</span><p>Kan ikke inkludere siden. Bare lokale filer kan bli inkludert.</p>"; /* Feilmelding som skal vises der siden ikke kan vises */ /* Bytt ordene inni [' og '] akkurat som du vil. f.eks. ['page'] eller ['id'] eller ['section'] eller hva som helst. */ /* Ordet du velger vil være det du skriver i adresselinjen f.eks: www.dittdomene.com/index.php?'ditt ord'=mypage */ $cat1 = $_GET['kategori']; /* Variabel for Artikkelkategori */ $id = $_GET['id']; /* Variabel for artikkel-ID */ $cat2 = $_GET['om']; /* Variabel for om-seksjonen */ $cat3 = $_GET['kontakt']; /* Variabel for kontakt-seksjonen */ // Slutt på konfigurasjonen // Hvis cat1 er definert i adresselinjen: if (isset($cat1)) { $cat1 = stripslashes(strip_tags($cat1)); $forbidden1 = ereg("\.\./", $cat1); $forbidden2 = ereg("/", $cat1); $includepath= $dir1 . $cat1 . "/" . $id . $fileext; if ($forbidden1 || $forbidden2) { echo "$error"; } else { if (@fopen("$includepath", "r")) { include ("$includepath"); } else { if (!(@fopen("$includepath", "r"))) { echo "$error404"; } } } } // Hvis cat2 er definert i adresselinjen: elseif (isset($cat2)) { $cat2 = stripslashes(strip_tags($cat2)); $forbidden1 = ereg("\.\./", $cat2); $forbidden2 = ereg("/", $cat2); $includepath= $dir2 . "/" . $cat2 . $fileext; if ($forbidden1 || $forbidden2) { echo "$error"; } else { if (@fopen("$includepath", "r")) { include ("$includepath"); } else { if (!(@fopen("$includepath", "r"))) { echo "$error404"; } } } } // Hvis cat3 er definert i adresselinjen: elseif (isset($cat3)) { $cat3 = stripslashes(strip_tags($cat3)); $forbidden1 = ereg("\.\./", $cat3); $forbidden2 = ereg("/", $cat3); $includepath= $dir3 . "/" . $cat3 . $fileext; if ($forbidden1 || $forbidden2) { echo "$error"; } else { if (@fopen("$includepath", "r")) { include ("$includepath"); } else { if (!(@fopen("$includepath", "r"))) { echo "$error404"; } } } } // Hvis ingen kategori er definert i adresselinjen: else { include ("$mainpage"); } ?> Skriptet er jo ikke sikkert i det hele tatt, så hvorfor du legger dette som et eksempel på sikker kode forstår jeg ikke. Du tester for sekvensene "../" og "/", men på en windows boks er "..\" og "\" likegyldig i en filbane. Ettersom du kjører stripslashes er det bare å benytte dobble backslash alt etter som magic_quotes er på eller av. Det er ingen sjekk på $_GET['id'] i det hele tatt slik at du fritt fram kan bruke "../" og "/" også. foreksempel: url?kategori=test&id=../../../etc/passwd%-00 hvor %-00 hjelper oss å bli kvitt filendelsen .php som du forgjeves forsøker å legge til (bindestrek mellom % og 00 skal ikke stå der, men forumet filtrerer vekk ellers) Lenke til kommentar
HiSpeed Skrevet 8. januar 2009 Forfatter Del Skrevet 8. januar 2009 Er dette scriptet sikkert? Hvis ikke - hvordan kan det bygges om til et sikkert script? <?php if (empty($_GET['id'])) { include ('inc/main.html'); } else switch ($_GET['id']) { case "Dummy" : include 'inc/dummy.html'; break; default: include ('feil/404.htm'); break; } ?> Lenke til kommentar
AlecTBM Skrevet 8. januar 2009 Del Skrevet 8. januar 2009 Jeg vil ikke si det <?php $id = htmlspecialchars($_GET['id']); if (empty($id)) { include ('inc/main.html'); } else switch ($id) { case "Dummy" : include 'inc/dummy.html'; break; default: include ('feil/404.htm'); break; } ?> Husk å bruk funksjoner som htmlspecialchars på alle input Lenke til kommentar
Jonas Skrevet 8. januar 2009 Del Skrevet 8. januar 2009 (endret) Jeg vil ikke si det [..] Husk å bruk funksjoner som htmlspecialchars på alle input Så lenge input kun brukes i en switch-statement på denne måten, så har det da vitterlig ingen ting å si om input tilfeldigvis inneholder et par html-tags. htmlspecialchars() bidrar i hvert fall ikke til økt sikkerhet. Og hvorfor er du så opptat av at akkurat den funksjonen skal benyttes på all input? Hva om man f.eks. ønsker å tillatte html og samtidig vil sette det inn i en database? Da nytter det ikke mye med htmlspecialchars(). Endret 8. januar 2009 av Jonas Lenke til kommentar
funkyboy Skrevet 8. januar 2009 Del Skrevet 8. januar 2009 (endret) Jeg vil ikke si det I utgangspunktet er dette sikkert nok, da det kun kan resultere i tre forskjellige inkluderinger. Hvis get er tom, returneres startside. Hvis get inneholder data, kjøres en switch. Hvis get inneholder eksakt info, inkluderes en bestemt fil. Ellers default. Akkurat dette kan ikke manipuleres på noe vis med å benytte spesialtegn i URL. Men for å kunne benytte variabelen $_GET['id'] til noe annet enn akkurat denne (enkle) testen, er det nødvendig med sikring. EDIT: Jonas, du skylder meg en Cola. :!: Endret 8. januar 2009 av funkyboy Lenke til kommentar
HiSpeed Skrevet 8. januar 2009 Forfatter Del Skrevet 8. januar 2009 (endret) I utgangspunktet er dette sikkert nok, da det kun kan resultere i tre forskjellige inkluderinger. Hvis get er tom, returneres startside. Hvis get inneholder data, kjøres en switch. Hvis get inneholder eksakt info, inkluderes en bestemt fil. Ellers default. Akkurat dette kan ikke manipuleres på noe vis med å benytte spesialtegn i URL. Men for å kunne benytte variabelen $_GET['id'] til noe annet enn akkurat denne (enkle) testen, er det nødvendig med sikring. Takker! Endret 8. januar 2009 av HiSpeed Lenke til kommentar
Hayer Skrevet 8. januar 2009 Del Skrevet 8. januar 2009 Orket ikke lese hele, å bare klippet fra min egen side.. <a href="index.php?side=info"><img src="meny_info.gif" class="bilde" /></a> <a href="index.php?side=regler"><img src="meny_regler.gif" class="bilde" /></a> <a href="index.php?side=paamelding"><img src="meny_påmelding.gif" class="bilde" /></a> <a href="index.php?side=paameldte"><img src="meny_påmeldte.gif" class="bilde" /></a> </div> <table class="container" align="center" cellpadding="0" cellspacing="0" border="0"> <tr> <td class="gjorne" style="background-image:url('box_tl.gif')"></td> <td style="width:739px; background-image:url('box_tm.gif'); background-repeat:repeat-x;"></td> <td class="gjorne" style="background-image:url('box_tr.gif')"></td> </tr> <tr> <td style="width:13px; background-image:url('box_sl.gif'); background-repeat:repeat-y;;"></td> <td style="width:739px; background-color:#FFFFFF; height:200px; vertical-align:text-top; padding:15px;"> <?php switch($_GET['side']) { case "info": echo nl2br(file_get_contents("content/info.txt")); break; case "regler": echo nl2br(file_get_contents("content/regler.txt")); break; case "paamelding": echo nl2br(file_get_contents("content/paamelding.txt")); break; case "paameldte": echo nl2br(file_get_contents("content/paameldte.txt")); break; default: echo nl2br(file_get_contents("content/info.txt")); break; } My five cents.. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå