Moin,
aus aktuellem Anlass, wollte ich mal einen "bug" veroeffentlichen, welcher vor paar Jahren auch mal in meinem Itemshop vorhanden war.
In vielen Pub Systemen, welche mit Lua geschrieben wurden, ist er immer noch vorhanden und wird von einigen gerne ausgenutzt.
Wenn wir bei dem Beispiel mit dem Itemshop bleiben, dann war es dadurch moeglich, umsonst Items zu "kaufen".
Es wird z.B. statt einer Zahl der Wert "NaN" (Not a Number) vom Client, fuer die Anzahl an Items die gekauft werden sollen, gesendet.
In der Quest wird nun tonumber() ausgefuehrt und "NaN" bleibt "NaN".
Findet nun z.B. ein Vergleich statt, kommt immer false raus:
Das ist ja erst mal nicht ganz so schlimm.
Wird allerdings z.B. eine Rechnung durchgefuehrt und danach ein Vergleich, ob die Coins reichen, dann haben wir ein Problem:
- cmd = "NaN" --(sendet "NaN" statt einer Zahl)
- amount = tonumber(cmd) -- enthaelt nun NaN
- mycoins = 0 -- Die Anzahl an Coins aus der Coins Spalte der Account Tabelle
- itemPrice = 1000 -- Preis des Items im Itemshop
- realPrice = itemPrice*amount -- 1000 * NaN => NaN
- if mycoins < realPrice then print'Leider besitzt du nicht genug Coins.' return end -- FALSE (0 < NaN)
- -- Zwar nicht genug Coins, aber weiter gehts, da der Vergleich false ergeben hat.
- -- Item geben.
- -- Item wurde mit 0 Coins erworben.
Hier noch ein Link dazu:
Bitte melden Sie sich an, um diesen Link zu sehen.
Ein Script zum Testen (z.B. auf Bitte melden Sie sich an, um diesen Link zu sehen. unter Lua):
- -- cmd ist der Wert, der von dem Client gesendet wird. z.B. eine Anzahl an Items die man kaufen moechte. Rechnet man nun mit diesem Wert weiter und sendet statt einer Zahl z.B. NaN, inf, -inf, ...
- cmd = "200"
- --cmd = "NaN" -- kommentar entfernen zum testen (sendet "NaN" statt einer Zahl)
- amount = tonumber(cmd)
- -- mycoins ist die Anzahl der coins, welche z.B. in der Account Tabelle in der Coins Spalte stehen
- mycoins = 1000
- -- mycoins = 0 -- kommentar entfernen zum testen (setzt vorhandene coins auf 0)
- itemPrice = 100
- if amount > 200 then print'Die maximal Anzahl betraegt 200.' return end
- if amount < 1 then print'Die minimale Anzahl betraegt 1.' return end
- realPrice = itemPrice*amount
- if mycoins < realPrice then print'Leider besitzt du nicht genug Coins.' return end
- newCoins = mycoins-realPrice
- print('set new coins in db '..newCoins)
- print 'give item'
Wie es z.B. behoben werden kann:
Mfg Ente