Attack.php

  • Beste leden,


    Als je bij ons spel iemand aanvalt die bijv. 9 miljard contant hebt staan, kom je zelf in de min te staan als je hebt gewonnen. Weet iemand hoe dit komt? Wij snappen het niet.


    Hier de attack.php:




  • Het is een bekende bug, is mij al vaker opgevallen.
    Die persoon zijn contant geld eens naar 0 zetten, en als het eerlijk geld is, overplaatsen naar de bank.
    Kijk dan eens of het beter is, want heb er zelf ook nog niet een fix voor kunnen vinden.

  • Deze bug zit niet in het script maar in de database. Wanneer een speler hoger komt dan een betaald bedrag dat maximaal is toegestaan door de database komt het geld wat hij teveel heeft in de min. Hierdor komt het dus dat je in de min komt. Dit is op te lossen dfoor van int(255) bigint(255) te maken in de velden waar je grote getallen wilt toelaten.


    Ik hoop dat jullie bijde iets met deze uitleg kunnen.


    Mvg, Luc

  • Hallo Luc,


    Je reactie is nuttig, alleen staat zijn contant al op een bigint, omdat er meer dan 2.147.xxx.xxx contant heeft.
    Is het een normale int, dan had het niet meer dan 2.1 miljard kunnen zijn..
    Die fix zal dus ook niet werken.
    Op me oude website had ik hetzelfde, en zette je zijn/haar contant geld naar 0, en zijn/haar contant geld naar de bank, was het gefixt.

  • Je hebt waarschijnlijk al een BIGINT inderdaad. Je kunt de maximale waarde van deze BIGINT verdubbelen door er een UNSIGNED BIGINT van te maken i.p.v. een (standaard) SIGNED. UNSIGNED velden (numeriek) kunnen geen negatieve getallen bevatten, maar daarin tegen wel twee keer zo hoge positieve getallen.


    Voorbeeld:
    Een SIGNED TINYINT loopt van -128 tot 127, een UNSIGNED TINYINT van 0 tot 255.

  • PHP
    <?php
    //Gebruiker 8 miljard contant = naar bank
    if($data->bank >= 8000000000){
    mysql_query("UPDATE users SET contant=contant-'8000000000', bank=bank+'8000000000' WHERE login='" . $data->login . "'");


    Heb even een simpele voorbeeldcode gebruikt, welke je in je config kan stoppen. De query moet je aanpassen als je velden enz. niet zo heten. Op deze manier komt er niet meer dan 8 miljard contant geld in het spel.

  • Of doe dat de user een bericht krijgt als hij bijvoorbeeld meer dan 1 miljard contant heeft.

    PHP
    <?php
    if($data->contant >= 8000000000){
    echo "U kunt pas weer verder spelen waarneer u een deel van het geld op uw bank heeft gezet."; }


    Zoiets?


    Ik heb nu 2 jaar niet meer gescript, dus kunnen fouten in zitten.


    of zoiets?

    PHP
    <?php
    if($def->contant == 80000000){
    echo "U kunt nu niet aanvallen, probeer het later nog eens."; }
  • Of je doet in de Cron-second als ik het goed heb, of iets wat daar op lijkt;

    PHP
    if($data->cash == 800000000000000000000000000){
    mysql_query("UPDATE users SET contant=contant-'8000000000000000000', bank=bank+'8000000000' WHERE login='" . $data->login . "'");


    of in de bank iets van

    PHP
    if($data->cash == 8000000000){
    echo "U heeft te véél geld op zak, uw geld word nu automatisch op uw bank gezet."
    mysql_query("UPDATE users SET contant=contant-'8000000000000000000', bank=bank+'8000000000' WHERE login='" . $data->login . "'");


    Hoop dat je nu geholpen bent?

  • Citaat

    Ja, en dat vinden de spelers ook vast leuk? Je kunt bugs ook gewoon oplossen i.p.v. een work-around maken.


    Inderdaad, want dit is natuurlijk als een paraplu van hout maken.

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!