Minus Bug

Aus VMS1 Tutorial

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

User/Besucher/Client Eingaben

Bei Flash-Spielen ist es so, dass aus dem Flash Film heraus PHP-Dateien aufgerufen werden, und dabei mitunter Werte vom Benutzer (Client) an den Server geschickt werden.

Bei PHP gibt es dafür verschiedene Möglichkeiten, diese "Eingaben" im Script zu verarbeiten. Auf jeden Fall sollte auf dem Server die PHP-Einstellung register_globals auf OFF stehen! (Ansonsten gar nicht erst weiterlesen, sondern diesen "Fehler" beheben!)

Wie man das raus findet, kann man bei PHP Konfiguration nachlesen.

In PHP gibt es dann einige superglobale Variablen (PHP:Superglobals), davon sind für unseren Artikel hier nur

<?php 
$_GET;
$_POST;
$_REQUEST;
?>

interessant.

Theoretisch könnten hier auch

<?php
$HTTP_GET_VARS;
$HTTP_POST_VARS;
?>

stehen, deren Verwendung deutet aber schon mal auf ein sehr altes Script hin, also hier ist dann besondere Vorsicht geboten!

Usereingaben prüfen

Generell gilt, dass man alle Eingaben, die der User macht, prüfen muss, da User gerne mal was Falsches aus versehen oder mit schlechten Hintergedanken eingeben! Zu diesen Eingaben gehören nicht nur "sichtbare", also Formulare etc., sondern auch "unsichtbare", wie eben Einsätze in Flash-Spielen.

Diese Prüfung geschieht meist dadurch, dass man entweder den "Typ" oder die Länge der Eingabe(n) prüft, oder sg. reguläre Ausdrücke darauf anwendet, oder PHP Funktionen wie addslashes() oder htmlspecialchars() oder auch mysql_real_escape_string() darauf anwendet.

Slots auf ihre Sicherheit hin prüfen

Zuerst einmal muss man die PHP Datei finden, in dem das Spiel "stattfindet", meist game.php, slot.php etc.

An sich leicht zu finden, da dort auch die Rallyes eingebaut werden müssen sowie die Funktion refumsatz() vorhanden ist.

Als nächstes die Zeile finden, wo der Einsatz eingelesen wird, (siehe oben:User/Besucher/Client Eingaben), bspw.:

<?php
//einige Zeilen Code am Anfang
$einsatz = $_GET['einsatz'];
//restlicher Code
?>

Hier sieht man, wird erstmal keinerlei Überprüfung gemacht, sondern einfach der Wert in der Variablen $einsatz gespeichert, sei es nun ein gültiger Einsatz oder das Wort "Hallo".

Um herauszufinden, was weiter passiert mit dem "Einsatz", startet man im jeweiligen Texteditor eine Suche nach eben der entsprechenden Variable ($einsatz, $pool, $bet, manchmal auch einfach im ganzen Script $_GET['einsatz'] verwendet).

Kommt als nächstes die "Bonitätsprüfung", also ob der User genug Guthaben hat

if($guthaben > $einsatz){

und danach dann schon der Einzug des Einsatzes:

kontobuchung('-',$einsatz,$_SESSION['uid']);

dann wird der Einsatz wohl ohne weitere Prüfung eingezogen.

Eine Überprüfung erkennt man bspw. daran, dass etwas in der Art dasteht:

if($einsatz!=$einsatz1 || $einsatz!=$einsatz2)$einsatz=$einsatz1

oder auch:

if(!in_array($einsatz, $einsaetze))die('&result=error&');

Slots absichern

Die einfachste Methode ist, nach dem der Einsatz in einer Variablen gespeichert wurde, diesen sofort zu überprüfen, indem man in folgendem Code die jeweiligen Einsätze des Spiels auswechselt:

<?php
//einige Zeilen Code am Anfang
$einsatz = (int)$_POST['bet'];
if(!in_array($einsatz, array(100,1000,2000,5000) ) )die(); //neue zeile, hier einsätze auswechseln
//restlicher Code

Funktioniert natürlich analog in dem Fall, dass in der ganzen Datei die $_GET oder $_POST Variable verwendet wird:

if(!in_array($_GET['pool'], array(100,1000,2000,5000) ) )die();

Zusätzlich sollte immer darauf geachtet werden, Benutzereingaben in das richtige "Format" umzuwandeln. Im Beispiel geschieht dies durch einen "Cast", also eine Typumwandlung, in den gewünschten Datentyp. Im Falle eines Einsatzes ist dies normalerweise immer eine Zahl (int in PHP).

$einsatz = (int)$_POST['bet'];

Dadurch ist gewährleistet, dass in der Variable $einsatz auch nur die Zahleninterpretation der Eingabe steht, und nicht ein beliebieger Text.

Alternativ dazu kann man die Methoden intval(), abs(), round() etc. benutzen, um einen Integer zu erhalten.

Persönliche Werkzeuge