Rainer: Strings vergleichen

Hallo,

probiere nun schon über eine Stunde herum Strings zu vergleichen.
Ich habe 2 Strings in 2 Arrays + Vergleichsoperator in Array PT[4]

$V1[0] (Inhalt:abc) - geprüft
$V2[0] (Inhalt:acb) - geprüft
$PT[4] (Inhalt: !=) - geprüft

Hier mal das Scriptstückchen was doch eigentlich "ok" ausgeben müsste:
<?php
$V1[0] = "abc";
$V2[0] = "abc";
$PT[4] = "!=";

if($V1[0] $PT[4] $V2[0]){
echo"error";
}else{
echo"ok";
}
?>

Ich bekomme aber: Parse error: parse error, unexpected T_VARIABLE
Komme nicht darauf wieso das so ist. kann wer einen Deckanstoss setzen?

Gruß Rainer

  1. OK,
    wenn ich den Vergleichsoperator direkt reinschreibe funktioniert es.
    Ich bekomme ihn aber nur aus dem Array PT[4]. Muss das irgenwie maskiert werden - und wenn ja wie?
    <?php
    $V1[0] = "abc";
    $V2[0] = "cba";
    if($V1[0] != $V2[0]){
    echo"error";
    }else{
    echo"ok";
    }
    ?>

    Gruß Rainer

    1. Hi,

      wenn ich den Vergleichsoperator direkt reinschreibe funktioniert es.

      Natürlich, dann liegt ja auch korrekte Syntax vor.
      Im anderen Falle nur eine Aneinanderreihung von Variablennamen, die so nicht erlaubt ist.

      Ich bekomme ihn aber nur aus dem Array PT[4]. Muss das irgenwie maskiert werden - und wenn ja wie?

      Du willst hier Daten als Teil der Programmlogik behandeln.

      Das könnte man mittels eval machen - das ist aber gefährlich, wenn du die Inhalte nicht ganz genau unter Kontrolle hast und weisst, was du tust.

      Eine andere Möglichkeit, wenn die Anzahl möglicher Operatoren, die vorkommen können, begrenzt und definiert ist: Den Operator in einem switch/case-Konstrukt auswerten, und dort dann die jeweilige Vergleichsoperation mit den zwei variablen Vergleichswerten und fest kodiertem Operator vornehmen, und das Ergebnis zurückliefern.

      MfG ChrisB

      --
      Light travels faster than sound - that's why most people appear bright until you hear them speak.
      1. Moin,

        Das könnte man mittels eval machen - das ist aber gefährlich, wenn du die Inhalte nicht ganz genau unter Kontrolle hast und weisst, was du tust.

        Beispiel:

        <?php  
        $V1[0] = "abc";  
        $V2[0] = "cba";  
        $O[0] = "!=";  
          
          
        if(eval($V1[0].$O[0].$V2[0])){  
        echo"error";  
        }else{  
        echo"ok";  
        }  
        ?>
        

        Eine andere Möglichkeit, wenn die Anzahl möglicher Operatoren, die vorkommen können, begrenzt

        SEHR WICHTG!
        Besonders, wenn ein user den operator eingibt. Denn sonst kann jemand einen Code einfügen, wie folgt;

        //BEispiel:

          
        $V1[0] = "abc";  
        $V2[0] = "cba";  
        $O[0] = "!= 5) {} mysql_query(\"DROP DATABASE wichtige_daten\"); if (5 !=";  
          
          
        if(eval($V1[0].$O[0].$V2[0])){  
        echo"error";  
        }else{  
        echo"ok";  
        }  
        ?>  
        
        

        klarer Code wäre dann:

          
        $V1[0] = "abc";  
        $V2[0] = "cba";  
        $O[0] = "!= 5) {} mysql_query(\"DROP DATABASE wichtige_daten\"); if (5 !=";  
          
          
        if("abc" != 5) {}  
          
        mysql_query("DROP DATABASE wichtige_daten");  
          
        if (5 != "cba")){  
        echo"error";  
        }else{  
        echo"ok";  
        }  
        ?>  
        
        

        und schon bist du um ne Tabelle leichter. und das ist nur ein mögliches Beispiel.

        Also Vorsicht!

        Den Operator in einem switch/case-Konstrukt auswerten, und dort dann die jeweilige Vergleichsoperation mit den zwei variablen Vergleichswerten und fest kodiertem Operator vornehmen, und das Ergebnis zurückliefern.

        MfG ChrisB

        MfG,
        èneR

        1. Moin!

          Eine andere Möglichkeit, wenn die Anzahl möglicher Operatoren, die vorkommen können, begrenzt
          SEHR WICHTG!
          Besonders, wenn ein user den operator eingibt. Denn sonst kann jemand einen Code einfügen, wie folgt;

          Das hat nichts mit der Eingabemöglichkeit durch den User zu tun!

          Wo kommt die Variable mit dem Operator denn her? Könnte die irgendwann mal aus einer Information stammen, die direkt vom User beeinflussbar war? Dann ist es egal, ob sie "eingebbar" war oder nicht, denn Angreifer benutzen die vorgegebenen Formulare nicht, sondern manipulieren ihre Inhalte beliebig.

          //BEispiel:

          [code lang=php]
          $V1[0] = "abc";
          $V2[0] = "cba";
          $O[0] = "!= 5) {} mysql_query("DROP DATABASE wichtige_daten"); if (5 !=";

          Dein Beispiel ist zwar dramatisch genug, um das Problem zu demonstrieren, aber du gehst trotzdem viel zu leichtfertig über diese dramatische Sicherheitslücke hinweg.

          Denn auf welche Weise kann man sicherstellen, dass in der Variablen für den Operator wirklich nur einer von mehreren erwünschten Inhalten enthalten ist? Indem man ihn mit einer Liste der erlaubten Inhalte vergleicht!

          Und wenn man eine Liste erlaubter Inhalte hat, dann entfällt automatisch die Notwendigkeit für eval(), denn eine Liste ist vielleicht lang, aber nie unendlich, man kann also für jeden erlaubten Zustand den notwendig auszuführenden Code immer explizit programmieren und muss nicht auf eval() zurückgreifen.

          Und selbst wenn es hier um ein Konstrukt geht, welches mehr als zwei Operanden und einen Operator kombinieren will, kann man dies immer auf die Kombination von zwei Operanden plus Operator zurückführen, indem man (für mathematische Berechnungen beispielsweise) Regeln für den Vorrang von Operatoren hat, oder einfach von vorne nach hinten abarbeitet: Die ersten zwei Operanden und den ersten Operator ausrechnen, das Ergebnis als Operand mit dem dritten Operanden und dem zweiten Operator erneut kombinieren, etc. - solange bis alles abgearbeitet ist.

          - Sven Rautenberg