PHP - Programmieren mit Sicherheit

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

  • PHP - Programmieren mit Sicherheit

    Hallo Community,

    ich bin in PHP noch relativ frisch und wollte nun mal ein kleines Tool schreiben mit PHP und MySQL.
    Dazu hab ich ein paar Fragen, die wahrscheinlich trivial, für mich aber noch nicht beantwortet sind.

    1. Wenn ich meine SQL Verbindungsdaten in einer Datei db.php ablege und diese in ein Unterverzeichnis /inc packe, kann ich sicher sein, dass die Datei nicht von einem anderen Server eingebunden und ausgelesen werden kann? Oder muss dazu etwas bestimmtes beachtet werden?

    2. Wenn ich nur einige Configurationsscripte und ein paar PHP Klassen auf dem Server liegen habe, die im großen und ganzen nur aus einer Datenbank lesen und in eine Datenbank schreiben sollen, wie sollte ich die CHMOD Rechte vergeben um alles sicher zuhalten? Ist 644 geeignet oder muss ich andere Rechte vergeben?

    Für den Anfang ist das mal alles, wessen ich mir nicht sicher bin.
    Freu mich über euere Antworten!!!

    Greetz, trockeneis

  • #2
    Re: PHP - Programmieren mit Sicherheit

    Original geschrieben von trockeneis
    1. Wenn ich meine SQL Verbindungsdaten in einer Datei db.php ablege und diese in ein Unterverzeichnis /inc packe, kann ich sicher sein, dass die Datei nicht von einem anderen Server eingebunden und ausgelesen werden kann? Oder muss dazu etwas bestimmtes beachtet werden?
    zu punkt 1 kann ich ein bisschen schreiben:

    die db.php kann natürlich direkt per http oder include aufgerufen werden, allerdings erhält der aufrufer nur die php-interpretierte ausgabe des scriptes (also nichts) und nicht den quelltext, also die zugangsdaten.

    normalerweise passiert also nichts. jetzt mal angenommen, dein provider "bastelt" an der webserverkonfiguration und "zerschießt" dabei etwas, so dass php-dateien nicht mehr durch den php-parser gejagdt werden, dann bekommt man das php-file zum download angeboten.
    zugegeben, das bsp. ist etwas an den haaren herbeigezogen - aber nicht unmöglich.

    daher würde ich den direkten http-zugriff auf alle includefiles grundsätzlich verbieten. z.b. deinen inc-ordner per .htaccess (apache) schützen oder diesen ordner außerhalb des documentroot legen (beste variante, wenn dein provider dies zulässt).

    Kommentar


    • #3
      dann sag ich was zu 2)

      die klassen brauchen idr. nur gelesen werden.
      bei den configscripten musst du abwägen, ob schreibrechte benötigt werden. generell vergibst du so wenig rechte wie nötig.

      Kommentar


      • #4
        Hi,

        erstmal danke für die Antworten.

        zu 3DMax: Wie kann ich den direkten HTTP zugriff auf die Includes verbieten?

        zu TobiaZ: Ist also 644 geeignet, oder gibt es noch engere Rechteeinstellungen, die trotzdem tadellos funktionieren?

        Greetz, trockeneis.

        Kommentar


        • #5
          Original geschrieben von trockeneis
          zu 3DMax: Wie kann ich den direkten HTTP zugriff auf die Includes verbieten?
          Zum Beispiel mit einer Directory-Direktive in der .htaccess.
          Diese hier verbietet den Zugriff auf alles im Verzeichnis foo und erlaubt auch nicht, dass es von tiefer liegenden .htaccess-Dateien aufgehoben wird:
          Code:
          <Directory /dein/doc_root/foo>
              AllowOverride None
              Order allow, deny
              Deny from all
          </Directory>
          PHP kann natürlich weiterhin auf die Dateien in diesem Verzeichnis zugreifen, wenn es dies übers Dateisystem und nicht etwa url_fopen_wrappers macht. Dennoch solltest du lieber das Verzeichnis foo außerhalb deines DocRoots verlegen. Dann brauchst du dir über die Konfiguration deines Webservers keine Gedanken machen. Das vermeidet Fehler.
          zu TobiaZ: Ist also 644 geeignet, oder gibt es noch engere Rechteeinstellungen, die trotzdem tadellos funktionieren?
          Das kann man so pauschal nicht sagen. Im Detail kommt es darauf an, als welcher User der Webserver läuft und in welcher Beziehung er zu dir als FTP-User steht (gleiche Gruppe?). Bei Standard-Installationen ist 644 so wenig wie möglich, aber so viel wie nötig. Ich empfehle, es einfach mal auszuprobieren. Ein Script mit <?php echo 'hello'; ?> hochladen und solange Rechte beschneiden, bis es der Webserver nicht mehr lesen/ausführen kann.

          Kommentar


          • #6
            Hi,

            also das mit dem 'Document_Root' ist mir noch nicht 100% klar.
            Nehmen wir mal an, ich miete Webspace bei Provider XYZ.
            Dann kann ich per FTP auf den Webspace zugreifen und ein Verzeichnis anlegen, dass das Root Verzeichnis für meine PHP Seite darstellt.
            Und nun soll ich parallel dazu ein Verzeichnis anlegen, in dem meine Konfigurationsskripte liegen?
            Ist dieses Verzeichnis dann schwerer zu erreichen, als ein unterverzeichnis in meinem Root?


            Oder liege ich mehrere Kilometer daneben mit meiner Annahme?

            Sorry...bin eben noch ein Boon in dem Bereich.

            Greetz, trockeneis
            Zuletzt geändert von trockeneis; 17.07.2006, 21:35.

            Kommentar


            • #7
              Als DocRoot bezeichnet man das Verzeichnis, das dem Webserver als Wurzelverzeichnis bekannt gemacht wird. Beim Apache geschieht das mit der Anweisung DocumentRoot, siehe http://httpd.apache.org/docs/2.0/mod...l#documentroot
              Der Webserver bildet dann jede Anfrage auf dieses Verzeichnis ab. Ein GET /dir/file.ext wird also in DocRoot/dir/file.ext übersetzt und falls der Pfad existiert, wird die Resource ausgeliefert.
              Somit ist prinzipiell alles in- und unterhalb des DocRoot über HTTP erreichbar, alles über- oder außerhalb nicht.

              Man kann natürlich mit einer entsprechenden Webserver-Konfig Ausnahmen machen, aber dazu muß man schon genau wissen, was man machen muß. Es passiert also nicht ungewollt.

              Wenn du zu deinem Provider per FTP verbindest, landest du in irgendeinem (deinem Kunden-) Verzeichnis. Das könnte der DocRoot deiner Domain sein, muß aber nicht. Findest du ganz leicht heraus, indem du in diesem Verzeichnis eine index.html speicherst und versuchst, sie übers Web zu erreichen. Klappts, ist es der DocRoot und du hast gar nicht die Möglichkeit, ein Verzeichnis außerhalb dessen für deine PHP-Scripte zu benutzen. In diesem Fall mußt du eins innerhalb anlegen und es wie oben beschrieben sichern.
              Erreichst du die index.html nicht, gibt es wahrscheinlich schon ein Unterverzeichnis html oder www. Schieb die index.html dort rein. Erreichst du sie nun, kennst du deinen DocRoot und weißt vor allem, das alles darüber und daneben sicher ist vor Zugriffen aus dem Netz.

              Kommentar


              • #8
                onemorenerd, das hast du sehr gut erklärt.
                ich wollte auch schon antworten, habe aber es dann aber gelassen, weil ich nicht wusste, wie ich es erklären soll.

                kleine anmerkung zum testen (für trockeneis):
                PHP-Code:
                // damit kannst du dir den kompletten pfad des docroot anzeigen lassen
                echo 'DOCROOT: '$_SERVER['DOCUMENT_ROOT'], '</br>';

                // und damit den aktuellen pfad des scriptes (z.b. include(../file.php))
                echo 'SCRIPTPATH: 'dirname(__FILE__), '</br>'

                Kommentar


                • #9
                  @onemorenerd

                  Thanks für die wirklich ausführliche und gut verständliche Erläuterung.

                  Jetzt aber zurück zu dem Grund (dem Post) weswegen ich nach dem DocRoot fragte.
                  Wir nehmen an, dass ich bei meinem Provider direkt auf mein DocRoot verbinde, wenn ich über FTP connecte.
                  Dann besteht für mich ja keine Möglichkeit irgendwelche Konfigscripte zur Sicherheit ausserhalb meines DocRoots zu legen.
                  Oder ist dies überhaupt nicht notwendig, ohne dabei die Sicherheit zu vernachlässigen?

                  Kommentar


                  • #10
                    Richtig, wenn dein Provider dich in deinem DocRoot einsperrt (man das chroot-en, kommt von "change root"), kannst du nichts außerhalb ablegen.
                    Aber Sicherheit kannst du trotzdem haben. Einfach ein Verzeichnis anlegen und mit Deny all dem Webserver sagen, dass er jeglichen Zugriff darauf verweigert.

                    Kommentar

                    Lädt...
                    X