DiamondDog: Nach Server umzug Probleme mit include

Hallo Leute,
folgendes Problem:
Und zwar funktioniert mein include nach meinem Serverumzug nicht mehr und ich weiß nicht ganz wieso.
Immer wenn ich auf einen Link klicke dann wird die Seite nur neu geladen, aber es wird nicht die angezeigt bzw included die eigendlich sollte.

<?php if (!isset($site)) { $site="index_home"; } include ("$site.php"); ?>

Hier zur nicht funktionierenden Seite

Hier zur funktionierenden Seite

PHP Info nicht funktionierende Seite

PHP Info funktionierende Seite

Hoffe das jemand rausbekommt woran es liegt und es nicht so viel Arbeit sein wird.

Danke schon mal fürs Helfen.

Mfg Dog

  1. Hello,

    Hoffe das jemand rausbekommt woran es liegt und es nicht so viel Arbeit sein wird.

    ja, dein Skript setzt auf eine veraltete weil potenziell sehr gefährliche Technologie: aktiviertes register_globals
    Empfehlung: Skripte umschreiben
    Notlösung: Register globals aktivieren.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Inter Arma Enim Silent Leges  --  Cicero
    1. Empfehlung: Skripte umschreiben
      Notlösung: Register globals aktivieren.

      Ok soweit hab ich das schon mal verstanden.
      Das Problem ist hab das mit dem include damals vom Kollegen bekommen kenn mich so damit leider nicht richtig aus.

      Also wenn ich das richtig verstehe müste der auf dessen Server ich jetzt bin das Register globals aktivieren oder kann ich das auch per PHP Script oder so?

      Und zur Empfehlung was müste ich im Script ändern damit es wieder funktioniert?

      1. Hallöchen,

        Und zur Empfehlung was müste ich im Script ändern damit es wieder funktioniert?

        Du hast bei deinen Links z.B.
          href="index.php?site=fotogalerie/index"

        Mit "register_globals" hattest du bisher beim Aufruf über diesen Link in index.php $site mit dem Inhalt 'fotogalerie/index' zur Verfügung. Die bei der Übergabe per URL benutzte Methode ist GET.

        Ohne "register_globals" hast du im Script zwar nicht $site, aber du hast die globale Variable $_GET. Das ist ein Array, das alle per GET übergebenen Variablen enthält. Damit hast du

        NICHT   $site
          ABER    $_GET['site']

        Die saubere Methode: du schreibst dein Script entsprechend um, d.h. wo du jetzt auf einen per Link übergebenen Parameter mit dem im Link enthaltenen Namen zugreifst (im Beispiel $site), änderst du den Variablennamen auf das entsprechende Element von $_GET (im Beispiel $_GET['site']).

        Die schnelle Methode: Am Anfang jedes Scripts, das Get-Parameter verarbeitet, nutzt du die import-request-variables Funktion.

        MfG
        vaudi

        1. Macht das Script trotzdem nicht grad sicherer.

          --
          Trau Dich!
           
          1. Hallöchen,

            Macht das Script trotzdem nicht grad sicherer.

            Die Frage war ja auch "Was tun, damit es wieder funktioniert".

            Wenn du darin Probleme mit der Sicherheit siehst, wäre es nett, dies etwas näher zu erläutern, vielleicht sogar mit Lösungsvorschlägen...

            MfG
            vaudi

            1. Die Übernahme einer Usereingabe direkt in ein include erscheint mir auch sehr sicher.
              Wenn du schon weiterhin mit include arbeiten willst, erstell dir zumindest eine Whitelist(zB ein array mit allen gültigen Pfaden) und prüfe jedesmal, ob der geforderte Pfad in dieser Whitelist ist (in_array()). Wenn nicht, verweigere das include.

              1. Also ich hab das jetzt mal so Probiert:

                <?php if ($_GET['site']) { $site="index_home"; } include ("$site.php"); ?>

                Bin mir aber leider nicht sicher, ob das so Richtig ist.
                Hab wie gesagt nicht viel Ahnung von PHP und den include Code, damals vom Kollegen bekommen.

                Wenn das so falsch sein sollte, wäre super wenn es jemand berichtigen würde.

                1. Hallöchen,

                  <?php if ($_GET['site']) { $site="index_home"; } include ("$site.php"); ?>

                  if ($_GET['site'])
                  Damit fragst du ab, ob was übergeben wurde.
                    { $site="index_home"; }
                  Wenn ja, weist du $site den Namen der Startseite zu.
                    include ("$site.php");
                  Dann wird der Include ausgeführt.

                  Das Ergebnis:

                  • wurde was übergeben, includest du "index_home.php"
                  • wurde nichts übergeben, includest du ".php"
                    Das ist bestimmt nicht das, was du willst.

                  Du brauchst was in der Art:

                  <?php if (isset($_GET['site']) && file_exists($_GET['site'])) {  
                    include ($_GET['site'].'.php)';  
                  }  
                  else {  
                    include ("index_home");  
                  } 
                  

                  Mit isset() überprüfst du, ob überhaupt was übergeben wurde.
                  Mit  file_exists() überprüfst du, ob die angegebene Datei auf deiner Site wirklich existiert. Damit hast du eine Grundabsicherung gegen einen manipulierten Übergabeparameter, denn es werden nur Seiten deiner eigenen Site angezeigt.

                  MfG
                  vaudi

                  1. Also ich habs jetzt so gemacht:

                      
                    <?php  
                       if (!isset($_GET['site'])) {  
                         $site="index_home";  
                         } else {  
                         $site = $_GET['site'];  
                         }  
                       include ($site.'.php');  
                    ?>
                    

                    Das funktioniert auch wie es soll.
                    Mach ich es aber so:

                      
                    <?php  
                       if (!isset($_GET['site']) && file_exists($_GET['site'])) {  
                         $site="index_home";  
                         } else {  
                         $site = $_GET['site'];  
                         }  
                         include ($site.'.php');  
                    ?>
                    

                    funktioniert es nicht mehr.

                    Kann man auch eine Nachricht anzeigen lassen wenn zb eine Datein nicht existiert?

                    1. Hallöchen,

                      <?php if (!isset($_GET['site'])) ?>

                      Das funktioniert auch wie es soll.

                      Interpretation der Bedingung: wenn nichts übergeben wurde
                      In diesem Zusammenhang passt das.

                      Mach ich es aber so:
                      <?php if (!isset($_GET['site']) && file_exists($_GET['site'])) ?>
                      funktioniert es nicht mehr.

                      Interpretation dieser if-Bedingung:
                      1. Bedingung: wenn nichts übergeben wurde
                      2. Bedingung: wenn die übergebene Datei existiert

                      Hier klappt es nur, wenn du
                      a) in der ersten Bedingung die Negierung durch das "!" weglässt und
                      b) die Anweisungen im jetzigen if und else tauschst
                      Denn die Abfrage geht ja auf

                      if (wurde übergeben && ist gültig)
                          zeige übergebene Datei
                        else
                          zeige Startdatei

                      Das file_exists() ist ja nur dann sinnvoll abzufragen, WENN etwas übergeben wurde.

                      Kann man auch eine Nachricht anzeigen lassen wenn zb eine Datein nicht existiert?

                      Klar doch. Ob notwendig oder nicht, kriegst du ja über die aktuelle Abfrage raus. Als erstes musst du dir überlegen, was und wie du es anzeigen willst. Weiter oben stand schon der Hinweis auf eine Error 404 - Behandlung.

                      MfG
                      vaudi

                      1. Also wenn ich das alles Richtig verstanden habe müste es so aussehn:

                          
                        <?php  
                         if (isset($_GET['site']) && file_exists($_GET['site']))  
                         {  
                         $site = $_GET['site'];  
                         }  
                         else  
                         {  
                         $site="index_home";  
                         }  
                         include ($site.'.php');  
                        ?>  
                        
                        ~~~problem hierbei ist es wird immer die Startseite geladen.  
                        So langsam wird das echt zu hoch für mich :(
                        
                        1. Hallöchen,

                          Also wenn ich das alles Richtig verstanden habe müste es so aussehn:

                          Hast du.

                          Problem hierbei ist es wird immer die Startseite geladen.

                          Weil file_exists() die Datei nicht lokalisieren kann. Bedingung dafür ist, dass die gewünschte Datei über das Dateisystem deiner Website zugänglich ist.

                          So langsam wird das echt zu hoch für mich :(

                          Mit bissel "ich will" kommst du auf die notwendige Höhe :)

                          Dann zieh dir noch mal die Funktion file_exists() rein, vor allem wie die Pfadanweisung im Parameter aufgebaut sein muss, damit er die Datei auch findet.
                          Zum Testen kannst du mal sowas nehmen:

                            
                          // Dateipfad+Name direkt eingeben und Zugriff testen  
                          echo 'direkter Test mit "hunde/html/index-1.php"'<br>';  
                          if (file_exists("hunde/html/index-1.php")) { echo 'gefunden<br>'; }  
                           else { echo 'nicht gefunden<br>'; }  
                            
                          // Übergabeparameter anzeigen, dann Zugriff testen  
                          echo 'übergeben: '.$_GET['site'].'<br>';  
                          if (file_exists($_GET['site'])) { echo 'gefunden<br>'; }  
                           else { echo 'nicht gefunden<br>'; }  
                          
                          

                          Sinn des Ganzen: mit direkt den Pfad in den Quelltext schreiben erst mal solange testen, bis der Zugriff klappt. Dann das Ganze mit dem Übergabeparameter versuchen. Und bei unterschiedlichen Ergebnissen suchen, wo der Unterschied ist zwischen der festen Eingabe und dem, was per Code dynamisch zusammengesetzt wird.

                          MfG
                          vaudi

                          1. Also nun hab ichs so:

                              
                             <?php  
                                  if (isset($_GET['site']))  
                               {  
                               echo 'gefunden<br>';  
                               //--------  
                               if (file_exists($_GET['site']))  
                               {  
                               echo 'existiert<br>';  
                               }  
                                  else  
                               {  
                               echo 'existiert nicht<br>';  
                               $site="index_home";  
                               }  
                               //----------  
                               $site=($_GET['site']);  
                                  }  
                                  else  
                                  {  
                                  echo 'nicht gefunden<br>';  
                                  $site="index_home";  
                                  }  
                                  include ($site.'.php');  
                               ?>
                            

                            Ok er unterscheidet jetzt schon zwischen gefunden und nicht gefunden wenn nicht gefunden dann ruft er index_home auf.
                            Wenn gefunden soll er Prüfen ob existiert nur egal ob es die seite gibt oder nicht er sagt immer existiert nicht.

                            1. Hallöchen,

                              Ok er unterscheidet jetzt schon zwischen gefunden und nicht gefunden wenn nicht gefunden dann ruft er index_home auf.
                              Wenn gefunden soll er Prüfen ob existiert nur egal ob es die seite gibt oder nicht er sagt immer existiert nicht.

                              Ich glaube, du hast die vorgeschlagene Kontrollausgabe von $_GET['site'] nicht gemacht. Die sollten dir nämlich zeigen, wo der Fehler liegt.
                              Was steht in $_GET['site'] drin? Richtig, z.B. "hunde/html/index-1". Ist das eine gültige Datei?

                              Wenn nicht gefunden, gibst du $site den Inhalt "index_home". Sieht aus wie exakt das Gleiche, würde aber von file_exists() auch nicht gefunden werden.

                              Das der include von "index_home" klappt, liegt hieran:

                                
                                include ($site.'.php');
                              

                              ^^^^^^^
                              Deshalb wird nur

                                
                                if (file_exists($_GET['site'].'.php'))
                              

                              ^^^^^^^
                              funktionieren...

                              MfG
                              vaudi

                              1. Super so funktioniert es:

                                  
                                 <?php  
                                      if (isset($_GET['site']))  
                                   {  
                                   //echo 'gefunden<br>';  
                                   // Prüfen ob Seite existiert--------  
                                   if (file_exists($_GET['site'].'.php'))  
                                   {  
                                   //echo 'existiert<br>';  
                                   }  
                                      else  
                                   {  
                                   echo '<b>Die auferufene Seite existiert leider nicht!</b><br><br><br>';  
                                   $site="admin_home";  
                                   }  
                                   //---------------------------------  
                                   $site=($_GET['site']);  
                                      }  
                                      else  
                                      {  
                                      //echo 'nicht gefunden<br>';  
                                      $site="admin_home";  
                                      }  
                                      include ($site.'.php');  
                                   ?>  
                                
                                

                                1000 Dank fürs Helfen und für die Geduld.

                                1. Hi!

                                  Darf ich noch was anmerken?

                                  Der Code is ok. Mitten im HTML is das aber nicht so schoen. Schreib das noch vor dein HTML und in das HTML nur das include. Dann ist es uebersichtlicher.

                                  --
                                  Trau Dich!
                                   
                                  1. Moin!

                                    Darf ich noch was anmerken?

                                    Der Code is ok.

                                    Der Code ist nicht ok.

                                    Ich kürze ihn dir mal zusammen, damit du das Problem siehst:

                                    <?php
                                    if (isset($_GET['site']))
                                    {
                                       if (!file_exists($_GET['site'].'.php'))
                                       {
                                         echo '<b>Die auferufene Seite existiert leider nicht!</b><br><br><br>';
                                         $site="admin_home";
                                       }
                                       $site=($_GET['site']); // WAS MACHT DIESE ZEILE HIER?
                                    }
                                    else
                                    {
                                       $site="admin_home";
                                    }
                                    include ($site.'.php');
                                    ?>

                                      
                                    Wenn die einzubindende Datei nicht gefunden wird, wird $site zuerst mit dem Standardwert belegt, dann aber in jedem Fall wieder mit dem übergebenen Wert der nichtexistenten Datei.  
                                      
                                    Die Variante mit isset() und file\_exists() in EINER Bedingung hat mir da deutlich besser gefallen.  
                                      
                                     - Sven Rautenberg
                                    
                                    -- 
                                    "Love your nation - respect the others."
                                    
                                    1. Moinsen!

                                      Stimmt! Habs nur überflogen. Die entsprechende Zeile is schon ok, nur sollte sie dann vor das if.

                                      --
                                      Trau Dich!
                                       
                  2. Hi vaudi,

                    <?php if (isset($_GET['site']) && file_exists($_GET['site'])) {

                    include ($_GET['site'].'.php)';
                    }

                      
                    An dieser Stelle müsste wenn, dann  
                      
                      file\_exists($\_GET['site'] . '.php')  
                      
                    stehen, also mit '.php' an den Wert angehängt, da beim Include ja schließlich auch noch die Endung angehängt wird.  
                      
                    Trotzdem möchte ich noch mal darauf hinweisen, dass dies SICHERHEITSRISIKEN birgt! In der von dir (vaudi) vorgestellten Form ist das nicht sicher programmiert, das Original von DiamondDog ist ebenso unsicher.  
                      
                    So etwas sollte in einer Form, wie der [von Patrick vorgeschlagenen](https://forum.selfhtml.org/?t=175628&m=1154709) Form lösen. Gründe hierfür findest du u.a. in [diesem Archivposting von mir](http://forum.de.selfhtml.org/archiv/2005/8/t114252/#m727843), oder auch [hier](http://forum.de.selfhtml.org/archiv/2006/11/t140644/#m913859). Desweiteren sollte man statt include() besser readfile() nehmen, wenn in der einzubindenden Seite gar kein PHP-Code notiert ist, siehe auch [diese Erläuterung von Christian Seiler](http://forum.de.selfhtml.org/archiv/2007/12/t163143/#m1062191).  
                      
                      
                    Viele Grüße,  
                      ~ Dennis.
                    
                    -- 
                    Mein [SelfCode](http://community.de.selfhtml.org/fanprojekte/selfcode.htm): [ie:{ fl:( br:> va:) ls:\[ fo:) rl:( n4:# ss:) de:\] js:| ch:{ sh:| mo:} zu:|](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%23+ss%3A%29+de%3A%5D+js%3A%7C+ch%3A%7B+sh%3A%7C+mo%3A%7D+zu%3A%7C)
                    
                    1. Hallöchen,

                      An dieser Stelle müsste wenn, dann

                      file_exists($_GET['site'] . '.php')

                      stehen, also mit '.php' an den Wert angehängt, da beim Include ja schließlich auch noch die Endung angehängt wird.

                      Das kam später im Thread noch...

                      Trotzdem möchte ich noch mal darauf hinweisen, dass dies SICHERHEITSRISIKEN birgt! In der von dir (vaudi) vorgestellten Form ist das nicht sicher programmiert, das Original von DiamondDog ist ebenso unsicher.

                      Da geb ich dir völlig recht. Bei mir selbst hab ich so eine Überprüfung drin.

                      Hier ging es vorrangig drum, das etwas Vorhandenes wieder funktioniert, und dass der OP kapiert, was und warum es zu ändern sei. Ich hoffe mal, er hat auch die diversen Anmerkungen zum Thema Sicherheit mit registriert und berücksichtigt dies.

                      MfG
                      vaudi

                2. Sieht schonmal nicht schlecht aus.
                  Auf dauer werden es wohl zu viele elseifs bzw. cases, daher ist die Variante mit dem array einfacher:

                    
                  //alle gültigen Seiten in dieses Array  
                  $valid_sites = array('index_home',  
                         'index_foobar');  
                  //wenn der GET-Parameter site übergeben wurde und er im array $valid_sites ist  
                  if (isset($_GET['site']) AND in_array($_GET['site'], $valid_sites)) {  
                   include $_GET['site'] . '.php';  
                  } else {  
                   echo '404';  
                   //TODO: error-handling, 404 o.ä.  
                  }