Ankündigung

Einklappen
Keine Ankündigung bisher.

Dynamische IF-Abfrage?!

Einklappen

Neue Werbung 2019

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

  • Dynamische IF-Abfrage?!

    Hallo zusammen,

    ich bin ganz neu hier und deswegen als aller erstes mal ein Servus in die Runde.
    Dann hoffe ich natürlich das mein Thema an der richtigen Stelle platziert ist, wenn nicht dann möge der Admin es doch bitte an die richtige Stelle schieben. Danke


    So zu meiner Frage (ich versuche es best möglich zu Beschreiben):

    Das PHP-Script:
    PHP-Code:
    foreach ($buttonsArray as $key => $val) {
    /*    In $val['BEDINGUNG'] können verschiedene IF-Cases drin stehen, es muss  aber nicht gesetzt sein. Z.B.      
          - ($user->branche > 0)      
          - (isset($user))      
          - (isset($user) && $user->branche > 0)    
    */    
    if (isset($val['BEDINGUNG']) && $val['BEDINGUNG'] != NULL && !empty($val['BEDINGUNG'])) {
        
    $a 'foo'// Dies ist nur zur verdeutlichung
        
    $ifCase '($a == "asdf")'// Hier steht normalerweiße $val['BEDINGUNG']
    } else {
        
    $ifCase true;
    }
    if (
    $ifCase) {
        echo 
    'if case is true - do something';
    } else {
        echo 
    'if case is false - do something else';
    }

    Obiges Script wird auf verschiedenen Seiten eingbunden und erstellt auf den jeweiligen Seiten verschiedene Buttons.
    Diese Buttons sind im Array $buttonsArray (kommt aus der Datenbank und ist Teil eines JSON Strings) gespeichert. Die Buttons haben dann verschiedene Eigenschaften, zum Beispiel: class, name, value, style, onClick usw. Unteranderem möchte ich noch die Eigenschaft "Bedingung" hinzufügen. In Bedingung steht dann die If-Anweisung, als Beispiel (!empty($a) && $a == 'asdf').
    Ich hab nun schon einiges Ausprobiert und auch einiges gegoogelt, aber leider keine Lösung gefunden. Ich weiß auch nicht ob es überhaupt eine Lösung in der Form von obigem Script gibt. Deswegen meine Frage, gibt es eine Möglichkeit das ich den String, welcher in $ifCase steht dann auch in der if- anweisung auswerte?

    Sicherlich könnte ich auch alles umbauen und in eine Class packen und dort mit Methoden auswerten, dies möchte ich aber vermeiden.

    Ich hoffe ich habe meine Frage verständlich genug erklärt, wenn nicht, dann sagt mir kurz Bescheid dann werde ich versuchen es nochmal anderst zu Beschreiben.

    Ich danke euch schonmal für eure Hilfe und Mühe.
    Grüße
    Twistor

  • #2
    Kannst dir ja mal die Symfony Expression Component anschauen: The ExpressionLanguage Component (Symfony Docs)
    Die Komponente kannst du eigenständig (unabhängig von Symfony) verwenden.

    Hier mal ein einfaches Beispiel:
    PHP-Code:
    use Symfony\Component\ExpressionLanguage\ExpressionLanguage;  

    $expressionLanguage = new ExpressionLanguage();

     class 
    Apple {    
          public 
    $variety;
    }

      
    $apple = new Apple();
    $apple->variety 'Honeycrisp';  

    var_dump($expressionLanguage->evaluate'fruit.variety == "Honeycrisp"',     [ 'fruit' => $apple] )); Return true 

    Kommentar


    • #3
      Manchmal sieht man den Wald vor lauter Bäumen nicht...
      Zeichen32, danke für deine Mühe und dein Beitrag, dieser hat mich tatsächlich auf die Lösung gebracht. Das Stichwort war "evaluate".

      Meine Lösung sieht jetzt wie folgt aus:

      PHP-Code:
      foreach ($buttonsArray as $key => $val) {
      /*    In $val['BEDINGUNG'] können verschiedene IF-Cases drin stehen, es muss  aber nicht gesetzt sein. Z.B.      
            - ($user->branche > 0)      
            - (isset($user))      
            - (isset($user) && $user->branche > 0)    
      */    
      if (isset($val['BEDINGUNG']) && $val['BEDINGUNG'] != NULL && !empty($val['BEDINGUNG'])) {
          
      $a 'foo'// Dies ist nur zur verdeutlichung
          
      $ifCase = eval('return ' $val['BEDINGUNG'] . ';');
          
      //$ifCase = '($a == "asdf")'; // Hier steht normalerweiße $val['BEDINGUNG']
      } else {
          
      $ifCase true;
      }
      if (
      $ifCase) {
          echo 
      'if case is true - do something';
      } else {
          echo 
      'if case is false - do something else';
      }

      Leider kann ich es Code nicht besonders hervorheben aber geändert habe ich die Zeile
      $ifCase = eval('return ' . $val['BEDINGUNG'] . ';');

      Kommentar


      • #4
        If eval() is the answer, you’re almost certainly asking the wrong question.
        eval() ist halt brandgefährlich.
        Ich würde die Bedingungen so abspeichern, dass du sie ohne eval() ausführen kannst.

        Kommentar


        • #5
          Zitat von jonas3344 Beitrag anzeigen
          eval() ist halt brandgefährlich.
          Das ist mir bewusst, aber an der Stelle kann nur Code von Softwareentwicklern eingesetzt werden. Und da der Code durch verschiedene Teststages geht und auf verschiedenen Testservern geprüft wird sehe ich das Risiko als eher minimal an oder täusche ich mich?

          Zitat von jonas3344 Beitrag anzeigen
          Ich würde die Bedingungen so abspeichern, dass du sie ohne eval() ausführen kannst.
          Das heißt du würdest die Speicherung der Bedingung im JSON String anpassen?

          Kommentar


          • #6
            Dass du eval() nicht verwenden solltest. Sondern entweder eine Library verwenden (wie in #2) oder Deine Bedingungen so abspeichern, dass du sie ohne eval() auswerten kannst.

            Jemand der auf irgendwelche Art Zugriff auf Deine Datenbank erhält könnte damit allerlei Unsinn anstellen.

            Kommentar


            • #7
              Zitat von jonas3344 Beitrag anzeigen
              Dass du eval() nicht verwenden solltest. Sondern entweder eine Library verwenden (wie in #2) oder Deine Bedingungen so abspeichern, dass du sie ohne eval() auswerten kannst.

              Jemand der auf irgendwelche Art Zugriff auf Deine Datenbank erhält könnte damit allerlei Unsinn anstellen.
              Wenn er schon Zugriff auf meine Datenbank hat, dann würde Ihn alles andere mehr als das eval() interessieren
              Aber ja, ich geb dir Recht, eval ist gefährlich und kann mittels Exploit ausgenutzt werden, aber wie gesagt ich seh hier eher weniger die Gefahr, da die Werte die im eval() verarbeitet werden
              - nur in einem geschützen Bereich, der auch nur in einem lokalen Netzwerk erreichbar ist eingegeben werden
              - nur von Softwareentwickler eingegeben werden kann
              - auf mehrfachen Testumgebungen geprüft wird bevor es in das Produktivesystem geht

              Aber korrigiert mich gerne wenn ich mich täusche und hier eine falsche Ansicht hab.

              Grüße
              Twistor

              Kommentar


              • #8
                Man sollte nicht argumentieren weshalb man eine potentielle Sicherheitslücke in der Software belässt sondern es einfach nicht tun.

                Kommentar


                • #9
                  Zitat von jonas3344 Beitrag anzeigen
                  Man sollte nicht argumentieren weshalb man eine potentielle Sicherheitslücke in der Software belässt sondern es einfach nicht tun.
                  Das ist ein sehr gutes Argument und hat mich überzeugt Jetzt kann ich mir den frühen Feierabend abschminken.

                  Kommentar


                  • #10
                    SQL ist auch eine potentielle Sicherheitslücke und wird trotzdem nicht aus PHP verbannt. Jeder weis was ein Angreifer alles anstellen kann wenn Nutzereingaben ungefiltert in SQL-Anweisungen eingebaut werden. Das gilt auch für eval() wenn Nutzereingaben ungefiltert direkt oder indirekt mit eval verarbeitet werden.
                    Wird eval() benutzt, müssen vom Grundsatz alle Variablen des inneren Ausdruckes geprüft und entschärft werden. Das kann abhängig vom Einzelfall einfach sein oder sich auch als so aufwendig herausstellen, das ein Formelparser(#2) an dieser Stelle einfacher ist.

                    Kommentar


                    • #11
                      PHP-Code:
                      $ifCase md5($val['BEDINGUNG'].$salt) === $val['BEDINGUNG-HASH'] && eval('return ' $val['BEDINGUNG'] . ';'); 
                      Signaturrrrrrr

                      Kommentar


                      • #12
                        Zitat von Twistor Beitrag anzeigen
                        Obiges Script wird auf verschiedenen Seiten eingbunden und erstellt auf den jeweiligen Seiten verschiedene Buttons.
                        Diese Buttons sind im Array $buttonsArray (kommt aus der Datenbank und ist Teil eines JSON Strings) gespeichert. Die Buttons haben dann verschiedene Eigenschaften, zum Beispiel: class, name, value, style, onClick usw. Unteranderem möchte ich noch die Eigenschaft "Bedingung" hinzufügen. In Bedingung steht dann die If-Anweisung, als Beispiel (!empty($a) && $a == 'asdf').
                        Javascript (bzw. die Client-Seite) ist dafür keine Option?

                        Kommentar


                        • #13
                          Das ganze könntest du auch mit einem Regel-Editor lösen... eine Regel hat normalerweise:
                          • Statement1 (irgend eine Variable oder Funktion)
                          • Operator (ungleich, gleich, enthält, ...)
                          • Statement2 (eine andere Variable oder Funktion)
                          Der Regeleditor könnte dann so aussehen, wie z.B. bei iTunes die Regeln der intelligenten Playlist: https://support.apple.com/de-de/guid...ns3001/windows

                          Damit war ich öfter schon recht erfolgreich und musste kein eval benutzen... vielleicht hilfts ja.
                          Tutorials zum Thema Technik:
                          https://pilabor.com
                          https://www.fynder.de

                          Kommentar

                          Lädt...
                          X