Avatar billede superdreng Nybegynder
18. september 2007 - 22:56 Der er 17 kommentarer og
1 løsning

Sikker include måde - php

Hej experter :D

Jeg skal bruge en måde at include mine filer på via index.php
Har lige nu hvor jeg skal skrive ved hver eneste (den kan godt blive lang den fil):

if  ($_GET['page'] == 'info') {
include("info.html");
}

Jeg tænkte på om man kunne lave så man bare kunne skrive i sine links:
index.php?page=admin/bruger -> så finder den selv admin/bruger.php
index.php?page=info -> så finder den info.php

man skal selvføglig ikke kunne include andre end ens egen php filer:
http://cooltown.dk/index  --> den måde må man ikke kunne bruge

og hvis den ikke finde noget at include (ugyldig $_GET['page'] eller ingen) så include forside.php

På forhånd rigtig mange tak!! :D

Mvh
Kevin
Avatar billede olebole Juniormester
19. september 2007 - 00:27 #1
<ole>

Du kunne også:

$allowed = array(
    "forside" => 1,
    "info" => 1,
    "kontakt" => 1,
    "produkter" => 1
);

if ( $allowed[$_GET["page"]] ) include($_GET["page"].".html");

/mvh
</bole>
Avatar billede olebole Juniormester
19. september 2007 - 00:31 #2
- og naturligvis:

if ( $allowed[$_GET["page"]] ) include($_GET["page"].".html");
else include("default_side.html");

- men det er absolut ikke anbefalelsesværdigt at lade scriptet selv gætte på noget somhelst - eller 'regne noget ud' - vedr. stier
Avatar billede superdreng Nybegynder
19. september 2007 - 13:18 #3
Super! Scripte virker perfekt!

Rigtig mange tak. Men hvorfor er de der 1tal. Den tjekker jo ikke om man skriver 0 for at den ikke må komme ind på den side, eller gør den?

Men mange tak for hjælpen!

Smid et svar!
Avatar billede olebole Juniormester
19. september 2007 - 16:02 #4
Selvtak. Du kan prøve følgende:

$allowed = array(
    "forside" => 1,
    "info" => 1,
    "kontakt" => 1,
    "produkter" => 1
);

print "Forside: ".$allowed["forside"];
print "<br><br>";
print "Bagside: ".$allowed["bagside"];

Når du i en PHP-betingelse får returneret 1, svarer til, at der returneres true. Returneres ikke noget, null eller 0, svarer det til, at der blev returneret false.

Det er ligemeget, om der i array'et står:
    "bagside" => 0

- eller om 'bagside' slet ikke er nævnt. Betingelsen i:
    if ( $allowed[$_GET["page"]] ) include($_GET["page"].".html");

- kan ikke opfyldes. Håber det er forståeligt. Ellers må du lige sige til  ;o)
Avatar billede superdreng Nybegynder
19. september 2007 - 18:13 #5
Okay, det kunne jeg godt forstå, Tak for svaret!

Dejligt når nogen gerne vil foreklare noget!

Gode ide det med at man skal give lov ("forside" => 1,) før man kan komme ind på siden, istedet for at det foregår automatisk.
Det kan jo tit trickes til at scripten skal køre en dårlig fil eller medføre at siden bliver hacket!

Endnu en gang tak!
Avatar billede olebole Juniormester
19. september 2007 - 18:33 #6
- og tak for points  ;o)
Avatar billede showsource Seniormester
20. september 2007 - 20:28 #7
En anden måde, uden at lave array'et, er at lægge dine include-filer i èn mappe, som du definerer stien til i den fil som includer

<?php
$file_path = "/var/www/site/myincludes/";

eller
define("file_path", "/var/www/site/myincludes/");

if(isset($_GET["page"]) && is_file($file_path . $_GET["page"])) {
include($file_path . $_GET["page"]);
}else{
include($file_path . forside.php");
}

Hvis du bruger define() er variablen "tilgængelig overalt" på samme måde som $_GET, $_POST m.m. og skal skrives uden $

include(file_path . $_GET["page"]);
Avatar billede olebole Juniormester
20. september 2007 - 23:26 #8
- men der er også dem, der bare spænder et bombebælte om maven!  ;o)

