Nicole Schönhofer: Operator im Form bestimmen u. einbinden

Hallo!!

Mache mir in letzter Zeit Gedanken darüber ob man nicht auch den Operator ( vielleicht stimmt der Ausdruck nicht, ich meine +,-,*,/ ) nicht in einem form vorher bestimmen kann und daraus resultiert dann der im script angewandte operator.

also
z.B

-...form
<input type="text" name="operator" size...>
..
<input type="submit" value="los!">...

script

$erg = $xy ($operator wie *,/ usw.) $zz;
echo "$erg";

geht sowas? wenn ja, fände ich's spitze wenn mir jemand helfen könnte!

danke!
ciao

nicole

  1. Hallo Nicole,

    geht sowas?

    Nicht direkt. Du kannst aber so etwas machen:

    switch ($operator) {
      case '+':
        $erg = $xy + $zz;
        break;
      case '-':
        $erg = $xy - $zz;
        break;
      case '*':
        $erg = $xy * $zz;
        break;
      case '/':
        $erg = $xy / $zz;
        break;
      case '%':
        $erg = $xy % $zz;
        break;
      default:
        // fehler
        break;
    }

    (Es wären auch eval()-Konstrukte möglich, allerdings halte ich diese für ein zu hohes Sicherheitsrisiko)

    Viele Grüße,
    Christian

    1. Holladiewaldfee,

      (Es wären auch eval()-Konstrukte möglich, allerdings halte ich diese für ein zu hohes Sicherheitsrisiko)

      Man könnte es aber schon auf sichere Art und Weise mit eval lösen:

      if(strlen($op)==1 && strstr('*+-/%', $op)!==false)
       eval('$erg=$bla'.$op.'$blubb');
      else
       echo 'nixgut!';

      Sicher ist eval böse, und sicher ist eval nicht gerade eine schöne Lösung (eval ist nie eine Lösung?!), aber es gibt diese Funktion nunmal, und hier bietet sie sich irgendwie an. Zusammen mit obiger Sicherheitsabfrage sehe ich da kein Problem (bis auf den Stil). Dafür ist die Lösung kompakt und leicht zu erweitern, z.B. um Bitoperatoren oder ähnliches.

      Ciao,

      Harry

      --
        Herbst ist Wanderzeit!
        http://harry.ilo.de/projekte/berge/
      1. Hallo Harry,

        Sicher ist eval böse,

        Ja.

        und sicher ist eval nicht gerade eine schöne Lösung

        Ja.

        (eval ist nie eine Lösung?!),

        Ja.

        Bis hierher kann ich Dir voll und ganz zustimmen. :-)

        aber es gibt diese Funktion nunmal,

        Es gibt auch register_globals, es gibt auch magic_quotes_gpc.

        und hier bietet sie sich irgendwie an.

        Nein.

        Zusammen mit obiger Sicherheitsabfrage sehe ich da kein Problem (bis auf den Stil).

        Ich könnte mit eval() nicht ruhig schlafen...

        Viele Grüße,
        Christian

        1. kurze zwischenfrage, bin noch ziemlich neu in php, aber das geht doch oder?

          if ($a > $b);
          ->>  $e = $a * $b; <<-
            echo "$e";

          ciao!

          1. Hallo,

            if ($a > $b);
            ->>  $e = $a * $b; <<-
              echo "$e";

            Im Prinzip: Ja.
            Aber die Syntax bei IF sieht keine Pfeile vor, dafuer geschweifte Klammern,
            und das Semikolon am Schluss der ersten Zeile ist falsch.

            if ($a > $b)
             {
              $e = $a * $b;
              echo "$e";
             }

            http://www.php.net/manual/de/control-structures.php

            Oder was wolltest Du wissen?
            Ob die Multiplikation richtig geschrieben ist? Ja.
            http://www.php.net/manual/de/language.operators.arithmetic.php

            Gruesse,

            Thomas

        2. Holladiewaldfee,

          und hier bietet sie sich irgendwie an.

          Nein.

          Doch ;)
          Aber: Nur weil es sich anbietet, muß man es noch lange nicht einsetzen. Ich würde es wahrscheinlich auch nicht einsetzen, weil ich eval() auch nicht mag. Aber es mag Leute geben, die haben da kein Problem mit. Wenn diese Leute noch zusätzlich die nötige Kompetenz besitzen, um sicher zu sein, daß sie kein Problem damit haben, dann sollte auch wer anders kein Problem damit haben.

          Zusammen mit obiger Sicherheitsabfrage sehe ich da kein Problem (bis auf den Stil).

          Ich könnte mit eval() nicht ruhig schlafen...

          Ich schon. Wenn ich mit Sicherheit weiß, was meine if-Bedingung davor durchlässt und was sie nicht durchlässt.

          Ciao,

          Harry

          --
            Herbst ist Wanderzeit!
            http://harry.ilo.de/projekte/berge/
      2. ich danke allen für ihre tipps!!

        werde mich mit der switch mal näher auseinandersetzen...

        ciao!
        nicole

        1. Holladiewaldfee,

          werde mich mit der switch mal näher auseinandersetzen...

          Ja, das ist besser.
          Mit der eval-Funktion muß man wirklich aufpassen, vor allem sollte man sich absolut im klaren darüber sein, was man mit dieser Funktion alles anrichten kann und wie man sich dagegen schützt, daß jemand anderes etwas damit anrichtet.

          Die schlechten Beispiele hat Sven ja schon verlinkt.

          Ciao,

          Harry

          --
            Herbst ist Wanderzeit!
            http://harry.ilo.de/projekte/berge/
      3. Hello,

        (Es wären auch eval()-Konstrukte möglich, allerdings halte ich diese für ein zu hohes Sicherheitsrisiko)

        Man könnte es aber schon auf sichere Art und Weise mit eval lösen:

        if(strlen($op)==1 && strstr('*+-/%', $op)!==false)
         eval('$erg=$bla'.$op.'$blubb');
        else
         echo 'nixgut!';

        Eval bindet den Code so in das Script ein, als stünde er genau an dieser Stelle, ähnlich wie include(). Man hat aus dem evaluierten Coder heraus daher vollen Zugriff auf alle Variablen und Funktionen des Scriptes. Wenn man in eval eine Funktion einbindet, ist diese nachher für das Script verfügbar. Wenn man mehrere eval() im Script hat, und diese bringen gleichnamige Funktionen mit, kracht es, da PHP ja leider noch keine Scopes für Funktionen kennt.

        Um aber das Script vor unberechtigtem Zugriff auf Variablen zu schützen, sollte man eval() in eine Funktion verpacken.

        Allerdings bin ich der Meinung, dass eval hier fehl am Platze ist.

        Man sollte hier den Algorithmus zur Erzeugung und Auswertung der "polnischen Notation" benutzen. Wenn der den String nicht vollständig auswerten kann, ist er eben fehlerhaft. Wenn er es schafft, kann PHP über Befehlszeile rechnen...

        Goggle mal nach "polnische Notation"

        Grüße

        Tom

    2. Moin!

      (Es wären auch eval()-Konstrukte möglich, allerdings halte ich diese für ein zu hohes Sicherheitsrisiko)

      Stimme ausdrücklich zu. Es ist schwierig (insbesondere für Anfänger), zu kontrollieren, welche Code-Konstrukte gesendet werden. Mit manipulierten Formularen kann _jeder_ Code gesendet werden,

      Und wenn man nicht aufpasst, dann passiert sowas wie in http://forum.de.selfhtml.org/archiv/2003/6/48684/ mit den (noch harmlosen) Folgen wie in http://forum.de.selfhtml.org/archiv/2003/6/48754/#m265902

      - Sven Rautenberg

      --
      "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
      (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)