Schon wieder eine Frage zu eval()

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

  • Schon wieder eine Frage zu eval()

    Hallo !

    Ich habe mein Seitenlayout in einer DB abgelegt. Innerhalb des
    Seitenlayouts werden mittels "include" und Funktionen, PHP-Scripts eingefügt. Also so z.B. ....
    PHP-Code:
    <html>
    <head>
    <title>Seitenlayout</title>
    </head>
    <body>
    <?php include "header.php" ?>
    <h3>Mein Seitenlayout</h3>
    <?php gaestebuch_function(); ?>
    </body>
    </html>

    Beim Auslesen des Seitenlayouts aus der DB wird der PHP-Code ja
    nun nicht ausgeführt sondern nur angezeigt. Daher verwende ich
    eval(), und zwar so....

    PHP-Code:
    $sql "SELECT * FROM template 
                             WHERE TemplateId = 1"
    ;
    $result mysql_query($sql);
      
        while (
    $row=mysql_fetch_array($result)) 
          {
            
    ob_start();             
            
    $code=str_replace('<'.'?php','<'.'?',$row['tpl']);
            
    $code='?'.'>'.trim($row['tpl']).'<'.'?';
            eval(
    $code);
            
    $output ob_get_contents();
            
    ob_end_clean();              
          }
          echo 
    $output
    Klappt auch wunderbar!
    Um zu verhindern, das man mir z.B. beim Eintrag in mein Gästebuch
    PHP-Code einschläust, filter ich die Gästebuch-Ausgabe mit

    PHP-Code:
    $row['text'] = nl2br(stripslashes(htmlspecialchars($row['text']))); 
    ..... was auch wunderbar funktioniert.

    Jetzt meine Frage(n).

    Gilt in diesem Falle immer noch, das eval = evil ist, oder kann
    man mir trotzdem noch "bösen Code" einschleusen? Und wenn ja, wie.

    Was müßte ich noch tun, um die Sicherheit meiner Site zu erhöhen?
    (Und bitte, empfehlt mir jetzt keine Template-Engine, die möchte ich nämlich eigentlich nicht haben)

    Und wie stehts mit der Geschwindigkeit, da ja jeder Seitenaufruf über
    eine Datenbankabfrage und eval läuft?

    Tommes !

  • #2
    Ich würde jetzt mal sagen, dass ein simples stripshlashes nichts hilft. Wenn in dem GB Eintrag z.B. steht:
    PHP-Code:
    $datei = .htaccess;
    readfile($datei); 
    dann kann man den Inhalt dieser Datei sehen.
    Du musst viel eher die gesamte Zeile nach php-Schlüsselwörtern durchsuchen, die allenfalls eine Fkt sind. Dann musst du diese rausfiltern.

    Ich denke aber, dass dies ziemlich aufwändig sein dürfte.

    Gruss

    tobi
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

    Kommentar


    • #3
      Hab das grad mal ausprobiert !
      Egal was ich in mein GB einklimper, der PHP-Code wird immer nur als
      Text ausgeben, jedoch nicht verarbeitet. Hab auch mal was anderes
      eingetragen, aber nichts ist passiert.

      Warum? Keine Ahnung!

      Jedenfalls scheind die Filterung mit

      PHP-Code:
      .... nl2br(stripslashes(htmlspecialchars(...... 
      zu funktionieren.


      MFG, Tommes !

      Kommentar


      • #4
        PHP-Code:
        ...nl2br(stripslashes(htmlspecialchars... 
        Diese Codezeile entfernt aber ganz bestimmt nicht einen Brösel php aus dem String. Also vom Sicherheitsapekt her ändert diese Zeile nix an deinem Code.

        Gruss

        tobi
        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

        [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
        Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

        Kommentar


        • #5
          Original geschrieben von jahlives

          Diese Codezeile entfernt aber ganz bestimmt nicht einen Brösel php aus dem String.....
          Das ist wohl richtig, jedoch richtet er scheinbar auch einen Schaden an.
          Ich versteh also nicht ganz, worauf du hinaus willst?

          Ich kann eintippen was ich möchte, denn verarbeitet wird es nicht. Wie
          kann man dann "bösen" Code einschleusen? Versteh ich nicht?

          Vielleicht hast du noch ein anderes Beispiel, wie sowas funktionieren könnte,
          ich sehe bis jetzt aber eigentlich kein Sicherheitsproblem. Lass mich aber
          gerne auch vom Gegenteil überzeugen


          Tommes !

          Kommentar


          • #6
            Lass mich aber gerne auch vom Gegenteil überzeugen
            dann stell doch mal ne spielwiese zur verfügung, ich habe keine lust, dein gb zu zuspammen ...

            btw: dein code im eingangspost sieht stellenweise total sinnfrei aus ...
            PHP-Code:
            $code=str_replace('<'.'?php','<'.'?',$row['tpl']); 
            sinn? besonders, wenn man die nächste zeile betrachtet?

            und wieso gibst du output außerhalb der while aus? immerhin überschreibst dus innerhalb immer wieder ...
            Die Zeit hat ihre Kinder längst gefressen

            Kommentar


            • #7
              PHP-Code:
              $row['text'] = nl2br(stripslashes(htmlspecialchars($row['text'],ENT_NOQUOTES))); 
              Ev änderst du auch die ' und die ". Und das ist Gift für PHP und Strings. Und ausserdem entfernst du mit stripslashes() ev Slashes, die so sein sollten.

              Ich kenne mich jetzt zu wenig gut aus, aber vllt wird das Ergebnis von eval() in den Buffer geschrieben. Und wenn du den Buffer leerst, schickt php alles wie es ist an den Browser, ohne den Inhalt nochmals zu parsen

              Gruss

              tobi
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #8
                Original geschrieben von derHund
                dann stell doch mal ne spielwiese zur verfügung, ich habe keine lust,
                dein gb zu zuspammen ...


                Wenn du damit meinst, das ich mein Script Online stellen soll damit es
                vielleicht doch jemand schafft, bei mir Schaden anzurichten, dann hast du
                dich geschnitten. Außerdem wird unter www.tommes-inside.de
                kein eval() eingesetzt, sonder ich probiere es grade lokal auf meinem
                Rechner. (Trotzdem Danke für den GB Eintrag)

                btw: dein code im eingangspost sieht stellenweise total sinnfrei aus ...
                PHP-Code:
                $code=str_replace('<'.'?php','<'.'?',$row['tpl']); 
                sinn? besonders, wenn man die nächste zeile betrachtet?
                Stimmt, denn eigentlich sollte dort .....
                PHP-Code:
                ob_start();             
                $row['tpl']=str_replace('<'.'?php','<'.'?',$row['tpl']);
                $row['tpl']='?'.'>'.trim($row['tpl']).'<'.'?';
                eval(
                $row['tpl']);
                $output ob_get_contents();
                ob_end_clean(); 
                ..... stehen ! (Hoffe ich jedenfalls
                (Hab diesen Codeschnipsel von hier.... entnommen)

                und wieso gibst du output außerhalb der while aus? immerhin überschreibst dus innerhalb immer wieder ...
                Warum nicht! Schließlich wird eh nur eine Tabellenzelle ausgelesen.
                Und es funktioniert ja auch. Er liest das komplette Template aus und
                zeigt es an.

                Tommes !

                Kommentar


                • #9
                  @tommes1971
                  Nein der mit der GB Eintrag war ich. Sorry aber ich wollte nur sehen, wie der Text verarbeitet wird. Und ob allenfalls der eval() greift.

                  Gruss

                  tobi
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #10
                    Original geschrieben von jahlives
                    @tommes1971
                    Nein der mit der GB Eintrag war ich. Sorry aber...
                    No problem, habs schon wieder gelöscht.

                    Kommentar


                    • #11
                      Wenn du damit meinst, das ich mein Script Online stellen soll damit es vielleicht doch jemand schafft, bei mir Schaden anzurichten, dann hast du dich geschnitten.
                      wow - du willst informationen und hilfe haben, und machst mich dann so dumm an?
                      Warum nicht! Schließlich wird eh nur eine Tabellenzelle ausgelesen.
                      ja, klar, warum nicht. vielleicht solltest du vor der ausgabe noch schnell sämtlich mögliche ips anpingen, und schauen, ob du dort eine antwort erhälst, oder einfach nur alle variablennamen durch 128 zeichen lange buchstabenkombinationen ersetzen ...

                      generell gehts du recht blauäugig an die sache ran ... mir egal.
                      Die Zeit hat ihre Kinder längst gefressen

                      Kommentar


                      • #12
                        Original geschrieben von derHund
                        wow - du willst informationen und hilfe haben, und machst mich dann so dumm an?
                        Morgen erstmal!
                        Ich wollte dich keineswegs dumm anmachen. Sollte das so rüber
                        gekommen sein, dann sorry. Aber sein wir doch mal ehrlich. Würdest du
                        ein "eventuell gefährliches" Script Online stellen, damit andere versuchen
                        können, z.B. deine Datenbank zu löschen oder schlimmeres? Ich glaube
                        kaum!

                        Die Codeschnippsel in meinem Eingangspost habe ich aus anderen Foren.
                        Und da ich kein PHP Gott bin, weiß ich auch nicht ob es der Weisheit letzter
                        Schluß ist. Mag sein das da noch Fehler drinn sind, aber wäre es dann nicht
                        bresser mir einen anderen Lösungsvorschlag zu geben. Denn so wie im
                        Eingangspost, läuft das Script ja bei mir. Es wird kein Fehler ausgespuckt.
                        Kann natürlich sein, das das ganze Script Mist ist, aber dann klärt mich
                        doch auf. Ich mach das ja auch nur aus Spaß an der freud und nicht um
                        hier jemanden blöd anzumachen.

                        Zum Thema eval = evil !
                        Dazu hast du noch garnichts gesagt. Ich wollte doch nur wissen, wie ich
                        bezüglich eval "bösen" Code einschläusen kann. Und da bis jetzt alle
                        Versuche Fehlgeschlagen sind, frage ich mich ob es wirklich so böse ist.
                        Daher bitte ich euch ja auch, mir zu sagen wie das gehen soll, damit ich,
                        wenn es denn geht, Maßnahmen ergreifen kann, oder besser noch, ihr mir
                        Tipps geben könnt wie man dem entgegenwirkt. Dafür ist doch ein Forum gedacht, oder?

                        OK, ich hoffe, ich hab dir jetzt nich wieder auf die Füße getreten, aber wie
                        gesagt, anstatt mir zu sagen das es Mist ist, gebt mir doch lieber einen
                        Lösungsvorschlag. Und wenn das zu viel verlangt ist, dann ist das hier
                        wohl nicht der Richtige Ort um nach Lösungen zu suchen.

                        Tommes!

                        Kommentar


                        • #13
                          Salut Tommes

                          der Hund hatte schon ein bisschen recht
                          generell gehts du recht blauäugig an die sache ran
                          Zum Themas Sicherheit gibt's eigentlich nicht viel mehr zu sagen. Du jagst Usereingaben ziemlich ungeprüft auf PHP los. Du hast den Spruch 'Never trust incoming data' sicher auch schon mal gehört. Der existiert nicht umsonst
                          Und deine 'Entschärfungen' à la
                          PHP-Code:
                          nl2br(stripslashes(htmlspecialchars... 
                          würden so etwas erst richtig möglich machen.
                          Wenn du ein Form abschickst und auf der Empfangsseite einfach mal ein
                          PHP-Code:
                          echo $_POST['name_im_form']; 
                          machst, dann wirst du sehen, dass Zeichen wie ' und " escapet werden. Diese werden dann von MySql als nicht mehr gefährlich angesehen und in die DB geschrieben. Dann machst du ein stripslashes() und entfernst die Slashes wieder. Dann jagst du das auf eval() los. Mann wenn das nicht gefählich ist...
                          Wenn du mal lokal auf deinem Server testen willst dann strick dir doch ein Form à la
                          PHP-Code:
                          if(!isset($_POST['senden'])){
                              echo 
                          '<html>';
                              echo 
                          '<head><title>test</title></head>';
                              echo 
                          '<body>';
                              echo 
                          '<form action="'.$_SERVER['PHP_SELF'].'" method="post">';
                              echo 
                          '<input type="text" name="cont" />';
                              echo 
                          '<input type="submit" name="senden" value="Ab damit!" />';
                              echo 
                          '</form></body></html>';
                          }
                          else{
                              
                          $cont htmlspecialchars(stripslashes(trim($_POST['cont'])));
                              eval(
                          $cont);

                          und probier aus. Sichere aber davor deine htdocs oder wwwpubs

                          Zum Schluss eval === almost always evil

                          Gruss

                          tobi
                          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                          Kommentar


                          • #14
                            Hey Tobi!

                            Danke für deinen Post! Damit kann ich was anfangen.
                            Denn auch wenn es nicht so aussieht, versuche ich schon ein gewisses Maß an Sicherheit zu erreichen (deshalb ja auch dieser Thread). Daher hab ich das Script auch nicht Online gestellt. Jedoch sind mir halt manche Zusammenhänge noch nicht ganz klar gewesen, (Anwender mit gefährlichem Halbwissen eben) auf die du mich ja jetzt aufmerksam gemacht hast.

                            Werde das heut Abend mal testen und schaun, was so passiert.


                            So long, Tommes !

                            Kommentar

                            Lädt...
                            X