Mathe Formel ausrechnen lassen

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

  • Mathe Formel ausrechnen lassen

    Hallo, bin seit langer zeit mal wieder dabei ein wenig in php für mein forum zu programmieren.
    Hier hab ich nun ein Problem: Im Adminmenü stell ich eine Formel ein - ganz simpel, wie z.b:

    5*x

    Im Forum les ich diese Formel dann aus der Datenbank aus, und ersetzte das x, mit einer bestimmten zahl, beispiel 6.
    Doch anstatt 30 auszugeben, gibt er 5*6 aus - wird wohl als string gerwertet. Wie bekomm ich das hin, das dies ausgerechnet wird?

    Hoffe mir kann hier mal wieder geholfen werden

  • #2
    2 Wege führen zum Ziel:

    - einfacher Weg ist eval() aber auch gefährlicher
    - jedes Operationszeichen inkl. Klammerungen heraus finden und entsprechend z.B. in switch ... case ... (eventuell mit Rekursivfunktion wegen Klammerung) die Operation mit den dazugehörigen Operanden ausführen. Dieser Weg ist aufwändig aber dafür absolut sicher.

    Kommentar


    • #3
      Entweder bastelst du dir einen Formelparser und Auswerter. Oder schaufelst das durch eval().

      Tipp:
      NIEMALS UserDaten durch eval() schicken.
      Wir werden alle sterben

      Kommentar


      • #4
        1. Was ist an eval so gefährlich?
        2. Hab das noch nie benutzt, kapiers nicht wirklich *peinlich*
        Hab mir für die ersten tests einfach ne kleine php datei gemacht:

        <?php
        $dieformel = "x*1"; //Diese Formel wird aus der Datenbank geholt
        $userpunkteinsgesamt="5"; // Wieviele Punkte der User hat
        $anzahlzeichen = str_replace("x", $userpunkteinsgesamt, $dieformel); //Hier soll das X der Formel mit der Anzahl der Punkte ersetzt werden.

        eval ("\$ergebnis = \$anzahlzeichen");
        echo $ergebnis;

        ?>
        So gibt es das gleiche aus wie sonst, 5*1. Gebe ich nun den str_replace teil im eval ein, kommt 0 heraus. Mach ich da irgentwas falsch, oder hab ich einfach das grundprizip der funktion noch net verstanden :P? (wobei ich eher auf das letztere tippe :P)

        Kommentar


        • #5
          PHP-Code:
          <?php
          $dieformel 
          "x*1"//Diese Formel wird aus der Datenbank geholt
          $userpunkteinsgesamt="5"// Wieviele Punkte der User hat
           //Hier soll das X der Formel mit der Anzahl der Punkte ersetzt werden.
          $anzahlzeichen str_replace("x",$userpunkteinsgesamt$dieformel);

          // so
          eval ("\$ergebnis = $anzahlzeichen;");

          // oder so
          $ergebnis = eval ("return $anzahlzeichen;");

          echo 
          $ergebnis;

          ?>
          *ungetestet*
          Zuletzt geändert von combie; 01.10.2008, 11:38.
          Wir werden alle sterben

          Kommentar


          • #6
            Fragen über Fragen ...

            Kommentar


            • #7
              Original geschrieben von asp2php
              Fragen über Fragen ...
              ... und ich weiß noch immer nicht was daran so gefährlich ist^^.
              Und das hab ich mir schon angeguckt, aber net so ganz durchgecheckt xD

              @ combie: Danke klappt :P

              Kommentar


              • #8
                ... und ich weiß noch immer nicht was daran so gefährlich ist^^
                Was ist wenn der User dort Code einschleusen kann...???

                z.B. "Lösch mich alle Dateien von LW c:"
                Wir werden alle sterben

                Kommentar


                • #9
                  Original geschrieben von mainclain
                  ... und ich weiß noch immer nicht was daran so gefährlich ist^^.
                  z.B.

                  unter linux: eval("exec('rm -r ./');");
                  unter windows: eval("exec('del *.* /y');");

                  [color=red]Achtung: nicht ausführen lassen! [/color]

                  Kommentar


                  • #10
                    Wie weit kann man damit denn gehn? xD denke nur das verzeichnis, auf das man auch rechte hat oder?
                    Zuletzt geändert von mainclain; 01.10.2008, 11:58.

                    Kommentar


                    • #11
                      Original geschrieben von asp2php
                      unter linux: eval("exec('rm -r ./');");
                      Wobei das aller Wahrscheinlichkeit nach gar keine Auswirkungen hätte.

                      Viel interessanter ist das Ausspähen von Datenbanken, das installieren eines Proxys, etc.

                      @mainclain: Dann hast du ein scheiß Templatesystem!
                      [FONT="Helvetica"]twitter.com/unset[/FONT]

                      Shitstorm Podcast – Wöchentliches Auskotzen

                      Kommentar


                      • #12
                        inwiefern können user denn darauf zugreifen? Ist immerhin auch im ganzen templatesystem eingebaut...? (ist wbblite, da ist das überall mit:
                        eval ("\$navbar .= \"".$tpl->get("navbar_board")."\";");
                        Um auf template datein zuzugreifen)

                        Kommentar


                        • #13
                          da ist das überall mit:
                          Ja, du bist nicht der Erste, welcher auf so schusselige Ideen kommt

                          Es ist übrigens völlig wurscht, ob include oder eval. Es kommt einzig darauf an, dass kein UserCode zur Ausführung kommt.
                          Zuletzt geändert von combie; 01.10.2008, 12:17.
                          Wir werden alle sterben

                          Kommentar


                          • #14
                            Ich bin auch seit jahren anfänger und das sind profis :P Dacht ich zumindest :P Naja da es bisher keine probleme gab, denk ich wirds schon nix ausmachen. Vielen Dank für eure Antworten, werd mich lieber nochmal über neuere Forensysteme schlau machen, zunot kauf ich mir mal eins (wollt ich eh schon machen, war bisher nur zu geizig, und für die meisten gibts ja genug hacks, da ist das kaufen unnötig :P)

                            Also nochmal vielen dank, habt mir sehr geholfen


                            Und ne user haben gar kein zugriff darauf was darin steht. Da sie die daten da nicht ändern können (ausser durchs viele posten eine +1 dazu XD)

                            Kommentar


                            • #15
                              Noch als Nachtrag zu dem eval-Ansatz: Du kannst dir auch alle Parsertokens mit token_get_all holen und prüfen, ob ausschließlich erlaubte Operatoren und Ziffern verwendet werden. Dann kannst du auch locker eval verwenden.

                              Kommentar

                              Lädt...
                              X