[PHP] include problem

birwac66

Well-known member
ID: 178958
L
20 April 2006
558
17
Erst mal meine datei:
<?php
$inc_array = array();
$inc_dir=opendir ("./seiten");
while ($inc = readdir ($inc_dir)) {
if($inc != "." && $inc != "..") {
$short_inc = str_replace(".php", "", $inc);
array_push ($inc_array, $short_inc);
}
}
closedir($inc_dir);

if (isset($_GET[site]) && in_array($_GET[site], $inc_array))
{
include("./seiten/".$_GET[site].".php");
}
else {
include("start.php");
}
?>
Das Problem:
Wenn ich nun eine Seite aufrufe ?site=test bekomm ich das gewünschte wenn ich jedoch ?site=test/test aufrufe stimmt zwar der pfad include("./seiten/test/test.php"); aber ich bekomm die seite start.php angezeigt

was ist an meinem Quelltext falsch?
 
$inc_array enthält nur die PHP-Dateien direkt in seiten. Du musst rekursiv auch noch in die Unterverzeichnisse wechseln und dort die Dateien auslesen.

is_dir() sollte Dir weiterhelfen.
 
$inc_array enthält nur die PHP-Dateien direkt in seiten. Du musst rekursiv auch noch in die Unterverzeichnisse wechseln und dort die Dateien auslesen.

is_dir() sollte Dir weiterhelfen.
ok wiemüsste des dann laufen des bei php.net bringt mich ned weiter

und auch wenn ich bischen rumprobiere bekomm ich nicht das gewünschte ergebnis
 
Biddeschön:
PHP:
  function fetchSites( $directory, $prefix = null )
  {
    $result = Array();
    
    $dir_handle = opendir( $directory );
    while ( $file = readdir( $dir_handle ) )
    {
      if ( $file == '.' or $file == '..' )
      {
        continue;
      }
      if ( is_dir( $directory.'/'.$file ) )
      {
        $result = array_merge( $result, fetchSites( $directory.'/'.$file, $prefix.$file.'/' ) );
      }
      else 
      {
        $file_parts = explode( '.', $file );
        $ext = array_pop( $file_parts );
        if ( $ext != 'php' )
        {
          continue;
        }
        $file = implode( '.', $file_parts );
        array_push( $result, $prefix.$file );
      }
    }
    closedir( $dir_handle );
    return $result;
  }

  $inc_array = fetchSites('./seiten');
 
Biddeschön:
PHP:
  function fetchSites( $directory, $prefix = null )
  {
    $result = Array();
    
    $dir_handle = opendir( $directory );
    while ( $file = readdir( $dir_handle ) )
    {
      if ( $file == '.' or $file == '..' )
      {
        continue;
      }
      if ( is_dir( $directory.'/'.$file ) )
      {
        $result = array_merge( $result, fetchSites( $directory.'/'.$file, $prefix.$file.'/' ) );
      }
      else 
      {
        $file_parts = explode( '.', $file );
        $ext = array_pop( $file_parts );
        if ( $ext != 'php' )
        {
          continue;
        }
        $file = implode( '.', $file_parts );
        array_push( $result, $prefix.$file );
      }
    }
    closedir( $dir_handle );
    return $result;
  }

  $inc_array = fetchSites('./seiten');

ok geht nur noch eine frage
was muss ich machen, damit die datei auch .irgendwas.php heißen kann?
PHP:
if ( $ext != 'php' )
wenn ich hier des dann reinschreibe gehts ned
PHP:
if ( $ext != 'irgenwas.php' )
 
:ugly: wer kommt auf so ein mist? schonmal was von file_exists, is_file oder is_readable gehört?

PHP:
if (isset($_GET[site]) && file_exists("./seiten/".$_GET[site]))
{
include("./seiten/".$_GET[site].".php");
}
else {
include("start.php");
}

btw: vorher natürlich noch prüfen ob jemand versucht zu manipulieren... zb mit ../../../../etc/passwd oder sowas in die richtung.
 
:ugly: wer kommt auf so ein mist? schonmal was von file_exists, is_file oder is_readable gehört?

PHP:
if (isset($_GET[site]) && file_exists("./seiten/".$_GET[site]))
{
include("./seiten/".$_GET[site].".php");
}
else {
include("start.php");
}

btw: vorher natürlich noch prüfen ob jemand versucht zu manipulieren... zb mit ../../../../etc/passwd oder sowas in die richtung.
genau das machst das script davor und zufrieden bin ich auch mit diesem deshalb würd ich die auch gerne weiterhin nutzen
 
Zuletzt bearbeitet:
genau das machst das script davor und zufrieden bin ich auch mit diesem deshalb würd ich die auch gerne weiterhin nutzen

ja ich weiß was das script macht und was es bezwecken soll... aber das kann man auch geschickter lösen als jedesmal nen verzeichniss in nem array einzulesen und dann zu vergleichen. das kostet sinnlos ressourcen...

zb:
PHP:
if(
	$_GET['site'] &&
	preg_match("~^dirname(__FILE__)."/seiten/"~",realpath("./seiten/".$_GET[site])) &&
	file_exists(...)
) {
	//alles io
}

oder man nimmt einfach ne selbst erstellt whitelist