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".
- cmd = "NaN"
- amount = tonumber(cmd)
Findet nun z.B. ein Vergleich statt, kommt immer false raus:
- if amount > 200 then print'Die maximal Anzahl betraegt 200.' return end
- if amount < 1 then print'Die minimale Anzahl betraegt 1.' return end
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"
- amount = tonumber(cmd)
- mycoins = 0
- itemPrice = 1000
- realPrice = itemPrice*amount
- if mycoins < realPrice then print'Leider besitzt du nicht genug Coins.' return end
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 = "200"
- amount = tonumber(cmd)
- mycoins = 1000
- 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'
Alles anzeigen
Wie es z.B. behoben werden kann:
- function IsFinite(num)
- return not (num ~= num or tostring(num) == "inf" or tostring(num) == "-inf" )
- end
- amount = tonumber("123")
- if not IsFinite(amount) then return end
- amount = tonumber("NaN")
- if not IsFinite(amount) then return end
Mfg Ente