Sven Rautenberg: Strings vergleichen

Beitrag lesen

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