mmofacts.com

Wie teste ich mein Game auf Injection Gefahr?

gepostet vor 18 Jahre, 5 Monate von mikesh
Hi!
Ich entwickle gerade die 2. Version meines Games (Dragon-Masteronline.de) und habe einen User, der seltsame Vorgänge zu verursachen scheint. Userrechte in Gilden verändern sich, er zahlt Gold aus ohne es zu dürfen usw. ...
Jetzt interessiert mich natürlich, wie ich solche Fälle nachstelle, weil ich meiner Meinung nach alles nötige dagegen getan habe ?!?...
Hoffe ihr könnt mir da weiter helfen
MfG
mikesh
gepostet vor 18 Jahre, 5 Monate von woodworker
da gibts ein paar einfache fragen:
Prüfst du alle Werte die vom User kommen auf Plausibilität?
z.B. Überweisungswerte können kein negativen Wert enthalten.
Escapst du ALLE Werte die du zur Datenbank schickst?
Alle werte auch die du selber schreibst und nicht vom User kommen
Gibst du irgend wo ungeprüft Werte vom User einfach wieder aus?
Dies kann zu XSS Angriffen führen also immer htmlspecialchars nutzen oder wenigstens den Inhalt überprüfen
Das sind die Grundlegendensten Sachen die man beachten sollte
gepostet vor 18 Jahre, 5 Monate von friedenspanzer
Du hast imo zwei Möglichkeiten:
1. Versuch in deinem eigenen Game zu cheaten ohne Ende. Schließlich wirst du dich selber nicht deswegen Sperren ^^ (außerdem kannst du dir ja alles zu unrecht erworbene wieder aus der DB wegnehmen)
2. Such dir ein paar Tester die das für dich tun. Sollte wohl die bessere Möglichkeit sein, weil diese genau die Mittel und Kentnisse haben die andere Spieler auch haben. Diese Tester sollten allerdings niemand sein, der auch vorher schon gespielt hat, da dann die Gefahr groß ist, das sie einen Exploit oder sonstwas auch wirklich ausnutzen.
Hoffe sowas in der Art wolltest du wissen
[EDIT] War wohl wieder zu langsam, sind aber zwei Möglichkeiten deine Frage zu beantworten
gepostet vor 18 Jahre, 5 Monate von mikesh
danke schonmal für die beiden (guten) Antworten...
wie sähe denn ein Angriff aus (die typischen negativ-Wert-abfragen sind drin, alle eingaben werden mit addslashes behandelt) ... ?
MfG
mikesh
*edit*
Bestimmte Codebereiche (z.B. Gildenauszahlung) werden nur durchlaufen, wenn jemand auch tatsächlich die Rechte dazu hat (frisch aus der Datenbank gelesen per userid aus der Session)
...
gepostet vor 18 Jahre, 5 Monate von knalli
Naja.. wenn du zB ein Query in einem miserablen Code hast wie
UPDATE rohstoffe SET gold=$a WHERE userid=$b

kann man folgendes machen:
1. Das Script mehrfach ausführen; dadurch, dass du nicht überprüfst, ob der alte Goldwert übereinstimmt (oder gar nicht mehr genug Gold da ist!!) kann man Gold "erschaffen".. lässt sich auch auf Geld übertragen. Alles mögliche.
2. Wenn du nicht abfragst, ob $a wirklich eine Zahl ist, kann da auch ein SQL-Fragment stehen.. z.B.
$a = gold, erz=100000

Nun brauchst du nur noch zu resubstituieren..
Gibt noch ne andere Handvoll von Möglichkeiten, dir mir jetzt nicht einfallen. Diese Fälle oben sollten aber auf jeden Fall immer geprüft werden. Andere Finge sind teilweise fallspezifisch..
=>

