Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Zur Sicherheit Dateien für include() aus dem Webverzeichnis auslagern

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Zur Sicherheit Dateien für include() aus dem Webverzeichnis auslagern

    Hi allerseits!

    Ich habe bei einem Hoster Webspace gemietet. Das Root-Verzeichnis meines Webspaces beinhaltet folgende drei Ordner:

    errordocs
    htdocs
    user
    Gibt der User nun in seinem Browser www.meine-domain.de ein, landet er im Verzeichnis "htdocs", also eine Ebene über dem Root-Verzeichnis. Ins Root-Verzeichnis kommt er nicht rein. Im Verzeichnis "htdocs" liegt die Datei index.php mit dem Inhalt der Homepage.

    Nun möchte ich gerne bestimmte Inhalte der Datei index.php mit der Funktion include() auslagern. Aus Sicherheitsgründen möchte ich die ausgelagerten Code-Zeilen aber nicht im Domain-Verzeichnis "htdocs" liegen haben, sondern auf einer Ebene, auf die der User keinen Zugriff hat. Ich würde also gerne mein Root-Verzeichnis um den Ordner "ausgelagert" ergänzen:

    ausgelagert
    errordocs
    htdocs
    user
    Bisher verhelfe ich mir damit, dass der include()-Befehl in der index.php so aussieht:

    PHP-Code:
    include('../ausgelagert/code01.php')
    include(
    '../ausgelagert/code02.php')
    include(
    '../ausgelagert/code03.php')
    include(
    '../ausgelagert/code04.php')
    /* und so weiter */ 
    Gibt es die Möglichkeit, den Server so zu konfigurieren, dass bei Verwendung des include()-Befehls automatisch immer in dem Verzeichnis "ausgelagert" gesucht wird, also ich den Befehl so verwenden kann:

    PHP-Code:
    include('code01.php')
    include(
    'code02.php')
    include(
    'code03.php')
    include(
    'code04.php')
    /* und so weiter */ 
    .

    Dies hätte den Vorteil, dass ich mir einiges an Schreibarbeit spare und ein Zugriff aus die ausgelagerten Code-Zeilen aus jedem Unterverzeichnis von "htdocs" unkompliziert möglich ist, ohne mir Gedanken machen zu müssen, wie viel mal ich "../../" davor setzen muss.


  • #2
    Wüsste ich nichts von, aber du kannst ja über z.B. eine config einen Parameter mit dem Pfad zum Zielverzeichnis definieren.
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Stay fit

    Kommentar


    • #3
      Zitat von Der Kaiser Beitrag anzeigen
      Dies hätte den Vorteil, dass ich mir einiges an Schreibarbeit spare und ein Zugriff aus die ausgelagerten Code-Zeilen aus jedem Unterverzeichnis von "htdocs" unkompliziert möglich ist, ohne mir Gedanken machen zu müssen, wie viel mal ich "../../" davor setzen muss.
      find ich nicht den hammer mit ../../../..
      (..)eine config einen Parameter mit dem Pfad zum Zielverzeichnis definieren.
      oder zu einer ROOT_DIR oder sonstwas. jedenfalls so, dass man runtgerlaufen kann:
      PHP-Code:
      include(ROOT_DIR ."/libs/include/class.db.inc.php"); 
      oder so ähnlich.

      Kommentar


      • #4
        http://www.ermshaus.org/2012/09/php-...emals-ohne-dir
        http://php-de.github.io/jumpto/pfade/
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Wenn du den Include-Pfad von PHP zentral konfigurieren kannst (ich meine per php.ini oder möglicherweise auch per „php_value include_path“ in einer .htaccess-Datei oder dergleichen), kannst du dort den absoluten Pfad zum „ausgelagert“-Verzeichnis ganz an den Anfang setzen.

          Sagen wir mal, der lautet „/var/www/example/ausgelagert“.

          Wenn du dann – egal wo – include 'foo/bar.php'; schreibst („virtueller“ Pfad – nicht relativ oder absolut, siehe Definitionen im ersten Link von nikosch), dann sucht PHP zuerst nach einer Datei „/var/www/example/ausgelagert/foo/bar.php“ und inkludiert diese bei Existenz. (Sonst wird weitergesucht.)

          Meines Erachtens gibt es aber üblicherweise geschicktere Lösungen für die gesuchte „Funktionalität“.

          In deinem Fall klingt es so, als hättest du verschiedene PHP-Skripte, die direkt per URL als „Einsprungspunkte“ in die Anwendung aufrufbar sind.

          Das ist naheliegend, aber das ist aus beispielsweise dem Grund mit den Pfaden, der dir begegnet ist, nicht so recht praktikabel. Günstiger ist es, alle derartigen Anfragen (also eingehende Requests/„Skript-Aufrufe“) über die Serverkonfiguration (etwa mod_rewrite beim Apache) an ein zentrales Skript zu schicken. Dort kannst du dann den Inhalt von $_SERVER['REQUEST_URI'] zerlegen, um zu ermitteln, was der Nutzer nachgefragt hat.

          Das hat den Vorteil, dass du nur in diesem Skript den Pfad zu den Quellcode-Dateien einmal angeben musst und dass du auch nur an einer Stelle alles Zeugs einbinden musst, das du immer brauchst. (So machen das zum Beispiel alle Frameworks, die ich kenne.) An den sichtbaren URLs im Browser ändert das übrigens nichts, das ist nur eine serverinterne Mapping-Geschichte. (Siehe http://php-de.github.io/jumpto/pfade/#webpfade.)

          Hatte auch mal versucht, ein Beispiel dafür aufzuschreiben, aber ich weiß nicht, wie verständlich das ist: http://phpforum.de/forum/showpost.ph...91&postcount=9

          Wenn du die Demo dort einfach mal anlegst und drin rumklickst und auf die URLs achtest, solltest du aber im Zweifel rasch merken, wie das läuft. (Falls nicht ohnehin bekannt. )
          PHP-Wissenssammlung Composer Awesome Awesomeness PHP: The Right Way @mermshaus

          Kommentar


          • #6
            Zitat von mermshaus Beitrag anzeigen
            Wenn du den Include-Pfad von PHP zentral konfigurieren kannst ...
            Bingo! Genau das hatte ich gesucht. Habe nun einfach in der php.ini in
            Code:
            include_path = "<hier ist der Pfad eingetragen>"
            den Pfad zu dem Verzeichnis hinterlegt, in dem sämtliche meiner zu inkludierenden Dateien liegen. Danke für den Tipp

            Kommentar


            • #7
              Nachdem alles super mit include_path funktioniert hat, klappt die Auslagerung mittels include_path nun plötzlich nicht mehr. Es gab jedoch in der Zwischenzeit keinerlei Änderungen am System. Lediglich Sytemupdates im Rahmen des letzten Windows7-Patch-Day wurden eingespielt.

              In der Datei php.ini befindet sich weiterhin der Eintrag include_path = ".;c:\Apache\ausgelagert\", in dem auch die einzubindenden PHP-Dateien liegen. Starte ich die Indexdatei index.php in der sich beispielsweise ein include('test.php'); befindet, wurde automatisch die Datei test.php aus dem Verzeichnis C:\Apache\ausgelagert\ inkludiert. Nun klappt das nicht mehr, es kommt folgende Fehlermeldung:

              Warning: include(test.php): failed to open stream: No such file or directory in C:\Apache\htdocs\index.php on line 2

              Warning: include(): Failed opening 'test.php' for inclusion (include_path='.;C:\php\pear') in C:\Apache\htdocs\index.php on line 2
              Habe keine Ahnung, wieso das jetzt nicht mehr klappt. Weiß jemand von euch Rat? Komisch auch die Warnung mit dem Verweis auf C:\php\pear ?!?

              Kommentar


              • #8
                Ergänzung: ich habe jetzt einfach mal alle exkludierten Dateien ins Rootverzeichnis zur index.php gepackt. Nun werden diese auch inkludiert. Allerdings macht sich nun ein weiteres Problem bemerkbar. Es wird die Datei dbverbindung.php inkludiert. Diese sieht so aus:

                PHP-Code:
                <?php
                $db 
                mysqli_connect("localhost""benutzername""passwort""datenbank");
                if(!
                $db)
                {
                  exit(
                "Verbindungsfehler: ".mysqli_connect_error());
                }
                ?>
                Nun bekomme ich folgende Fehlermeldung:
                Fatal error: Call to undefined function mysqli_connect() in C:\Apache\htdocs\dbverbindung.php on line 2
                Es scheint, als kann der Apache nichts mit der Funktion mysqli_connect anfangen. Dies deutet ja darauf hin, dass ein Konfigurationsfehler der php.ini vorliegt. Ich stehe aber echt auf dem Schlauch, woran das liegen könnte.

                Kommentar


                • #9
                  Habe den Fehler vermutlich gefunden: in der Datei php.ini war ein Semikolon vor einem Eintrag verschwunden:
                  ; error_reporting
                  ; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
                  ; Development Value: E_ALL
                  Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
                  Das hat wohl dazu geführt, dass alles was danach kam (include_path und mysqli.dll, etc.) nicht mehr berücksichtigt wurde. Es war die sprichwörtliche Nadel im Heuhaufen.

                  Kommentar

                  Lädt...
                  X