Leider kontrollieren viele BGs bestenfalls die Zeichenlänge von Formfeldern ob das Passwort auch wirklich mindestens 6 Zeichen lang ist. Doch Werte und Gültigkeit von GET-Variablen (URL) oder die Gültigkeit von Formularen finden bei vielen den freien Weg ins Script. Ich möchte daher ein paar Beispiele auflisten und ein paar Gegenmittel präsentieren.
GET-Variablen aus der Adressleiste
Die wohl einfachste Möglichkeit Werte zu ändern ist die Adressleiste des Browsers. Dies kann z.B. eine geänderte Gebäude-ID im Baumenü sein, eine SQL-Injection wo mal eben ein paar neue Datenbankbefehle übermittelt werden oder gar eine geänderte UserID.
Geänderte Werte
Oftmals findet keine Kontrolle statt ob das Schiff oder das Gebäude überhaupt gebaut werden können. Man ändert "buildingid=12" mal eben auf "buildingid=21" und schon baut man etwas ganz anderes. Wenn eine Kontrolle des Variablenwertes stattfindet, dann kontrollieren viele nur ob es sich um eine Zahl handelt, doch viele prüfen nicht ob das Gebäude schon erforscht ist oder ob die Ressourcen vorhanden sind (siehe auch "geänderte Formulare").
SQL-Injections
Dank "magic_quotes" kommt diese Sicherheitslücke immer seltener vor. Viele User versuchen immer wieder Datenbankbefehle an Variablen zu hängen. Man sollte generell alle Variablen auf die Werte prüfen doch grade bei direkten SQL-Eingaben sollte man diese vorher nochmal z.B. mittels "mysql_escape_string() bearbeiten und sichern.
Userkontrolle
Trotz Sessions finden sich noch immer Spiele welche die Userkontrolle z.B. mittels "Userhashes" verwalten. Auch wenn die Codes nur temporär gültig sind so gibt es immerwieder Hacks, da unwissende User in Chats Links (inkl. Code) ausplaudern, welche andere nutzen um z.B. Ressourcen zu verschwenden, Schiffsbewegungen zu initiieren oder sich gar ganz in den Account zu schleichen.
Solche Systeme sollten ggfl. nochmal genaustens kontrolliert und ggfl. überarbeitet werden. Wichtigste Punkte sind aber auf jedenfall eine IP-Kontrolle des Userhashes um Diebstähle (seien sie auch nur von kurzer Dauer) zu vermeiden.
Formulare und POST-Variablen
Neben den "offenen" GET-Variablen gibts aber auch noch POST-Variablen welche manipuliert werden können. Die normale Kontrolle der Usereingaben findet zwar weitestgehend überall statt doch man muss auch dringend Werte Kontrollieren welche nicht vom User eingegeben werden können.
Geänderte Formulare
Dank simpler Tools wie z.B. dem Web Developer (einem Firefox-Plugin, der übrigends sehr zu empfehlen ist) ist es sehr einfach versteckte Formularfelder sichtbar zu machen oder disabled'te Felder zu aktivieren. Bei Formularübermittlungen solltet Ihr euch also nicht darauf verlassen, dass die Werte eines Radio-Feldes korrekt sind, nur weil Ihr bei der Ausgabe die Felder deaktiviert habt wo zu wenig Ressourcen vorhanden sind. Auch hidden-Felder können leicht geändert werden und z.B. Userhash's oder IDs sind ein lohnendes Ziel für Cheater und Buguser. Dies gilt auch für Javascriptbedingte Werte bzw. Kontrollen!
Wertekontrolle der Eingaben
Viele überprüfen bei Variablen nur ob es sich um eine Ganzzahl handelt oder ob das Passwort länger als 6 Zeichen ist. Man sollte bei Zahlen aber wirklich einen genauen Wertebereich prüfen (von bis) und auch Texten ein bestimmten Spielraum geben (Min Max). Select-Variablen und Co sollten ebenfalls überprüft werden - sowohl ob sie vom User ausgewählt werden können bzw. ob die Werte überhaupt exestieren.
Ich wills nochmal sagen. ALLE Daten die vom User an den Server geschickt werden sind potenzielle Fälschungen und müssen überwacht werden. Bei meinen Recherchen zu meinem Cheater-Bericht haben mir viele geschrieben welche solche Lücken in "Ihrem" BG entdeckt haben und diese nutzen. Ihr solltet daher alle Variablen (vor allem GET) genaustens prüfen. Und zwar sowohl auf den übertragenen Wert und ob die Aktion vom User auch ausgeführt werden kann (geänderte Gebäude-ID im Baumenü).
Wie Ihr die Kontrolle vornehmt ist natürlich Euch überlassen. Ich persönlich lasse Werte z.B. mit einer eigenen form_check()-Funktion überprüfen
function getform($name, $type, $start = 0, $ende = 50000, $from = "post") {
if ($from == "post") $var = $_POST[$name];
else if ($from == "get") $var = $_GET[$name];
else return false;
switch($typ) {
case "text":
case "string":
if (self::strlen_utf8($var) >= $min && self::strlen_utf8($var) <= $max) return $var;
else return false;
break;
case "int":
case "integer":
$var = intval($var);
if ($var >= $min && $var <= $max) return $var;
else return false;
break;
case "float":
$var = str_replace(",", ".", $var);
$var = round($var, 2);
if ($var >= $min && $var <= $max) return $var;
else return false;
break;
case "email":
if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $var)) return false;
else return $var;
break;
case "date":
if(!eregi("^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{2,4}$", $var)) return false;
else return $var;
break;
default:
return trim($var);
}
}
formcheck("buildingid", "int", 1, 80);
formcheck("message", "text", 1, 500);
Mit Hilfe dieser Funktion hole ich mir Variablen aus POST oder GET und prüfe diese auf den vorgegebenen Wert. Entsprechend wird die Variable zurückgegeben oder per false ein Fehler ausgegeben.
Ob Ihr nun meine Methode oder eine eigene Funktion entwicklet ist natürlich jedem selber überlassen. Doch ihr müsst die Variablen wirklich kontrollieren!!