LSpreee: [SICHERHEIT] php-Code von User verhindern

Hallo liebe Gemeinde (die mir schon so oft geholfen hat),

auf dem Weg zu einer sicheren Seite habe ich heute die Frage, wie man verhindern kann, dass User durch Formulare php-Code auf den Server kriegen, der dort ausgeführt werden kann.

Sagen wir mal die Datenbank (kein MySQL) liegt im public-Verzeichnis. Geht das überhaupt, oder brauche ich mir da keine Sorgen zu machen.

Falls die Frage blöd ist, bin ich sicher, dass ihr mir das auch sagen werdet ;)

Vielen Dank schonmal.

LSpreee

  1. Hello,

    PHP macht Dir da Kummer, wenn es

    • per HTTP direkterrecihbar ist (z.B. Bilder, die keine sind)
    • wenn das Hochgeladene per include() eingebunden wird
    • wenn das Hochgeladene per eval() eingebunden wird

    Die Exec-Funktionen sind ebenflls gefährlich, wenn man Usercode anfasst...

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Vielen Dank für die Antwort!

      • per HTTP direkterrecihbar ist (z.B. Bilder, die keine sind)

      Meinst Du einen Dateiupload via Formular mit diesem  enctype="multipart/form-data"?

      Reicht es für diesen Fall aus, die Dateiendung zu kontrollieren?

      • wenn das Hochgeladene per include() eingebunden wird

      Sagen wir ich include eine meiner php-Dateien, welche die Daten aus der Datenbank per open_file(); (eigene Funktion) ausliest. Problematisch?

      Viele Grüße in den Oberharz.

      LSpreee

      1. Reicht es für diesen Fall aus, die Dateiendung zu kontrollieren?

        Nein - die Dateiendung hat in diesem Fall wenig Aussagekraft.

        Es lohnt immer, mit diversen Techniken nochmal zu verifizieren, was man hat. Will man z.B. nur Bilder bestimmter Typen, sollte man das auch nochmal zusätzlich prüfen

        welche die Daten aus der Datenbank per open_file(); (eigene Funktion) ausliest. Problematisch?

        Solange die aus der Datenbank kommenden Strings nicht durch eval() gejagt werden ansich nicht.

      2. Hello,

        • per HTTP direkterrecihbar ist (z.B. Bilder, die keine sind)
          Meinst Du einen Dateiupload via Formular mit diesem  enctype="multipart/form-data"?

        Reicht es für diesen Fall aus, die Dateiendung zu kontrollieren?

        Jein.
        Das Problem ist dabei, dass Du nie ganz sicher sein kannst, welche Files beim Aufruf per HTTP vom PHP-Parser geparst werden, wenn Du den Server nicht selber betreust.
        Diese Einstellungen liegen bei  einem Hoster i.d.R. außerhalb deines Einflussbereiches.

        Es ist also besser, das Parsen für das Ablageverzeichnis der Bilder AUSZUSCHALTEN

        engine off

        Dafür zu sorgen, dass die hochgeladenen Files tatsächlich Bilder sind

        getimagesize()

        und auf jeden Fall zu verhindern, dass eine .htaccess-Datei hochgeladen werden kann!
        Es ist also auch nicht verkehrt, im Upload-Verzeichnis eine leere .htaccess-Datei zu plazieren, die für den Webserver und normale User schreibgeschützt ist.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      3. Mahlzeit LSpreee,

        • per HTTP direkterrecihbar ist (z.B. Bilder, die keine sind)
          Meinst Du einen Dateiupload via Formular mit diesem  enctype="multipart/form-data"?

        Reicht es für diesen Fall aus, die Dateiendung zu kontrollieren?

        Für welchen Fall? Lass Dir bitte nicht alle Würmer einzeln aus der Nase ziehen, sondern beschreibe doch mal konkret, was Du hast und wovor Du Angst hast ...

        Generell kann man allerdings sagen, dass es *IN KEINEM FALL* reicht, die Dateiendung zu kontrollieren - Namen sind Schall und Rauch.

        • wenn das Hochgeladene per include() eingebunden wird
          Sagen wir ich include eine meiner php-Dateien, welche die Daten aus der Datenbank per open_file(); (eigene Funktion) ausliest. Problematisch?

        Woher sollen das Deine Leser wissen, wenn keiner von denen weiß, was die Funktion open_file() tut?

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Mahlzeit LSpreee,

    auf dem Weg zu einer sicheren Seite habe ich heute die Frage, wie man verhindern kann, dass User durch Formulare php-Code auf den Server kriegen, der dort ausgeführt werden kann.

    Ganz einfach: führe einfach nichts aus (weder durch eval(), noch durch include() o.ä.), das vom Benutzer eingegeben bzw. hochgeladen werden kann. Punkt. Fertig.

    Sagen wir mal die Datenbank (kein MySQL) liegt im public-Verzeichnis.

    Von was für einer Datenbank sprichst bzw. schreibst Du?

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Ganz einfach: führe einfach nichts aus (weder durch eval(), noch durch include() o.ä.), das vom Benutzer eingegeben bzw. hochgeladen werden kann. Punkt. Fertig.

      Siehe anderen Post von mir (Nachfrage dazu).

      Von was für einer Datenbank sprichst bzw. schreibst Du?

      Datenbanken in Form von txt-Files.

      Vielen Dank an Dich

      1. Mahlzeit LSpreee,

        Von was für einer Datenbank sprichst bzw. schreibst Du?
        Datenbanken in Form von txt-Files.

        Das sind keine Datenbanken.

        Wo befinden sich diese .txt-Dateien? Innerhalb eines Verzeichnisses, das beliebig beschreibbar ist (durch irgendwelche Upload-Funktionen, ftp oder ähnliches)? Sind die Dateien nicht gegen Überschreiben geschützt? Beides solltest Du ändern.

        Wenn Du diese .txt-Dateien einfach nur öffnest, um z.B. deren Inhalt auszulesen, dann sollte es keine Problem geben (wenn Du nicht so leichtsinnig bist, den Inhalt in irgendeiner Form mit eval() auszuführen). Wenn Du die Dateien hingegen mittels include() oder ähnlicher Methoden einbindest, wird evtl. enthaltener PHP-Code ausgeführt. Zusammen mit ggf. vorhandenen Sicherheitslücken (s.o.) ergäbe sich ein ziemliches Problem ...

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Hello,

          Von was für einer Datenbank sprichst bzw. schreibst Du?
          Datenbanken in Form von txt-Files.

          Das sind keine Datenbanken.

          Wie kommst Du denn darauf? Selbstverständlich kann eine strukturierte Text-File-Sammlung eine Datenbank darstellen.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Von was für einer Datenbank sprichst bzw. schreibst Du?
            Datenbanken in Form von txt-Files.
            Das sind keine Datenbanken.
            Wie kommst Du denn darauf? Selbstverständlich kann eine strukturierte Text-File-Sammlung eine Datenbank darstellen.

            Na die Textfilesammlung allein nicht. Aber mit den implementierten Zugriffs und Schreibmethoden zusammen schon.

            mfg Beat

            --
            ><o(((°>           ><o(((°>
               <°)))o><                     ><o(((°>o
            Der Valigator leibt diese Fische
            1. Hello,

              Von was für einer Datenbank sprichst bzw. schreibst Du?
              Datenbanken in Form von txt-Files.
              Das sind keine Datenbanken.
              Wie kommst Du denn darauf? Selbstverständlich kann eine strukturierte Text-File-Sammlung eine Datenbank darstellen.

              Na die Textfilesammlung allein nicht. Aber mit den implementierten Zugriffs und Schreibmethoden zusammen schon.

              Dann ist es ein Datenbank-Managementsystem.
              Die Datenbank selber besteht nur aus den Daten, die i.d.R. zueinander in Beziehung stehen.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de