Avatar billede donslund Nybegynder
17. april 2005 - 22:42 Der er 29 kommentarer og
1 løsning

Include fil alt efter hvad der står i adresselinien

<?
        if ($inc == '') {
            include 'start.php';
        } else {
            include $inc.".php";
        }
?>

Burde det ikke være rigtigt så den fanger www.domæne.dk/?inc=biografi
Avatar billede busschou Praktikant
17. april 2005 - 22:43 #1
<?
        if ($_GET['inc'] == "") {
            include 'start.php';
        } else {
            include $inc.".php";
        }
?>
Avatar billede busschou Praktikant
17. april 2005 - 22:44 #2
<?
        if ($_GET['inc'] == "") {
            include 'start.php';
        } else {
            include $_GET['inc'].".php";
        }
?>
Avatar billede donslund Nybegynder
17. april 2005 - 22:46 #3
Stammer du ;-)


Følgernde kommer:

Warning: main(.php): failed to open stream: No such file or directory in /customers/troels-ravn.dk/troels-ravn.dk/httpd.www/NyWeb/index.php on line 46

Warning: main(): Failed opening '.php' for inclusion (include_path='.:/usr/lib/php') in /customers/troels-ravn.dk/troels-ravn.dk/httpd.www/NyWeb/index.php on line 46
Avatar billede busschou Praktikant
17. april 2005 - 22:52 #4
ja så stammer jeg....men jeg ville have troet det virkede...hmm :o/
linje 46 er?
Avatar billede donslund Nybegynder
17. april 2005 - 22:55 #5
include $inc.".php";
Avatar billede hyberpreprocessor Nybegynder
17. april 2005 - 22:56 #6
<?
        if (!empty($_GET['inc']) {
            include("start.php");
        } else {
            include($_GET['inc'].".php");
        }
?>
Avatar billede hyberpreprocessor Nybegynder
17. april 2005 - 22:56 #7
ups

<?
        if (empty($_GET['inc']) {
            include("start.php");
        } else {
            include($_GET['inc'].".php");
        }
?>

havde lige overset at den første skulle være en default.
Avatar billede donslund Nybegynder
17. april 2005 - 23:00 #8
Og en enkelt ) i første linie, men ellers virker det.
Avatar billede busschou Praktikant
17. april 2005 - 23:00 #9
donslund... så har du jo ikke brugt min "stammen" de er jo forskellige de to indlæg
Avatar billede dennismp Nybegynder
17. april 2005 - 23:07 #10
Lad os håbe på at folk så ikke skriver: index.php?inc=http://minwebserver.dk/sletalt.txt

hvor sletalt.txt er php kode der sletter alt.

Eller hvad man nu kan finde på.
Avatar billede dennismp Nybegynder
17. april 2005 - 23:09 #11
ah, bare index.php?inc=http://minwebserver.dk/sletalt

og så sætte minwebserver.dk til at returnerer en textfil når sletalt.php kaldes

(For at være lidt mere præcis :) )
Avatar billede b_ball Nybegynder
17. april 2005 - 23:12 #12
Hva med:

        <?php
        $openinc = $_REQUEST['inc']; //Finder $inc og får den lagt over i $opencom
        if ($openinc) //Hvis $opencom er udfyldt skal den gå videre
            {
                if ( file_exists( "$openinc.php" )) //Tjekker om filen findes
                {
                    include( "$openinc.php" ); //Hvis filen findes bliver den includeret
                }
                else
                {
                    echo "Der er desvære ikke noget fil der hedder dette."; //Hvis filen ikke finde udskriver den dette
                }
            }else //Forsiden udskrives
            {
                include ("start.php"); //Includere forsiden
            }
        ?>
Avatar billede dennismp Nybegynder
17. april 2005 - 23:18 #13
Samme problem, så vidt jeg kan se virker file_exists() vist også på http:// streams. (er ikke 100% sikker)

Omvendt, hvis du bruger koden på et webhotel, så kan man jo selv bestemme hvilken man ønsker at include (alt efter opsætning).

Mit svar er, enten lav det om, eller i det mindste lav en liste over hvilke "inc"'er der er lovlige og så tjekke op imod dem. Dermed bestemmer og kontrollerer du helt præcist hvilke filer der bliver kaldt.
Avatar billede hyberpreprocessor Nybegynder
17. april 2005 - 23:20 #14
ja, dennismp har (som altid) ret, det er en meget usikker løsning.
dog virker include altså ikke hen over andre domæner, det skal være lokalt.
og man kan altid droppe en masser sikkerhed ned i det.

b_ball $_REQUEST er rimeligt dumt at bruge

