Sara: Unerklärlicher Fehler im PHP-Programm

Hallo,
trotz langer Suche komme ich nicht dahinter, wo der Fehler liegt.
Ich setze jetzt meine Hoffnung auf Euch.

Meine PHP-Statements:

echo "***   \$_SERVER['MyAkt_SeitenDir'] = ";  
echo $_SERVER['MyAkt_SeitenDir'];  
echo "<br>***<br>";  

if (@opendir   ($_SERVER['MyAkt_SeitenDir']))  
  {  
   echo PHP_EOL;  
   require_once ($_SERVER['MyAkt_SeitenDir'] . '/meta_ind.php');  
  }  
else  
  {  
   echo 'Unzulässiger Aufruf: require_once (' . $_SERVER['MyAkt_SeitenDir'] . '/meta_ind.php)';  
   exit;

Obwohl laut Testausgabe $_SERVER['MyAkt_SeitenDir'] vorhanden ist, kommt die nachfolgende Fehlermeldung:

*** $_SERVER['MyAkt_SeitenDir' = /home/mydom/htdocs/de/zSeite
***
Unzulässiger Aufruf: require_once (/home/mydom/htdocs/de/zSeite/meta_ind.php)

  1. Moin Sara,

    echo "***   \$_SERVER['MyAkt_SeitenDir'] = ";  
    echo $_SERVER['MyAkt_SeitenDir'];  
    echo "<br>***<br>";  
    
    if (@opendir   ($_SERVER['MyAkt_SeitenDir']))  
      {  
       echo PHP_EOL;  
       require_once ($_SERVER['MyAkt_SeitenDir'] . '/meta_ind.php');  
      }  
    else  
      {  
       echo 'Unzulässiger Aufruf: require_once (' . $_SERVER['MyAkt_SeitenDir'] . '/meta_ind.php)';  
       exit;
    

    Obwohl laut Testausgabe $_SERVER['MyAkt_SeitenDir'] vorhanden ist, kommt die nachfolgende Fehlermeldung:

    *** $_SERVER['MyAkt_SeitenDir' = /home/mydom/htdocs/de/zSeite
    ***
    Unzulässiger Aufruf: require_once (/home/mydom/htdocs/de/zSeite/meta_ind.php)

    Dass der Array-Eintrag vorhanden ist, heißt noch nicht, dass das damit bezeichnete Verzeichnis existiert – oder dass opendir wirklich false zurückgibt. Wenn du nur wissen möchtest, ob ein Verzeichnis existiert, bietet sich is_dir an.

    Viele Grüße
    Robert

  2. Hallo Sara,

    in welcher Beziehung steht dein Web zum Ordner in $_SERVER['MyAkt_SeitenDir']? Ist das der gleiche Ordner? Ist er ganz woanders?

    Wenn Du damit auf dein eigenes Web verweist, solltest Du statt dessen besser $_SERVER['DOCUMENT_ROOT'] verwenden.

    Wie genau hast Du verifiziert, dass der Ordner existiert? Möglicherweise hat opendir() ja recht, wenn es false zurückgibt!

    Wenn es ein anderer Ordner ist, muss auch sichergestellt sein, dass der User, unter dem Apache bzw. der PHP Prozess läuft, auf dem MyAkt_SeitenDir-Ordner Leserechte hat. Ein Webserver läuft normalerweise unter massiv eingeschränkten Rechten, damit der Schaden begrenzt bleibt, falls die Seite Amok läuft (wegen Bug oder wegen Einbrechern).

    Rolf

    --
    sumpsi - posui - obstruxi
  3. Liebe(r) Sara,

    bist Du es, TS?

    if (@opendir   ($_SERVER['MyAkt_SeitenDir']))  
      {  
       echo PHP_EOL;  
       require_once ($_SERVER['MyAkt_SeitenDir'] . '/meta_ind.php');  
      }  
    

    Na, wenn da mal niemand einen bösen URL crafted, der dazu führt, dass von Dir unbeabsichtigte Dateien in von Dir unbeabsichtigten Verzeichnissen gelesen und ausgegeben werden! War das hier nicht die perfekte Sicherheitslücke...?

    Ein Kontextwechsel erfordert immer eine entsprechende Behandlung!!!

    Obwohl laut Testausgabe $_SERVER['MyAkt_SeitenDir'] vorhanden ist, kommt die nachfolgende Fehlermeldung:

    Warum schreibst Du Sachen in das $_SERVER-Array? Das machen Anfänger, wenn sie keine vernünftige Programmstruktur haben. Auch ich war einmal Anfänger und habe das auch so gemacht, weil das Array überall benutzt werden kann - es ist ja schließlich superglobal. Das ändert aber nichts daran, dass Du das tunlichst bleiben lassen solltest. Stelle Dir nur vor, Du würdest eine fremde Komponente einbinden (z.B. weil Du einen QR-Code oder eine PDF-Datei generieren lassen willst), und die würde sich in $_SERVER umschauen und unerwartete Funde nach Hause telefonieren... Will man nicht!

    Unzulässiger Aufruf: require_once (/home/mydom/htdocs/de/zSeite/meta_ind.php)

    Also ist entweder das Verzeichnis, oder die Datei, oder beides nicht vorhanden - der Pfad also falsch. Hast Du den überprüft? Insbesondere /home/... kommt mir verdächtig vor, weil DocumentRoot üblicherweise in /var/www/... beheimatet ist.

    Liebe Grüße

    Felix Riesterer

    1. Hallo Felix,

      Na, wenn da mal niemand einen bösen URL crafted,

      das höre ich öfter - aber $_SERVER wird doch von URLs nicht beeinflusst, dachte ich. $_GET, $_POST und $_REQUEST schon, aber $_SERVER doch nicht? Oder gibt es PHP Settings, die das übertragen von Requestparametern nach $_SERVER aktivieren?

      Meine schnellen Versuche gerade zeigen jedenfalls keine Übertragung von GET Parametern nach $_SERVER.

      $_SERVER-Variablen kann ich aber über den Webserver setzen (SetEnv) und damit in der .htaccess konfigurieren. Je nach Anwendungsfall kann das zweckmäßiger sein, als eine "web.config" aus dem Dokumentenroot zu lesen und darin Verweise auf irgendwelche serverspezifischen Ordner zu suchen.

      Zugegeben, das sind seltene Anwendungsfälle. Deine Anwendung ist vermutlich so einer: Läuft auf mehreren Servern und greift auf andere Daten auf dem Server zu, deren Position vom Admin konfigurierbar sein muss.

      Rolf

      --
      sumpsi - posui - obstruxi