$a = $a>0 ? (int) $a : 0;
$b = (int) $b;
$sql = 'UPDATE rohstoffe SET gold=(gold-'.$a.') WHERE gold >= '.$a.' AND userid='.$b.';';
Sollte mir ein Fehler unterlaufen sein, sehe ich Korrekturen gerne.. ist schon bisl spät ^^
Nachtrag: Das gilt jetzt natürlich nur für Zahlen, Strings muss man in irgendeiner Form escapen bzw umwandeln..
gepostet vor 18 Jahre, 5 Monate von BLUESCREEN
Außerdem sollten alle Werte in Queries in ' eingeschlossen werden.
also
"SET `bla`='$a'"

statt
"SET `bla`=$a"

gepostet vor 18 Jahre, 5 Monate von knalli
Bei reinen Zahlen (das habe ich ja oben abgefangen) ist das aber nur noch guter Stil, oder nicht?
gepostet vor 18 Jahre, 5 Monate von Kampfhoernchen
1. Immer fleißig escapen (man kanns net oft genug sagen)
2. Code selbst und von einem externen überprüfen lassen
3. Lustiges Parameter, Cookie und Formular-Manipulieren, bis die Tastatur raucht.
gepostet vor 18 Jahre, 5 Monate von Klaus
1. wir haben PHP-Hervorhebung
2. statt Vars auf negative Werte zu testen kann man einfach den Betrag nehmen. Dadurch geht der Schuss für den Cheater nach hinten los.

$a = $a>0 ? (int) $a : 0;
$b = (int) $b;
$sql = 'UPDATE rohstoffe SET gold=(gold-'.$a.') WHERE gold >= '.$a.' AND userid='.$b.';';
3. Was ist der unterschied ziwchen "(int) $omg" und "intval($omg)"?
gepostet vor 18 Jahre, 5 Monate von Kallisti
intval ist nicht aufs 10er System beschraenkt, sondern ermoeglicht Konvertierung zwischen den Zahlensystemen.
de3.php.net/intval
gepostet vor 18 Jahre, 5 Monate von Crasher
$a = $a>0 ? (int) $a : 0;

warum nicht einfach
abs($a);

Crasher
gepostet vor 18 Jahre, 5 Monate von Itchy
wenn, dann
(int)abs( $a );

// oder
intval( abs( $a ) );
// abs kann nämlich auch float zurückgeben, wenn ein float reinkommt
gepostet vor 18 Jahre, 5 Monate von knalli
Wie macht man den PHP Syntaxt? Mal ganz dumm gefragt?
Soweit ich weiß, ist das Casten effektiver (Zeit) als die Funktion.. und technisch gesehen muss für abs auch erstmal eine Typunwandlung gemacht werden.. auch wenn PHP keine Typen kennt, kennt es Typen.
gepostet vor 18 Jahre, 5 Monate von gorgo
Ich hab in meiner html klasse eine eigene requestfuntion gebastelt die einfach per min,max gefüttert schon beim request auf Daten auf gültigkeit prüft.
Dort kann man denn auch glech eine logfunktion einbauen falls man wissen will was alles so versucht wird zu schicken.
also anstatt if isset... und $xy=$_REQUEST[`urlvar...
$xy=$page->getreqint('urlvar',0,10); // integerwert oder false
if ($xy) {....
Die funktion selbst weist ja was drin sein musst. steht auch genug zu da inzwischen. Würd das aber schon so vorschlagen (muss ja nicht eine extra klasse sein sondern zur not reicht eine funktion) da man ständig Daten empfängt und es letztendlich blödsinn wär jedesmal das manuell umzusetzen.
ansonnsten würd ich jetzt einfach in deinem Fall mal einfach den Inhalt von $_REQUEST etc. mitloggen falls du nicht weist wo du eventuell was übersehen hast.
gepostet vor 18 Jahre, 5 Monate von Kampfhoernchen
Original von knalli
Wie macht man den PHP Syntaxt? Mal ganz dumm gefragt?

echo "Mit dem [ PHP ] Tag";

Auf diese Diskussion antworten