$_REQUEST = $_GET $_POST og $_COOKIE (mener at $_SESSION er undtaget)
Avatar billede b_ball Nybegynder
17. april 2005 - 23:23 #15
Tjaa man kan vel også bare sige:

  <?php
        if ($inc) //Hvis $opencom er udfyldt skal den gå videre
            {
                if ( file_exists( "$inc.php" )) //Tjekker om filen findes
                {
                    include( "$inc.php" ); //Hvis filen findes bliver den includeret
                }
                else
                {
                    echo "Der er desvære ikke noget fil der hedder dette."; //Hvis filen ikke finde udskriver den dette
                }
            }else //Forsiden udskrives
            {
                include ("start.php"); //Includere forsiden
            }
        ?>
Avatar billede b_ball Nybegynder
17. april 2005 - 23:23 #16
eller skrive GET...
Avatar billede b_ball Nybegynder
17. april 2005 - 23:26 #17
Mht. det med at man kan includere filer der ikke var meningen man ville includere så kan man jo bare søre for at alle filer der skal includeres ligger i en mappe og at den kun kan includere fra den mappe.
Avatar billede ranglen Nybegynder
17. april 2005 - 23:26 #18
file_exists() kan kun kontrollere lokale filer
include() kan også inklude fra anden webserver, afhængig af php.ini

--- En Lidt mere sikker løsning:

// tilladte filer
$incfiles = array(
    'start' => 'start.php',
    'biografi' => 'biografi.php',
    'hej' => 'etheltandetfilnavn.php'
);


$getinc = isset($_GET['inc']) ? $_GET['inc'] : 'start';

if(array_key_exists($getinc, $incfiles)){
    $incfile = $incfiles[$getinc];
}else{
    $incfile = $incfiles['start'];
}

include($incfile);
Avatar billede dennismp Nybegynder
17. april 2005 - 23:28 #19
hyber: Hvorfor virker det ikke på andre domæner? PHP kan sagents (mener endda at det er default) forstå include("http://www.google.com");

Jeg har desværre set at flere af eksperterne herinde ikke har taget højde for den slags. Jeg har en anden måde at gøre det på, men det er lidt omstændigt at forklare.

Hvis jeg må komme med et forslag:

$allowed = array('side1' => 'side1.php','sideti' => 'sub3/side10.php','om os' => 'about.php');

if( isset($_GET['inc']) )
  $inc = $_GET['inc'];
else
  $inc = 'side1'; // default

if( isset($allowed[$inc]) )
  include($allowed[$inc]);
else
  include('securityerror.php');

så kan siden kaldes med
index.php?inc=side1  - vil loade side1.php
index.php?inc=sideti - vil loade sub3/side10.php
index.php?inc=om+os  - vil loade about.php
index.php            - vil loade side1.php
index.php?inc=http://www.google.com - vil loade securityerror.php
Avatar billede dennismp Nybegynder
17. april 2005 - 23:31 #20
ah, ranglen var hurtigere. Men samme løsning :)

"Tip: As of PHP 5.0.0 this function[file_exists] can also be used with some URL wrappers."

herunder ftp (men ikke http)
Avatar billede hyberpreprocessor Nybegynder
17. april 2005 - 23:35 #21
synes eller jeg havde testet include på andre domæner...

Jeg bruger selv denne omtalte include() arkitektur, men med mod_rewrite og en bunke sikkerhed ovenpå :) Det hjælper en del.
Avatar billede hyberpreprocessor Nybegynder
17. april 2005 - 23:36 #22
testede lige, file_exists() blokker for andre urls på min side, php 4.3.x
Avatar billede dennismp Nybegynder
17. april 2005 - 23:45 #23
Tillykke :) Jeg har også slået det fra :)
Avatar billede sukos Juniormester
18. april 2005 - 13:13 #24
Det er bedst at bruge is_file()
file_exists() "godkender" også et dir

<?php
$fildir = "/sti/til/dir/";  // Her ligger de filer som kan includes

if(isset($_GET["inc"])) {
    if(is_file($fildir . $_GET["inc"] .".php")) {
    include($fildir . $_GET["inc"] .".php");
    }else{
    include($fildir . "start.php");
    }
}else{
include($fildir . "start.php");
}

?>
Avatar billede hyberpreprocessor Nybegynder
18. april 2005 - 18:55 #25
sukos, hvis man nu også vil bruges dirs såå :D
Avatar billede hyberpreprocessor Nybegynder
19. april 2005 - 19:59 #26
donslund lukketid ?
Avatar billede sukos Juniormester
19. april 2005 - 20:03 #27
dirs?
Vil du include et dir?
Avatar billede hyberpreprocessor Nybegynder
19. april 2005 - 20:05 #28
mente som i index.php?page=galleriet/side1.php :)
Avatar billede donslund Nybegynder
25. april 2005 - 15:27 #29
Jeps. Hyperpreprocessor, smid et svar.
Avatar billede donslund Nybegynder
28. april 2005 - 10:50 #30
Så laver jeg selv et svar. Så kan jeg da selv tage pointene hvis der ikke er nogen der vil have dem ;-)
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