Ankündigung

Einklappen
Keine Ankündigung bisher.

Sicherer Include

Einklappen

Neue Werbung 2019

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

  • Sicherer Include

    Hallo zusammen

    Bin mich momentan intensiv mit PHP Sicherheit am beschäftigen.

    Ich arbeite bei meinen Webprojekten immer mit Includes von Seiten.

    Ich hab da mal was zusammenprogrammiert.

    Könnt ihr mir sagen, ob man dabei ausgehen kann, dass das sicher ist?

    klar, 100% sicherheit gibts nie, aber ist das ein guter ansatz?

    PHP-Code:

    $__host 
    "http://".$_SERVER['HTTP_HOST'];

    (!isset(
    $_GET['cube'])) ? $__include "home" $__include htmlentities($_GET['cube'],ENT_QUOTES);
                                                    
        if(
    preg_match("/([\.\/\:]|(index|content))/i",$__include)) {
            echo 
    "<h1>X: not allowed!</h1>";
        } else {
            if(@
    is_file($_SERVER['DOCUMENT_ROOT']."/".$__include.".php")) {
                @include(
    $_SERVER['DOCUMENT_ROOT']."/".$__include.".php");
            } else {
                echo 
    "<b>ERROR 404:</b> Die Seite \"".$__include."\" kann nicht gefunden werden!";
                echo 
    '<meta http-equiv="refresh" content="5; url='.$__host.'/">';
            }
        } 
    [MOD: Code Tags]
    mfG
    Andee

  • #2
    Code:
    $__host = "http://".$_SERVER['HTTP_HOST'];
    Ich denke, die Adresse zum Projekt kannst du besser (?) als Konstante in deinen Scripten zur Verfügung stellen.

    Arbeite mit einer Whitelist, in der du die Namen der Dateien einträgst, die eingebunden werden dürfen. Dann kannst du sichergehen, dass keine Dateien unberechtigterweise geladen werden.
    Code:
    echo "<b>ERROR 404:</b> Die Seite \"".$__include."\" kann nicht gefunden werden!";
    Allein der Text macht aus einer Seite noch keine 404-Fehlerseite. Da musst du schon einen entsprechenden Header mitsenden. Keine Ahnung, ob du das bereits irgendwo oberhalb des gezeigten Schnipsel tust.

    Meta - Angaben gehören jedenfalls in den Kopfbereich der HTML-Seite.
    [URL]http://hallophp.de[/URL]

    Kommentar


    • #3
      PHP-Code:
      $__include htmlentities($_GET['cube'
      Was hat htmlentities mit Pfadangaben zu tun?
      PHP-Code:
      (!isset($_GET['cube'])) ? $__include "home" $__include htmlentities($_GET['cube'],ENT_QUOTES); 
      Pfui-Statement. Trinäroperator vergewaltigt.
      PHP-Code:
      if(preg_match("/([\.\/\:]|(index|content))/i",$__include)) { 
      Was auch immer das bezwecken soll.
      PHP-Code:
                  echo "<b>ERROR 404:</b> Die Seite \"".$__include."\" kann nicht gefunden werden!";
                  echo 
      '<meta http-equiv="refresh" content="5; url='.$__host.'/">'
      Man kann ein Meta-Refresh nicht einfach irgendwo einbauen, wo es einem passt. Das ist eine Header-Angabe.
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #4
        htmlentities hab ich eingebaut, da die site ja via url übergeben wird. z.B. cube=ueber_uns.
        das man dort nicht irgendwelchen quatsch eingeben kann wie:
        PHP-Code:
        ?cube=<script>alert('hallo');</script> 
        das folgende soll bezwecken, dass man nicht irgendetwas übergeben kann wie: ?cube=../datei oder da ja alles via index file eingelesen/verarbeitet wird, man nicht die index in der index datei einlesen kann.:
        PHP-Code:
        if(preg_match("/([\.\/\:]|(index|content))/i",$__include)) { 
        und inwiefern vergewaltigt?
        PHP-Code:
        (!isset($_GET['cube'])) ? $__include "home" $__include htmlentities($_GET['cube'],ENT_QUOTES); 
        mfG
        Andee

        Kommentar


        • #5
          und inwiefern ist denn das vergewaltigt?:
          Habe ich nicht gesagt.
          Trinäroperator
          htmlentities hab ich eingebaut, da die site ja via url übergeben wird. z.B. cube=ueber_uns.
          das man dort nicht irgendwelchen quatsch eingeben kann wie:
          Der Zweck ist mir klar. Nur ist hrmlentities dafür nicht zuständig.
          [COLOR="#F5F5FF"]--[/COLOR]
          [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
          [COLOR="#F5F5FF"]
          --[/COLOR]

          Kommentar


          • #6
            PHP-Code:
            $__include = (!isset($_GET['cube'])) ?  "home" htmlentities($_GET['cube'],ENT_QUOTES); 
            Vllt hättest dus so machen sollen, aber ehrlich gesagt weiß ich es auch nicht (was mich nicht daran hindert zu spekulieren...)
            Signatur:
            PHP-Code:
            $s '0048656c6c6f20576f726c64';
            while(
            $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

            Kommentar


            • #7
              Zitat von nikosch Beitrag anzeigen
              Der Zweck ist mir klar. Nur ist hrmlentities dafür nicht zuständig.
              und was wäre dafür eher zuständig?
              mfG
              Andee

              Kommentar


              • #8
                PHP-Code:
                if(@is_file($_SERVER['DOCUMENT_ROOT']."/".$__include.".php")) { 
                Muss man das überhaupt escapen, weil spätestens hier findet der die Datei dann nichtmehr und kommt er garnicht zum include.
                Was jetzt Nullbytes und so angeht kann ich dir leider net weiterhelfen, da musst die Profis fragen, ob man die mit nem Reg. Ausdruck rauswerfen muss...
                Signatur:
                PHP-Code:
                $s '0048656c6c6f20576f726c64';
                while(
                $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

                Kommentar


                • #9
                  Wenn ich mich nicht irre sind Deine Bemühungen so wie Du sie im Nachhinein beschreibst,
                  kurz und knapp zu lösen:
                  PHP-Code:
                  if(isset($_GET['cube'])) {
                      if(
                  file_exists($_SERVER['DOCUMENT_ROOT'] . basename($_GET['cube']) . '.php')) {
                          
                  // Alles ok!
                      
                  } else {
                          
                  // Fehler: Datei existiert nicht
                      
                  }
                  } else {
                      
                  // cube wurde nicht übergeben

                  Nun kannst Du wegen der index z.B. nochmal gegen eine Whitelist prüfen, wenn Du magst.

                  Das ganze ist sicher noch komprimierbar bzw. anpassbar, aber es soll in erster Linie hier einigermaßen übersichtlich dargestellt werden.
                  Competence-Center -> Enjoy the Informatrix
                  PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                  Kommentar


                  • #10
                    sorry, jetzt muss ich aber gleich nochmals nachfragen, wenn ich die htmlentities nicht einsetze, ist es ja möglich javascript code in der url zu übergeben... also muss ich doch wohl diese funktion benutzen...
                    mfG
                    Andee

                    Kommentar


                    • #11
                      Solange Du es nicht ausgibst kann Dir JS-Code auch nichts tun

                      http://www.php.de/php-einsteiger/489...rundlagen.html
                      [COLOR="#F5F5FF"]--[/COLOR]
                      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                      [COLOR="#F5F5FF"]
                      --[/COLOR]

                      Kommentar


                      • #12
                        wie nikosch bereits angemerkt hat, kann es Dir eigentlich egal sein, was der User da übergibt.
                        Denn Du prüfst ja, ob es eine Datei mit dem Namen gibt und da wird aller Vorraussicht nach IMMER false rauskommen,
                        sollte jemand Tags oder JavaScript verwenden.

                        Wenn Du die Werte ausgeben willst, mußt Du die natürlich prüfen.
                        Dann macht htmlentities bzw. htmlspecialchars Sinn.
                        Bei Deiner Variante ist das allerdings, wie gesagt unnötig.

                        Schau mal in den Thread, den nikosch gepostet hat.
                        Da findest Du eine Menge Links zu vielen Themen.
                        Competence-Center -> Enjoy the Informatrix
                        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                        Kommentar


                        • #13
                          PHP-Code:
                          if ( isset($_GET['seite']) ) {
                            
                          $seite $_GET['seite'];
                          } else {
                            
                          $seite '';
                          }

                          switch (
                          $seite) {
                            case 
                          'impressum':
                              include 
                          'impressum.php';
                              break;
                          case 
                          'anmelden':
                              include 
                          'anmelden.php';
                              break;
                          case 
                          'start':
                          default:
                              include 
                          'start.php';

                          [PHP]if ($var != 0) {
                          $var = 0;
                          }[/PHP]

                          Kommentar


                          • #14
                            Korrigiert mich, wenn ich irre, aber ich finde die switch-Variante hier unpraktisch...
                            Kommt ne Datei dazu, muß ich ne weitere Case einbauen.

                            Zumal das bei vielen Dateien schon recht ballig wird, vom Quellcode...
                            Competence-Center -> Enjoy the Informatrix
                            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                            Kommentar


                            • #15
                              Wenn du einen Ordner hast wo der User alle Dateien includen darf dann kannst du natürlich das ganze ohne switch machen, wenn er aber nur bestimmte includen darf, dann musst du in irgendeiner Form eine Whiteliste machen (oder Blacklist (?)).

                              Der User darf halt keine Eingaben machen können wo er aus dem Verzeichnis "ausbrechen" kann und dann Configurationsdateien oder ähnliches einbinden kann.
                              Signatur:
                              PHP-Code:
                              $s '0048656c6c6f20576f726c64';
                              while(
                              $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

                              Kommentar

                              Lädt...
                              X