dedlfix: Problem mit PHP Code

Beitrag lesen

Tach!

*Merkwürdig finde ich übrigens, dass Du $service_amount und 100 in Anführungszeichen setzt. Das sind Zahlen, und damit wird gerechnet. Anführungszeichen bewirken, dass der MYSQL Server hin und her konvertieren muss.

Das wird so krass nicht sein. Ein SQL-Statement ist ein String. Zahlen darin werden als Literal in Form von mehreren Ziffernzeichen geschrieben (zuzüglich Dezimalpunkt etc.). Sie müssen also auf alle Fälle geparst werden. Das wird sich nur im Zeitpunkt unterscheiden, zu dem das passiert. Als Zahlenliteral kann es gleich beim Parsen konvertiert werden, als Stringliteral muss es erst dann konvertiert werden, wenn der Kontext INT oder DECIMAL heißt. Je nach Typ ist das auch noch unterschiedlich, so dass eine Zahl in interner Darstellung nach dem Parsen vielleicht nochmal umkodiert werden muss. Es lohnt sich aber hier keinen großen Aufwand zu betreiben, das bekommt das DBMS ganz gut hin, und es wird sich nur bei sehr großen Datenmengen bemerkbar machen, wenn überhaupt. Viel wichtiger ist an dieser Stelle der menschliche Leser, dass der eine verstehbare Semantik vorfindet. Und noch wesentlicher ist, dass der Code keine technischen Fehler enthält. Anfällig für SQL-Injection ist ein solcher Fehler.

Mein Vorschlag wäre, das so zu coden:

Als Prinzipdarstellung, aber nicht als kopierbare Codevorlage. Da fehlt wie im OP sämtliche Kontextbehandlung. Wenn man ein Zahlenliteral schreiben möchte, muss man sicherstellen, dass es ein solches ist und nicht durch eine falsche Nutzereingabe zu Syntaxfehlern oder ungewollten Statementerweiterungen kommt. PHPs intval() erzwingt eine Integerzahl, notfalls 0. Notiert man die Zahl als Stringliteral (in Anführungszeichen) gelten dessen Regeln, die aber auch mit intval() und Kollegen eingehalten werden.

   if ($service_type == 'getmoney') {
      $update = "money=money+$service_amount";
   } elseif ($service_type == 'getgold') {
      $update = "gold=gold+$service_amount";
   } elseif ($service_type == 'energyrefill') {
      $update = "energy=100";
   } elseif ($service_type == 'vip') {
      $update = "`role` = 'VIP'";
   }

Wenn der Nutzer so einen komischen Namen hat, wie hans' OR (username='allesmeins' AND betrag > 0) -- dann freut sich allesmeins.

   $succPlayer = mysqli_query($connect,
                              "UPDATE `players` SET $update WHERE `username`='$username'");

dedlfix.