showsource >> Med al respekt: Det er rent selvmord! Du kan som bruger 'navigere' rundt og få inkluderet dokumenter fra hele sitet - og alt udenfor webspace - ved stier som:
    http://www.domain.dk/fil.php?page=../../sti/til/mappe/andenfil.php

- hvilket vil resultere i inkludering af filen:
    /var/www/sti/til/mappe/andenfil.php

... need I say more?  :)
Avatar billede olebole Juniormester
20. september 2007 - 23:30 #9
- men det er en skræmmende almindelig fejl! Der advares meget ofte om metoden her i kategorien ... erikjacobsen og jeg går i hvertfald altid i sort, når vi ser den  ;o)
Avatar billede showsource Seniormester
21. september 2007 - 06:44 #10
$file_path = "/var/www/site/myincludes/";

Kun filer herfra includes, ole, is_file()

if(isset($_GET["page"]) && is_file($file_path . $_GET["page"])) {
Avatar billede showsource Seniormester
21. september 2007 - 12:14 #11
uha, var sgutte klar over at ../ kunne bruges til at gå tilbage! :O(((((((((((

Anyway, så kan basename($_GET["page"]) så bruges.


$file_path = "/var/www/site/myincludes/";

if(isset($_GET["page"]) && is_file($file_path . basename($_GET["page"]))) {


Man kan også læse dir igennem for filer, for på den måde at lave et array med includefiler.

Altså, der er flere måder at gøre det på.

Og for satan da, at man kan bruge ../ er sgu noget skod!
Avatar billede superdreng Nybegynder
21. september 2007 - 21:29 #12
Tak for din hjælp showsource, men jeg fortrækker olebole's foreslag!

:D
Avatar billede olebole Juniormester
22. september 2007 - 00:55 #13
showsource >> Dette viser på forbilledlig vis, hvorfor det er god kodepraksis, at sikre sig, at de modtagne data indeholder det forventede - og kun det ... i modsætning til at tjekke, om de indeholder noget ulovligt.

Ingen kan overskue alt, der kan udnyttes - men enhver kan overskue, om brugerinputtet er lovligt, hvis han holder sin applikation i kort snor.

En computer applikation er et af de få steder, totalitarisme er et must! Alt, hvad der ikke eksplicit er lovligt, er ulovligt. Foretager brugeren sig noget, der ikke er specificeret som lovligt, har han pr. automatik gang i noget ulovligt ... that's it 'n' that's that! Nak ham!  ;o)
Avatar billede showsource Seniormester
22. september 2007 - 05:35 #14
superdreng -> jow jow, det var bare for at sige der er andre muligheder også :O)

At det så endte med at blive et "mega slag midt i ansigtet" på mig selv ..........
Det er det mest pnlige jeg har lavet med computer i årevis!

Der går lsng tid før jeg kommer mig over det :O((((((((
Avatar billede superdreng Nybegynder
07. oktober 2007 - 19:14 #15
Nu skal du ikke tage det for tungt, showsource!

Man lærer hele tiden noget! ;-)
Avatar billede olebole Juniormester
07. oktober 2007 - 19:26 #16
showsource >> ingen af os er født med den viden. Den stol, jeg sad i, da jeg selv blev gjort opmærksom på problematikken, lugtede sandelig ikke for godt efterfølgende! Selvom den slags er noget, det føles bedst at få at vide under fire øjne, er det trods alt bedre, du finder ud af det på denne måde. Sorry ... og så ikke helt alligevel  ;o)
Avatar billede olebole Juniormester
07. oktober 2007 - 19:27 #17
- og så fik jeg vist aldrig sagt tak for points. Det er hermed gjort  :)
Avatar billede superdreng Nybegynder
07. oktober 2007 - 21:34 #18
Det var da så lidt! :D
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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